菜单

Navi

相关源文件

目的与范围

本文详细介绍了 Navi,一个用 Rust 实现的 Twitter 高性能机器学习服务系统。Navi 作为在 Twitter 推荐基础设施中部署和提供机器学习模型的主要平台。有关模型服务策略的具体信息,请参阅模型服务,有关数据转换过程的详细信息,请参阅数据转换

概述

Navi 是一个为生产环境设计的高性能、极简主义机器学习服务系统。它专注于提供稳定性、可用性和超高性能,同时保持精简的代码库。Navi 提供与 TensorFlow Serving 兼容的 gRPC API,从而实现与现有客户端的无缝集成。

来源: navi/README.md1-9 navi/navi/Cargo.toml6-24 navi/navi/src/lib.rs14-22

架构

Navi 采用插件架构,通过不同的二进制实现支持多种机器学习运行时

  • navi:TensorFlow 运行时(功能最完善)
  • navi_onnx:ONNX 运行时(主要支持字符串输入张量)
  • navi_torch:PyTorch 运行时(实验性)

高层架构

来源: navi/README.md19-24 navi/navi/Cargo.toml6-24 navi/navi/src/lib.rs14-22

关键组件

引导程序

引导程序组件初始化服务器并配置所有必要的组件。它加载指定的机器学习运行时(TensorFlow、ONNX 或 PyTorch)并设置预测服务。

预测服务

预测服务通过 gRPC 接口处理传入的预测请求。它实现以下关键功能:

  1. 模型管理(加载、卸载、版本控制)
  2. 处理批量预测请求
  3. 将请求分派到适当的模型运行时
  4. 将预测结果返回给客户端

队列管理器

队列管理器处理预测请求的异步处理。它维护预测任务队列,并与模型加载器协调,以确保在需要时模型可用。

模型组件

Navi 支持多种模型类型:

  • tf_model:TensorFlow 模型实现
  • onnx_model:ONNX Runtime 模型实现
  • torch_model:PyTorch 模型实现(实验性)

来源: navi/navi/src/lib.rs14-22 navi/README.md11-16

数据流

下图说明了数据流经 Navi 系统的过程:

来源: navi/navi/src/lib.rs145-151 navi/navi/src/lib.rs197-210

模型管理

Navi 为模型实现了版本控制系统,允许同一模型的多个版本同时可用。模型按以下目录结构组织:

models/
  └── model_name/
      ├── version1/ (e.g., 1679693908377)
      └── version2/ (e.g., 1679693908380)

每个模型版本都可以包含一个带有配置参数的 META.json 文件。

Navi 默认支持多达 16 种不同模型,每个模型 2 个版本,由以下常量定义:

MAX_NUM_MODELS: usize = 16
MAX_VERSIONS_PER_MODEL: usize = 2

来源: navi/README.md32-39 navi/navi/src/lib.rs106 navi/navi/src/lib.rs215

数据类型和张量管理

Navi 支持多种输入和输出张量类型:

  • 浮点型(32 位)
  • 整型(32 位和 64 位)
  • 字符串

这些在代码库中通过以下几种枚举类型表示:

  1. TensorReturnEnum:不同张量返回类型的包装器
  2. TensorScores:张量输出的表示
  3. PredictResult:可能的预测结果

来源: navi/navi/src/lib.rs117-123 navi/navi/src/lib.rs154-159 navi/navi/src/lib.rs145-151

与 Twitter 基础设施集成

Dr Transform

dr_transform 组件是一个 Twitter 特有的转换器,它将 BatchPredictionRequest(一种 Thrift 格式)转换为 Navi 可以处理的张量输入。这连接了 Twitter 的内部数据表示与模型服务基础设施。

Segdense

segdense 组件指定了如何从 BatchPredictionRequest 格式中提取特征值。它提供了特征选择和转换的配置。

Thrift BPR 适配器

thrift_bpr_adapter 包含为 BatchPredictionRequest 格式生成的 Thrift 代码,支持预测请求的序列化和反序列化。

来源: navi/README.md21-23 navi/dr_transform/Cargo.toml7-26

指标与监控

Navi 内置支持使用 Prometheus 进行指标收集,可监控以下内容:

  • 请求延迟
  • 模型加载时间
  • 队列大小
  • 预测吞吐量
  • 错误率

这些指标有助于确保系统在生产环境中高效可靠地运行。

来源: navi/dr_transform/Cargo.toml18 navi/navi/Cargo.toml50

在 Twitter 推荐系统中的应用

Navi 通过向关键组件提供机器学习模型,在 Twitter 的推荐基础设施中发挥着关键作用:

  1. Light Ranker:推文候选的初始评分
  2. Heavy Ranker:推文的最终详细评分
  3. Push Service:确定要发送哪些通知

这些客户端通过其 gRPC API 与 Navi 交互,发送预测请求并接收指导内容推荐决策的分数。

来源: navi/navi/Cargo.toml15-24

总结

Navi 是一个专门为 Twitter 生产环境设计的高性能机器学习服务系统。其插件架构支持多种机器学习框架,使得模型能够灵活部署到 Twitter 的推荐系统中。尽管 Navi 侧重于核心功能而非广泛特性,但它优先考虑稳定性、可用性和性能——这些是 Twitter 大规模推荐基础设施的关键要求。