本文档介绍了如何在 NVIDIA Triton 推理服务器上实现 AI Platform Prediction 自定义容器。
本文档是面向在 Google Cloud 上设计、构建和维护高性能模型服务平台的机器学习 (ML) 工程师和架构师的系列文章中的一篇:
- AI Platform Prediction:自定义容器概念
- AI Platform Prediction:适用于 NVIDIA Tilton 推理服务器的直接模型服务器设置(本文档)
“AI Platform Prediction:自定义容器概念”中详细介绍了本文档所述的直接模型服务器架构模式,我们建议您先阅读该文档,然后再继续参阅本文档。本文档旨在与笔记本结合使用,将 Tyton 推理服务器与 AI Platform Prediction 中的自定义容器集成。
直接模型服务器架构
直接模型服务器模式直接与模型服务器通信,无需任何中间连接。下图说明了此架构:
如需帮助确定最适合您的使用场景的自定义容器架构,请参阅自定义容器模式。
NVIDIA Triton 推理服务器
Triton 推理服务器是 NVIDIA 的机器学习模型服务器。虽然 Titon 同时在 CPU 和 GPU 上运行,但它旨在通过动态批处理、并发模型执行、模型优先级确定和模型热加载/卸载等高级功能来利用 GPU 的功能。Triton 配备了多个后端来支持各种框架,包括用于扩展功能的自定义后端。如需查看 Triton 推理服务器的架构图,请参阅并发模型执行。
Triton 推理服务器的实例支持服务多个模型或相同或不同的后端框架。每个模型可以具有多个实例。本文档仅关注单个模型。但是,重要的是要确定吞吐量和延迟之间的最佳平衡。除了一定的并发性之外,吞吐量不会增加,但是单个推理延迟会随并发性线性增加。
实现
以下部分介绍了实现自定义容器版本的过程。如果您想要在 Google Cloud 中运行笔记本,请按照 README
文件中的说明进行操作。
REST API 实现
本部分旨在与笔记本 triton-simple-setup-rest.ipynb
同时阅读,后者以只读形式提供。
如需创建模型版本,必须向 AI Platform 提供规范。为了使用 Triton 实现直接模型服务器模式,本文档提供了以下示例 version_spec.json
规范,您可以在笔记本的“创建模型版本”部分中找到该规范。以下规范指示 AI Platform Prediction 如何创建模型版本:
{
"name": "$VERSION_NAME",
"deployment_uri": "$MODEL_BUCKET_PATH",
"container": {
"image": "${REGION}-docker.pkg.dev/$PROJECT_ID/$IMAGE:$VERSION",
"args": ["tritonserver",
"--model-repository=$(AIP_STORAGE_URI)"
],
"env": [
],
"ports": [
{ "containerPort": 8000 }
]
},
"routes": {
"predict": "/v2/models/$MODEL_NAME/infer",
"health": "/v2/models/$MODEL_NAME"
},
"machine_type": "n1-standard-4",
"acceleratorConfig": {
"count":1,
"type":"nvidia-tesla-t4"
},
"autoScale": {
"minNodes":1
}
}
以下是创建模型版本的 REST 请求的一部分:
POST -d @version_spec.json \
...
"${ENDPOINT}/projects/${PROJECT_ID}/models/${MODEL_NAME}/versions"
NVIDIA Tilton 推理服务器的规范和 REST 请求需要以下参数。规范要求可能因所使用的模型服务器而异。
REGION
:容器映像所在的 Google Cloud 区域。VERSION_NAME
:此模型版本的名称,例如v2
。MODEL_BUCKET_PATH
:AI Platform 将模型工件复制到此模型版本的起始位置。PROJECT_ID
:容器映像所在的 Google Cloud 项目的 ID。IMAGE:VERSION
:容器的映像名称和版本。MODEL_NAME
:模型工件中模型的名称(值和名称必须匹配)。在本文档中,您设置一个模型,此值和名称决定了 Triton 对哪些请求运行预测请求。ports
:AI Platform 用于与 Titon 通信的端口。默认情况下,Triton 侦听端口8000
上的 HTTP 请求。machine_type
:对于此实现,该参数为n1-standard-4
和一个nvidia-tesla-t4
GPU。AIP_STORAGE_URI
:创建模型版本时复制模型工件的位置。AI Platform 提供此环境变量。内容来自deployment_uri
。如果模型服务器需要位置来检索模型工件,请使用AIP_STORAGE_URI
而不是deployment_uri
。
gcloud CLI 实现
您还可以使用 Google Cloud CLI 从命令行实现自定义容器版本。以下 YAML 规范(可在笔记本的创建模型版本部分中找到)指示 AI Platform Prediction 如何创建模型版本:
config.yaml:
container:
args:
- tritonserver
- --model-repository=$(AIP_STORAGE_URI)
env: []
image: gcr.io/$PROJECT_ID/$IMAGE:$VERSION
ports:
containerPort: 8000
deploymentUri: $MODEL_BUCKET/path/
machineType: n1-standard-4
routes:
health: /v2/models/$MODEL_NAME
predict: /v2/models/$MODEL_NAME/infer
autoScaling:
minNodes: 1
以下是用于创建模型版本的 gcloud
命令:
gcloud beta ai-platform versions create $VERSION_NAME \
--model $MODEL_NAME \
--accelerator count=1,type=nvidia-tesla-t4 \
--config config.yaml
如需详细了解可用的规范参数,请参阅创建模型版本。
准备推断请求
Triton 推理服务器版本 20.06
或更高版本支持 KFServing 版本 2,即本文档假定的模型服务协议。本文档介绍了两种载荷结构略有不同的场景:
非二进制数据:KFServing 版本 2 指定了 JSON 格式,用于将预测请求的功能封装在 JSON 正文本身中,如以下示例所示:
POST /v2/models/mymodel/infer HTTP/1.1 Host: localhost:8000 Content-Type: application/json Content-Length: <xx> { "id" : "42", "inputs" : [ { "name" : "input0", "shape" : [ 2, 2 ], "datatype" : "UINT32", "data" : [ 1, 2, 3, 4 ] }, ... ], "outputs" : [ { "name" : "output0" } ] }
二进制数据:KFServing 版本 2 协议未指定二进制数据的处理方式。每个模型服务器创建者都会提供该规范。Triton 对 KFServing v2 协议实现了二进制格式扩展,如以下示例规范所示:
POST /v2/models/mymodel/infer HTTP/1.1 Host: localhost:8000 Content-Type: application/octet-stream Inference-Header-Content-Length: <xx> Content-Length: <xx+19> { "model_name" : "mymodel", "inputs" : [ { "name" : "input0", "shape" : [ 2, 2 ], "datatype" : "UINT32", "parameters" : { "binary_data_size" : 16 } }, { "name" : "input1", "shape" : [ 3 ], "datatype" : "BOOL", "parameters" : { "binary_data_size" : 3 } } ], "outputs" : [ { "name" : "output0", "parameters" : { "binary_data" : true } } ] } <16 bytes of data for input0 tensor> <3 bytes of data for input1 tensor>
Triton 的二进制数据扩展项将二进制数据附加到 JSON 正文之后。请注意添加的标头
Inference-Header-Content-Length
。此标头会告知 Triton 正文的 JSON 部分结束和在哪里开始读取二进制数据。必须计算此偏移量的值。
如需了解创建请求正文的脚本,请参阅本文档附带的代码库。
后续步骤
- 尝试将 Triton 推理服务器容器部署到 AI Platform。
- 探索有关 Google Cloud 的参考架构、图表、教程和最佳做法。查看我们的 Cloud Architecture Center。