模型推理运行时-Triton-Torchscript

type
status
date
slug
summary
tags
category
icon
password
网址
虽然Python在许多需要动态性和快速迭代的场景中是一种合适且首选的语言,但在同样多的情况下,Python的这些特性反而成为了不利因素。生产环境就是一个典型的例子 - 在这个需要低延迟和严格部署要求的领域中,C++往往是首选语言。以下示例将概述PyTorch提供的路径,说明如何将现有的Python模型转换为可序列化的表示形式,使其能够在Triton推理服务器等纯C++环境中加载和执行,无需依赖Python。

设置

  1. 确保已安装KServe
  1. nvcr.io跳过标签解析,因为解析triton推理服务器镜像摘要需要认证
    1. 增加进度截止时间,因为拉取triton镜像和大型bert模型可能超过默认的120秒超时时间,此设置需要knative 0.15.0+版本

      导出为Torchscript模型

      从Python到C++的PyTorch模型转换过程是通过Torch Script实现的,这是一种可以被Torch Script编译器理解、编译和序列化的PyTorch模型表示形式。如果你从使用原生eager API编写的现有PyTorch模型开始,首先必须将模型转换为Torch Script。
      通过追踪转换上述模型并将脚本模块序列化到文件中

      将训练好的模型存储在云存储的模型仓库中

      一旦模型被导出为TorchScript模型文件,下一步就是将模型上传到GCS存储桶。Triton支持加载多个模型,因此它需要存储桶中的模型仓库遵循特定的布局要求。
      例如,在你的模型仓库存储桶gs://kfserving-examples/models/torchscript中,布局可以是
      config.pbtxt定义了提供模型所需和可选信息的配置。最基本的模型配置必须指定名称、平台、最大批处理大小、输入和输出。由于TorchScript模型中输入和输出没有名称,配置中输入和输出的name属性必须遵循特定的命名约定,即"__"。其中可以是任何字符串,指的是相应输入/输出的位置。这意味着如果有两个输入和两个输出,它们必须命名为:INPUT__0INPUT__1OUTPUT__0OUTPUT__1,其中INPUT__0指第一个输入,INPUT__1指第二个输入,以此类推。
      instance_group提供模型的多个实例,以便可以同时处理该模型的多个推理请求。
      要在GPU上调度模型,您需要将instance_group更改为GPU类型
      更多详细信息,请参考triton模型配置

      使用HTTP端点进行推理

      创建推理服务

      使用上述指定的模型仓库URI创建推理服务yaml。
      警告
      设置OMP_NUM_THREADS或MKL_NUM_THREADS环境变量对性能至关重要,这些环境变量用于控制TorchScript模型推理的内部运算并行度,CPU线程数默认为CPU核心数。请参考CPU线程处理和TorchScript推理了解更多详情。
      kubectl
      预期输出

      使用curl进行预测

      第一步是确定入口IP和端口并设置INGRESS_HOSTINGRESS_PORT
      最新的Triton推理服务器已切换到使用KServe预测V2协议,因此输入请求需要遵循V2模式,并指定数据类型和形状。
      预期输出
       
       

      运行性能测试

      QPS速率--rate可以在perf.yaml中进行修改。

      使用gRPC端点进行推理

      创建推理服务

      创建推理服务yaml并暴露gRPC端口,目前只允许暴露一个端口,可以是HTTP或gRPC端口,默认暴露HTTP端口。
      应用gRPC InferenceService yaml后,当InferenceService就绪时,您就可以使用tritonclient Python库调用模型。

      使用grpcurl进行预测

      在gRPC InferenceService就绪后,可以使用grpcurlInferenceService发送gRPC请求。
      gRPC API遵循KServe预测V2协议。
      例如,可以使用ServerReady API检查服务器是否就绪:
      预期输出
      ModelInfer API接受遵循grpc_predict_v2.proto文件中定义的ModelInferRequest架构的输入。注意,这个输入文件与之前curl示例中使用的不同。
      预期输出
      输出张量的内容被编码在rawOutputContents字段中。它可以被base64解码并根据给定的数据类型和形状加载到Numpy数组中。
      另外,Triton还提供了Python客户端库,其中包含许多示例,展示了如何与KServe V2 gRPC协议进行交互。

      为推理服务添加转换器

      Triton Inference Server需要张量作为输入数据,当用户发送原始格式的请求时,在进行预测调用之前通常需要预处理步骤。转换器组件可以在推理服务规范中指定,用于用户实现的预处理/后处理代码。用户负责创建一个继承自KServe Model基类的Python类,该类实现preprocess处理程序,将原始输入格式根据V2预测协议转换为张量格式,postprocess处理程序用于将原始预测响应转换为更友好的响应格式。

      实现预处理/后处理函数

      image_transformer_v2.py
      请在此处查看代码示例和Dockerfile

      构建转换器Docker镜像

      创建带有转换器的推理服务

      请使用YAML文件创建推理服务,该文件添加了使用上述构建的Docker镜像的图像转换器组件。
      预期输出

      使用curl进行预测

      转换器不像预测器那样强制执行特定的模式,但一般建议以对象列表(字典)的形式发送:"instances": <value>|<list-of-objects>
      预期输出
      上一篇
      模型推理运行时-AMD
      下一篇
      模型推理运行时-Triton-Tensorflow
      Loading...
      文章列表
      Kserve中文文档
      快速开始
      管理指南
      用户指南
      开发指南
      机器学习概念
      大模型周报