阿里云国际代理商:人工智能平台 PAI-Triton Inference Server镜像部署
前提条件
-
与 PAI 同地域的对象存储 OSS Bucket。
-
已训练好的模型文件(如
.pt、.onnx、.plan、.savedmodel)。
快速入门:部署单模型服务
步骤一:准备模型仓库
Triton 要求在对象存储 OSS Bucket 中使用特定的目录结构。
请按以下格式创建目录。
oss://your-bucket/models/triton/
└── your_model_name/
├── 1/ # 版本目录(必须为数字)
│ └── model.pt # 模型文件
└── config.pbtxt # 模型配置文件
关键要求:
-
版本目录必须使用数字命名(
1、2、3等)。 -
数字越大表示版本越新。
-
每个模型都需要一个
config.pbtxt配置文件。
步骤二:创建模型配置文件
创建 config.pbtxt 文件,配置模型的基础信息。
配置参数说明
|
参数 |
是否必选 |
说明 |
|
|
否 |
模型名称。如指定,必须与模型目录名一致。 |
|
|
是 |
模型框架。可选值: |
|
|
是 |
|
|
|
是 |
最大批处理大小。设为 |
|
|
是 |
输入张量配置: |
|
|
是 |
输出张量配置: |
|
|
否 |
指定推理设备: |
|
|
否 |
控制加载哪些模型版本(配置示例见前文 |
platform 和 backend 至少配置一项。
步骤三:部署服务
-
登录PAI控制台,在页面上方选择目标地域。
-
在左侧导航栏单击模型在线服务(EAS),选择目标工作空间,然后单击部署服务。
-
在场景化模型部署区域,单击Triton部署。
-
配置部署参数:
-
服务名称:自定义服务名称。
-
模型配置:配置类型选择对象存储(OSS),填写模型仓库路径(如
oss://your-bucket/models/triton/)。 -
副本数及资源规格按需选择。估算模型部署所需显存您可参考估算大模型所需显存。
-
-
单击部署,等待服务启动完成。
步骤四:启用gRPC(可选)
默认情况下,Triton 在端口 8000 提供 HTTP 服务。如需使用 gRPC:
-
单击服务配置页面右上角的切换为自定义部署。
-
在环境信息区域,将端口号修改为
8001。 -
在服务功能 > 高级网络下,启用gRPC。
-
单击部署。
模型部署成功后即可调用服务。
部署多模型服务
如需在单个 Triton 实例中部署多个模型,只需将多个模型放在同一仓库目录下:
oss://your-bucket/models/triton/
├── resnet50_pytorch/
│ ├── 1/
│ │ └── model.pt
│ └── config.pbtxt
├── densenet_onnx/
│ ├── 1/
│ │ └── model.onnx
│ └── config.pbtxt
└── classifier_tensorflow/
├── 1/
│ └── model.savedmodel/
│ ├── saved_model.pb
│ └── variables/
└── config.pbtxt
部署步骤与单模型相同。Triton 会自动加载仓库中的所有模型。
使用Python Backend自定义推理逻辑
当您需要自定义预处理、后处理或推理逻辑时,可以使用 Triton 的 Python Backend。
目录结构
your_model_name/
├── 1/
│ ├── model.pt # 模型文件
│ └── model.py # 自定义推理逻辑
└── config.pbtxt
实现Python Backend
创建 model.py 文件,定义 TritonPythonModel 类.
当使用Python Backend时,Triton的某些行为会发生改变,请务必注意:
-
max_batch_size失效:config.pbtxt中的max_batch_size参数对Python Backend的动态批处理无效。您必须在execute方法中自行遍历requests列表,手动拼接Batch进行推理。 -
instance_group失效:config.pbtxt中的instance_group无法控制Python Backend使用CPU或GPU。您必须在initialize和execute方法中,通过代码(如pytorch_tensor.to(torch.device("cuda")))显式地将模型和数据移动到目标设备。
还可参考示例,更新配置文件。
部署服务
使用Python backend必须设置共享内存。在填写如下JSON配置并部署。
{
"metadata": {
"name": "triton_server_test",
"instance": 1
},
"cloud": {
"computing": {
"instance_type": "ml.gu7i.c8m30.1-gu30",
"instances": null
}
},
"containers": [
{
"command": "tritonserver --model-repository=/models",
"image": "eas-registry-vpc.<region>.cr.aliyuncs.com/pai-eas/tritonserver:25.03-py3",
"port": 8000,
"prepare": {
"pythonRequirements": [
"torch==2.0.1"
]
}
}
],
"storage": [
{
"mount_path": "/models",
"oss": {
"path": "oss://oss-test/models/triton_backend/"
}
},
{
"empty_dir": {
"medium": "memory",
// 配置共享内存为1 GB。
"size_limit": 1
},
"mount_path": "/dev/shm"
}
]
}
关键JSON配置说明:
-
containers[0].image: Triton官方镜像。请将cn-hangzhou替换为您服务所在的地域。 -
containers[0].prepare.pythonRequirements: 在此列出您的Python依赖库,EAS会在服务启动前自动安装。 -
storage: 包含两个挂载项。-
第一个将您的OSS模型仓库路径挂载到容器的
/models目录。 -
第二个是必须配置的共享内存。Triton Server与Python Backend进程之间通过共享内存
/dev/shm传递张量数据以实现零拷贝,从而最大化性能。size_limit单位为GB,请根据模型和并发量估算所需大小。
-
调用服务
获取服务端点和Token
-
进入模型在线服务(EAS)页面,单击服务名称。
-
在服务详情页签,单击查看调用信息,复制公网调用地址和Token。
发送HTTP请求
端口号配置为8000时,服务支持发送HTTP请求。
发送gRPC请求
端口号配置为8001,并添加gRPC相关配置后,服务支持发送gRPC请求。
注意:gRPC的访问地址和HTTP的不相同,请重新从服务详情页面获取。
调试技巧
启用详细日志
设置 verbose=True 可打印请求和响应的 JSON 数据:
client = httpclient.InferenceServerClient(url=url, verbose=True)
在线调试
可以直接在控制台的在线调试功能中进行测试,请求地址补全为/api/predict/triton_test/v2/models/resnet50_pt/versions/1/infer,Body使用详细日志中的 JSON 请求数据。
发送请求后返回 Status Code 200,响应 Body 中包含 model_version:"1",输出名称为 OUTPUT__0,数据类型为 FP32,shape 为 [1,1000],data 为浮点数数组,表明推理请求成功。
压测服务
以单个数据压测为例,操作步骤如下。更多压测说明请参见服务压测:
-
在压测任务页签,单击添加压测任务,选择已部署的Triton服务,并填写压测地址。
-
数据来源选择单个数据,并参考如下代码将JSON请求体转换为Base64编码的字符串。
import base64 # 已有的 JSON 请求体字符串 json_str = '{"inputs":[{"name":"INPUT__0","shape":[1,3,32,32],"datatype":"FP32","data":[1.0,1.0,.....,1.0]}]}' # 直接编码 base64_str = base64.b64encode(json_str.encode('utf-8')).decode('ascii') print(base64_str)在添加压测任务页面完成以下配置:
-
所属服务:选择目标 Triton 服务。
-
压测地址:路径部分填写为
/api/predict/triton_xxx/v2/models/resnet50_pt/versions/1/infer。 -
单个数据:将上述 Base64 编码结果粘贴至文本框。
-
压测时长上限:300 秒。
-
压测 QPS 上限:64000。
-
常见问题
Q:出现报错:CUDA error: no kernel image is available for execution on the device,怎么办?
出现该报错的原因是镜像版本与GPU的兼容性问题,您可以尝试更换其他GPU型号的规格,如:A10、T4。
Q:使用HTTP调用报错:tritonclient.utils.InferenceServerException: url should not include the scheme,怎么解决?
出现该报错的原因是服务的url填写错误。获取服务端点的格式为:http://17519301*******.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/wen*****(注意,其与gRPC的访问地址不同),请去掉开头的http://。
Q:使用gRPC调用报错:DNS resolution failed for wenyu****.175193***43.cn-hangzhou.pai-eas.aliyuncs.com/:80,怎么解决?
出现该报错的原因是服务的host填写错误。获取服务端点的格式为:http://we*****.1751930*****.cn-hangzhou.pai-eas.aliyuncs.com/(注意,其与HTTP的访问地址不同),请去掉开头的http:// 以及末尾的/,然后在末尾补:80,最终变成:we*****.1751930*****.cn-hangzhou.pai-eas.aliyuncs.com:80。
