1 个不稳定版本
0.3.0 | 2023年2月18日 |
---|
#545 in 机器学习
225KB
2.5K SLoC
推理
一个用于管理机器学习(ML)模型推理过程的 Rust 库。目前,我们支持与 Triton 推理服务器交互,从 MinIO 模型存储中加载模型。
要求
- rust: 最小支持的 Rust 版本 1.58
- lld 链接器: 用于更快的 Rust 构建。
- 有关特定平台的安装说明和为什么使用 lld 的原因,请参阅 .cargo/config.toml,以及 Rust 性能书籍。
- docker: 容器引擎
- Docker 和支持容器工具包的 GPU 的 NVIDIA 容器工具包。
- 可以通过更改
triton
服务在docker compose
中的资源预留,以避免对 NVIDIA GPU 的需求...根据您尝试服务的模型是否已经针对仅 GPU 推理进行了编译/优化,结果可能会有所不同。
- 可以通过更改
- docker compose: 多容器编排。注意:
docker-compose
现已弃用,而 compose 功能已集成到docker compose
命令中。要与现有的 docker 安装一起安装,请运行sudo apt-get install docker-compose-plugin
。 参考。 - protoc: Google Protocol Buffer 编译器。需要构建 protobuf 以绑定到 Triton gRPC 服务器。
对于基于 Debian 的 Linux 发行版,您可以使用以下命令安装 inference
的依赖项(除了 Docker 和 NVIDIA 容器工具包,需要如上所述的特殊存储库配置)
apt-getinstall clang build-essential lld clang protobuf-compiler libprotobuf-dev zstd libzstd-dev make cmake pkg-config libssl-dev
inference
在 Ubuntu 22.04 LTS 上进行了测试,但欢迎提交修复 Windows 或 MacOS 问题的拉取请求。
快速入门
- 克隆仓库:
git clone https://github.com/opensensordotdev/inference.git
- 确保已安装所有要求,特别是lld链接器和
protoc
!否则inference
将无法构建!
make
:下载最新的Triton Inference Server Protocol Buffer文件和Triton样本ML模型docker compose up
:启动MinIO和Triton容器以及监控基础设施
- 如果您有可用的GPU,请取消注释
inference.triton
服务在docker-compose.yaml
中的以下部分。为了使您的GPU与Triton协同工作,主机操作系统上的CUDA版本和Triton期望的CUDA版本必须兼容。deploy: resources: reservations: devices: - driver: nvidia capabilities: [gpu]
- 如果您没有GPU,请取消注释该部分
- 将
sample_models
目录的内容上传到models
存储桶,通过localhost:9001
上的MinIO Web UI cargo test
:验证所有cargo测试通过
模型检查
https://127.0.0.1:8000/v2/models/simple
将打印模型名称以及设置输入和输出的所需参数。
勘误表
gRPC设置
proto文件夹将包含协议缓冲区。由于model_config.proto
由grpc_service
包含,因此仅在build.rs中引用了grpc_service.proto
。来自tonic的生成代码在inference.rs
中
- Json在8000端口提供服务
- gRPC调用在8001上提交
- Prometheus指标在8002上
多路复用Tonic通道
向gRPC服务提交请求需要一个对Client的不可变引用。这阻止您将单个Client传递给多个任务,并为异步代码创建瓶颈。
通过将同步资源封装在结构体中并使用异步消息传递来访问它来隐藏这一点可能有助于一些用户,但这仍然没有解决核心问题。
虽然可以创建一个包含多个Client<Channel>
的连接池并将该池隐藏在通过异步消息传递访问的结构体中,但这很复杂。
在TritonClient结构体中存储一个tonic.transport.Channel
也是不可行的...它要求结构体实现一些神秘的内部tonic特质。tonic.transport.Channel.
似乎标准的做法是将单个主Client存储在结构体中,然后提供一个函数,该函数返回Client的克隆,因为克隆客户端成本低。
这种方法的局限性可能是gRPC服务器通常可以多路复用的连接数有限(许多地方抛出的数字是100)。参见gRPC性能最佳实践。
tonic
似乎有一个默认缓冲区大小为1024。来源:DEFAULT_BUFFER_SIZE
channel/mod.rs
如果您有多个Triton pod并且想要发现哪些是活跃的以及更新端点列表,这可能最终会很有用grpc负载均衡,github。
不清楚底层是否有一个连接池,或者它们是如何连接到多个服务器的?
替代实现/灵感
DALI集成
依赖
~22–30MB
~392K SLoC