PyTorch是一种深度学习计算框架,可用来训练模型。本文介绍如何通过Triton或TorchServe方式部署PyTorch模型的推理服务。
部署方式
支持通过Triton或TorchServe方式部署PyTorch模型的推理服务,推荐使用Triton方式。
方式一:使用Triton部署PyTorch模型的推理服务
- 完成PyTorch单机训练,且把PyTorch模型转换成Torchscript,具体操作,请参见PyTorch单机训练。
说明 本方式采用的是PyTorch 1.16训练的Bert模型,并把模型转换成Torchscript,存储在PVC的triton目录下,然后通过nvidia triton server
来部署模型。
其中
triton要求的模型目录结构如下:
└── chnsenticorp # 模型名称。
├── 1623831335 # 模型版本。
│ └── model.savedmodel # 模型文件。
│ ├── saved_model.pb
│ └── variables
│ ├── variables.data-00000-of-00001
│ └── variables.index
└── config.pbtxt # triton 配置。
- 执行以下命令,检查集群中可用的GPU资源。
arena top node
预期输出:
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated)
cn-beijing.192.168.0.100 192.168.0.100 <none> Ready 1 0
cn-beijing.192.168.0.101 192.168.0.101 <none> Ready 1 0
cn-beijing.192.168.0.99 192.168.0.99 <none> Ready 1 0
---------------------------------------------------------------------------------------------------
Allocated/Total GPUs of nodes which own resource nvidia.com/gpu In Cluster:
0/3 (0.0%)
从上述输出可知,该集群有3个GPU节点可以用来部署模型。
- 将准备好的模型上传到OSS上。具体操作,请参见上传文件。
- 使用以下YAML文件,创建PV和PVC。
apiVersion: v1
kind: PersistentVolume
metadata:
name: model-csi-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: ossplugin.csi.alibabacloud.com
volumeHandle: model-csi-pv // 需要和PV名字一致。
volumeAttributes:
bucket: "Your Bucket"
url: "Your oss url"
akId: "Your Access Key Id"
akSecret: "Your Access Key Secret"
otherOpts: "-o max_stat_cache_size=0 -o allow_other"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: model-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
- 执行以下命令,使用
nvidia triton server
部署模型。arena serve triton \
--name=bert-triton \
--namespace=inference \
--gpus=1 \
--replicas=1 \
--image=nvcr.io/nvidia/tritonserver:20.12-py3 \
--data=model-pvc:/models \
--model-repository=/models/triton
预期输出:
configmap/bert-triton-202106251740-triton-serving created
configmap/bert-triton-202106251740-triton-serving labeled
service/bert-triton-202106251740-tritoninferenceserver created
deployment.apps/bert-triton-202106251740-tritoninferenceserver created
INFO[0001] The Job bert-triton has been submitted successfully
INFO[0001] You can run `arena get bert-triton --type triton-serving` to check the job status
- 执行以下命令,查看PyTorch模型的部署情况。
arena serve list -n inference
预期输出:
NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS
bert-triton Triton 202106251740 1 1 172.16.70.14 RESTFUL:8000,GRPC:8001
- 执行以下命令,查看推理服务详情。
arena serve get bert-tfserving -n inference
预期输出:
Name: bert-triton
Namespace: inference
Type: Triton
Version: 202106251740
Desired: 1
Available: 1
Age: 5m
Address: 172.16.70.14
Port: RESTFUL:8000,GRPC:8001
Instances:
NAME STATUS AGE READY RESTARTS NODE
---- ------ --- ----- -------- ----
bert-triton-202106251740-tritoninferenceserver-667cf4c74c-s6nst Running 5m 1/1 0 cn-beijing.192.168.0.89
从上述输出可知,通过nvidia triton server
部署模型成功,并提供了8001(GRPC)和8000(RESTFUL)两个API端口。
- 配置公网Ingress。具体操作,请参见创建Ingress路由。
说明 通过
nvidia triton server
部署的推理服务默认提供的是ClusterIP,不能直接访问。您需要为推理服务创建Ingress,具体参数设置如下:
- 命名空间选择inference。
- 服务的端口配置为8501端口(RESTFUL)。
- 路由创建成功后,您可以在路由页面的规则列获取到Ingress地址。

- 利用获取的Ingress地址,执行以下命令,调用推理服务接口。
nvidia triton server
遵循KFServing接口规范。更多信息,请参见API文档Nvidia Triton Server API。curl "http://<Ingress地址>"
预期输出:
{
"name":"chnsenticorp",
"versions":[
"1623831335"
],
"platform":"tensorflow_savedmodel",
"inputs":[
{
"name":"input_ids",
"datatype":"INT64",
"shape":[
-1,
128
]
}
],
"outputs":[
{
"name":"probabilities",
"datatype":"FP32",
"shape":[
-1,
2
]
}
]
}
从上述输出可知您已成功调用推理服务接口,即已成功部署推理服务。
方式二:使用TorchServe部署PyTorch模型推理服务
- 使用torch-model-achiver把PyTorch模型打包为TorchServe需要的.mar格式。更多信息,请参见torch-model-achiver。
- 将准备好的模型上传到OSS上。具体操作,请参见上传文件。
- 使用以下YAML文件,创建PV和PVC。
apiVersion: v1
kind: PersistentVolume
metadata:
name: model-csi-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: ossplugin.csi.alibabacloud.com
volumeHandle: model-csi-pv // 需要和PV名字一致。
volumeAttributes:
bucket: "Your Bucket"
url: "Your oss url"
akId: "Your Access Key Id"
akSecret: "Your Access Key Secret"
otherOpts: "-o max_stat_cache_size=0 -o allow_other"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: model-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
- 执行以下命令部署PyTorch模型。
arena serve custom \
--name=torchserve-demo \
--gpus=1 \
--replicas=1 \
--image=pytorch/torchserve:0.4.2-gpu \
--port=8000 \
--restful-port=8001 \
--metrics-port=8002 \
--data=model-pvc:/data \
'torchserve --start --model-store /data/models --ts-config /data/config/ts.properties'
说明
- image可以是官方镜像,也可以是自定义的TorchServe镜像。
- 参数中
--model-store
的路径需要和您的PyTorch模型的实际路径一致。
预期输出:
service/torchserve-demo-202109101624 created
deployment.apps/torchserve-demo-202109101624-custom-serving created
INFO[0001] The Job torchserve-demo has been submitted successfully
INFO[0001] You can run `arena get torchserve-demo --type custom-serving` to check the job status
- 执行方式一:使用Triton部署PyTorch模型的推理服务的步骤6至步骤10验证推理服务是否成功部署。