AI Platform Prediction:适用于 NVIDIA Triton 推断服务器的直接模型服务器设置

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本文档介绍了如何在 NVIDIA Triton 推理服务器上实现 AI Platform Prediction 自定义容器。

本文档是面向在 Google Cloud 上设计、构建和维护高性能模型服务平台的机器学习 (ML) 工程师和架构师的系列文章中的一篇:

“AI Platform Prediction:自定义容器概念”中详细介绍了本文档所述的直接模型服务器架构模式,我们建议您先阅读该文档,然后再继续参阅本文档。本文档旨在与笔记本结合使用,将 Tyton 推理服务器与 AI Platform Prediction 中的自定义容器集成。

直接模型服务器架构

直接模型服务器模式直接与模型服务器通信,无需任何中间连接。下图说明了此架构:

模型服务器存储在自定义容器中,供 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 部分结束和在哪里开始读取二进制数据。必须计算此偏移量的值。

如需了解创建请求正文的脚本,请参阅本文档附带的代码库

后续步骤