本文详细介绍了 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/README.md19-24 navi/navi/Cargo.toml6-24 navi/navi/src/lib.rs14-22
引导程序组件初始化服务器并配置所有必要的组件。它加载指定的机器学习运行时(TensorFlow、ONNX 或 PyTorch)并设置预测服务。
预测服务通过 gRPC 接口处理传入的预测请求。它实现以下关键功能:
队列管理器处理预测请求的异步处理。它维护预测任务队列,并与模型加载器协调,以确保在需要时模型可用。
Navi 支持多种模型类型:
来源: 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 支持多种输入和输出张量类型:
这些在代码库中通过以下几种枚举类型表示:
TensorReturnEnum:不同张量返回类型的包装器TensorScores:张量输出的表示PredictResult:可能的预测结果来源: navi/navi/src/lib.rs117-123 navi/navi/src/lib.rs154-159 navi/navi/src/lib.rs145-151
dr_transform 组件是一个 Twitter 特有的转换器,它将 BatchPredictionRequest(一种 Thrift 格式)转换为 Navi 可以处理的张量输入。这连接了 Twitter 的内部数据表示与模型服务基础设施。
segdense 组件指定了如何从 BatchPredictionRequest 格式中提取特征值。它提供了特征选择和转换的配置。
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
Navi 通过向关键组件提供机器学习模型,在 Twitter 的推荐基础设施中发挥着关键作用:
这些客户端通过其 gRPC API 与 Navi 交互,发送预测请求并接收指导内容推荐决策的分数。
Navi 是一个专门为 Twitter 生产环境设计的高性能机器学习服务系统。其插件架构支持多种机器学习框架,使得模型能够灵活部署到 Twitter 的推荐系统中。尽管 Navi 侧重于核心功能而非广泛特性,但它优先考虑稳定性、可用性和性能——这些是 Twitter 大规模推荐基础设施的关键要求。