rubix/server

将 Rubix ML 模型部署到生产环境,使用可扩展的独立推理服务器。

资助包维护!
andrewdalpino


README

Rubix Server 是一个库,可以将您的 Rubix ML 模型部署到生产环境。我们的服务器将您的训练好的估计器封装在一个 API 中,可以使用标准协议进行查询。包含一个实时仪表板来监控模型的健康状况和吞吐量。

  • 优化以实现低延迟预测
  • 通过添加更多实例来扩展
  • 通过实时分析仪表板进行监控
  • 对常见威胁和故障模式具有鲁棒性

安装

使用 Composer 安装 Rubix Server

$ composer require rubix/server

Docker 镜像

提供Docker 镜像,可用于快速启动或部署。

需求

  • PHP 7.4 或更高版本

文档

最新文档可以在本 README 中找到。

目录

服务器

Rubix 模型服务器是独立的进程,将估计器封装在一个可以通过网络连接查询的 API 中。由于服务器实现了自己的网络堆栈,因此可以直接从 PHP 命令行界面 (CLI) 运行,无需中间服务器,如 Nginx 或 Apache。

要启动服务器,将训练好的估计器实例传递给 serve() 方法

public function serve(Estimator $estimator) : void
use Rubix\Server\HTTPServer;
use Rubix\ML\Classifiers\KNearestNeighbors;

$server = new HTTPServer('127.0.0.1', 8000);

$estimator = new KNearestNeighbors(5);

// Import a dataset

$estimator->train($dataset);

$server->serve($estimator);

或者,您可以从存储中加载以前训练好的估计器,然后像以下示例中那样提供服务。

use Rubix\ML\PersistentModel;
use Rubix\ML\Persisters\Filesystem;

$estimator = PersistentModel::load(new Filesystem('example.model'));

$server->serve($estimator);

注意:服务器将一直运行,直到进程终止。在失败的情况下,使用进程监视器(如 Supervisor)启动和自动重启服务器是一种良好的做法。

关闭服务器

要优雅地关闭服务器,向进程发送退出信号(SIGQUIT)。要立即关闭,不等待当前连接关闭,可以发送终止(SIGTERM)或中断(SIGINT)信号。

注意:Windows 环境中不使用信号处理。

例如,要优雅地关闭,首先确定服务器的进程 ID (PID),然后将 QUIT 信号发送给它。

$ kill -s QUIT 1234

详细界面

实现详细界面的服务器接受任何 PSR-3 兼容的记录器实例,并开始记录关键信息,例如错误和启动/停止事件。要设置记录器,将 PSR-3 记录器实例传递给服务器实例上的 setLogger() 方法。

use Rubix\Server\Loggers\File;

$server->setLogger(new File('example.log'));

HTTP 服务器

一个暴露 Representational State Transfer (REST) 和 GraphQL API 的 JSON over HTTP 服务器。HTTP 服务器使用普遍的标准进行操作,使其与广泛系统兼容。此外,它还提供自己的基于 Web 的用户界面,用于实时监控服务器。

接口:服务器详细

参数

PHP INI 配置

示例

use Rubix\Server\HTTPServer;
use Rubix\Server\HTTP\Middleware\\AccessLogGenerator;
use Rubix\Server\Loggers\File;
use Rubix\Server\HTTP\Middleware\\BasicAuthenticator;
use Rubix\Server\Services\Caches\InMemoryCache;

$server = new HTTPServer('127.0.0.1', 443, '/cert.pem', [
	new AccessLogGenerator(new File('access.log')),
	new BasicAuthenticator([
		'morgan' => 'secret',
		'taylor' => 'secret',
	]),
], 50, new InMemoryCache(86400), 100);

路由

HTTP 服务器暴露以下资源及其方法。

服务器分析

HTTP 服务器提供了一个自己的高级用户界面(UI),用于暴露其底层的 GraphQL API,提供服务器监控和流量可视化的功能。要访问网络界面,请使用您喜欢的现代网络浏览器访问 http://hostname:port/ui(或者使用安全套接字连接时,请访问 https://hostname:port/ui)。

下面的示例是服务器控制台在暗模式下的截图。

Server Web UI Screenshot

参考文献

  • R. Fielding 等人 (2014)。超文本传输协议 (HTTP/1.1):语义和内容。

服务器中间件

HTTP 中间件是请求处理器(或 控制器)产生的传入 HTTP 请求和传出响应的处理程序。它们允许用户通过在管道中插入额外的逻辑来挂钩到 HTTP 请求/响应周期。

访问日志生成器

使用类似于 Apache 日志格式的格式生成 HTTP 访问日志。

参数

示例

use Rubix\Server\HTTP\Middleware\\AccessLog;
use Rubix\Server\Loggers\File;

$middleware = new AccessLog(new File('access.log'));
[2020-11-04 23:10:57] INFO: 127.0.0.1 "POST /predictions HTTP/1.1" 200 140 - "Rubix ML REST Client/0.2.3"
[2020-11-04 23:11:54] INFO: 127.0.0.1 "POST /predictions/sample HTTP/1.1" 200 96 - "Rubix ML REST Client/0.2.3"

基本验证器

如 RFC7617 所述的 HTTP Basic Auth 的实现。

注意:这种授权策略仅在 HTTPS 上的中间人攻击中是安全的。

参数

示例

use Rubix\Server\HTTP\Middleware\\BasicAuthenticator;

$middleware = new BasicAuthenticator([
	'morgan' => 'secret',
	'taylor' => 'secret',
], 'ml models');

共享令牌验证器

使用在客户端和服务器之间保密的共享密钥来验证传入的请求。它使用带有 Bearer 前缀的 Authorization 标头来指示共享密钥。

注意:这种授权策略仅在 HTTPS 上的中间人攻击中是安全的。

参数

示例

use Rubix\Server\HTTP\Middleware\\SharedTokenAuthenticator;

$middleware = new SharedTokenAuthenticator([
	'secret', 'another-secret',
], 'ml models');

受信任客户端

一个可以访问服务器的客户端白名单 - 所有其他连接将被丢弃。

参数

示例

use Rubix\Server\HTTP\Middleware\\TrustedClients;

$middleware = new TrustedClients([
	'127.0.0.1', '192.168.4.1', '45.63.67.15',
]);

记录器

用于捕获重要服务器事件的 PSR-3 兼容的记录器。

文件

一个简单的只写文件记录器。

参数

示例

use Rubix\Server\Loggers\File;

$logger = new File('server.log', 'example', 'Y-m-d H:i:s');

常见问题解答

在这里,您可以找到对最常问问题的答案。

我该如何运行服务器?

所有模型服务器都是设计为从 PHP 命令行界面(CLI)运行的。模型服务器是长时间运行的后台异步进程,它们处理并发请求并实现自己的网络堆栈,避免需要第三方网络服务器,如 Nginx 或 Apache。

要运行服务器,您可以在命令行中执行包含服务器代码的脚本。

$ php server.php

我能否在同一个主机上运行模型服务器和常规网络服务器?

是的,模型服务器设计为与其他网络服务器(包括其他模型服务器)无缝共存。只需确保每个服务器运行在它自己的唯一端口上。

我该如何扩展推理吞吐量?

由于模型服务器是仅推理的(即它们只支持查询),它们通过在负载均衡器(如 Nginx)后面添加更多实例来水平扩展。

服务器支持压缩吗?

是的,HTTP 服务器支持 Gzip 和 Deflate 压缩方案,用于对静态资产的请求体和响应体进行压缩。

许可证

代码遵循 MIT 许可证,而文档遵循 CC BY-NC 4.0 许可证。