MindSpore-Lite适配TritonServer部署
基本介绍
本教程是基于triton作为服务端,mslite作为后端推理框架,适配昇腾环境的方案
在参考使用时,有任何问题,请留言
使用版本:
triton镜像 | nvcr.io/nvidia/tritonserver:24.02-py3 |
CANN | 8.0.RC3 |
mslite | 2.3.1 |
0.前提条件
0.1 登录机器
机器已开通,密码已获取,能通过ssh登录
0.2 检查NPU设备
NPU设备检查:运行npu-smi info命令,返回如下设备npu设备信息。NPU设备型号(Name列)是310P系列
0.3 docker安装
检查docker是否安装:docker -v,如如尚未安装,运行以下命令进行docker安装
yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
配置IP转发,用于容器内的网络访问:
sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf
sysctl -p | grep net.ipv4.ip_forward
0.4 获取镜像
docker pull nvcr.io/nvidia/tritonserver:24.02-py3
docker pull nvcr.io/nvidia/tritonserver:24.02-py3
注:英伟达官方镜像有x86和arm版本,需要在arm机器上拉取镜像,则会自动安装arm版本镜像
0.5 获取CANN包及配套依赖包
可以在官网下载对应版本包:https://www.hiascend.com/developer/download/community/result?module=pt+cann
下载toolkit和kernels的run包即可
Ascend-cann-toolkit_8.0.RC3*_linux-aarch64.run
Ascend-cann-kernels-910b_8.0.RC3*_linux.run
0.6 获取mslite包
2.3.1版本:https://www.mindspore.cn/lite/docs/zh-CN/r2.3.1/use/downloads.html
下载mindspore-lite-2.3.1-linux-aarch64.tar.gz
0.7 使用镜像
docker run -it --net host \
--shm-size=32g \
--ulimit memlock=-1 \
--ulimit stack=67108864 \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
--name {name} \
nvcr.io/nvidia/tritonserver:24.02-py3 \
bash
# 建议先不挂载目录,可以构建好容器后保存镜像方便后续使用
• name:自己给容器起个名字
进入容器:通过容器名称进入(如果创建容器后没有进入)
docker exec -it -u root triton_mslite bash
1. 开始构建
1.1 安装CANN包
在容器外可以通过docker cp命令,将下载CANN包从容器外复制到容器内,命令参考:
docker cp {host_path} {container_id}:{container_path}
# docker cp也可以从容器内复制到容器外
# 先安装toolkit,在安装kernel,两者存在依赖关系
./Ascend-cann-toolkit_8.0.RC3*_linux-aarch64.run --full
./Ascend-cann-kernels-910b_8.0.RC3*_linux.run --install
# 安装过程会先弹出EULA协议,输入"y"接受后即可安装
配置CANN环境
# 每次启动容器都需要执行,配置cann包环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 或者将其加入~/.bashrc,每次启动容器时都会自动配置
1.2 构建triton-mslite后端
在容器外可以通过docker cp命令,将mslite包从容器外复制到容器内/opt目录下
docker cp mindspore-lite-2.3.1-linux-aarch64.tar.gz {container_id}:/opt
在容器内/opt目录下解压mindspore-lite-2.3.1-linux-aarch64.tar.gz
tar –zxvf mindspore-lite-2.3.1-linux-aarch64.tar.gz
执行如下命令配置LD_LIBRARY_PATH
LITE_HOME=/opt/mindspore-lite-2.3.1-linux-aarch64
export LD_LIBRARY_PATH=${LITE_HOME}/runtime/third_party/dnnl:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${LITE_HOME}/runtime/lib:${LITE_HOME}/tools/converter/lib:$LD_LIBRARY_PATH
拷贝mslite到/opt/tritonserver/backends/
cp –r /opt/mindspore-lite-2.3.1-linux-aarch64/tools/providers/triton/mslite/ /opt/tritonserver/backends/
# 每次启动容器都需要执行上述命令配置mslite包环境
# 或者将其加入~/.bashrc,每次启动容器时都会自动配置
在容器内:
## 安装依赖包
pip install decorator sympy scipy attr attrs psutil
chown -R triton-server:triton-server /opt/tritonserver/backends/mslite/
1.3 构建triton model_repo
在容器中新建model_repo目录(位置自选),这里以yolov8 模型为例
mkdir -p model_repository/yolov8/1
将mindir模型从容器外拷贝到该目录下, 将config.pbtxt拷贝到model_repository/yolov8
config.pbtxt 内容如下:
name: "yolov8"
backend: "mslite"
max_batch_size: 8
dynamic_batching {
preferred_batch_size: [1, 4, 8]
max_queue_delay_microseconds: 1000
}
input [{
name: "images"
data_type: TYPE_FP32
dims: [ 3, 640, 640 ]
}
]
output [
{
name: "output0"
data_type: TYPE_FP32
dims: [ 84, 8400 ]
}
]
instance_group [
{
count: 5
kind: KIND_CPU
}
]
parameters [
{
key: "device_type"
value: {string_value: "ascend"}
},
{
key: "device_id"
value: {string_value: "0"}
}
]
关于config.pbtxt配置参数可参考
https://bbs.huaweicloud.com/blogs/411829
关于yolov8模型如何从pt转onnx,onnx转mindir参考
https://support.huaweicloud.com/bestpractice-modelarts/modelarts_aigc_yolov8infer_9091.html
关于如何从onnx转mindir 更多资料参考:
https://www.mindspore.cn/lite/docs/zh-CN/r2.3.1/use/cloud_infer/converter_tool.html
另外关于模型也可以在运行时采取挂载方式,根据业务场景选择即可
2. 打包镜像
完成上面步骤后使用docker commit打包镜像,打包完成后需要重新启动容器,挂载npu设备等
docker commit {container_id} {image_name}:{image_version}
• container_id:刚才构建时的容器id
• image_name:自己给新镜像起个名字
• image_version:自己给新镜像定个版本
3. 启动服务
3.1 启动镜像
完成打包镜像后重新开一个新容器,和上面构建时的容器不同,启动服务需要把NPU设备挂载到容器中
docker run -it \
--privileged \
--shm-size="32g" \
-u root \
-v /etc/localtime:/etc/localtime \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /etc/ascend_install.info:/etc/ascend_install.info \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /var/log/npu/:/usr/slog \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-v {path}:{path} \
--name {name} \
{image} \
/bin/bash
• path:需要挂载到容器内的目录
• name:自己起个容器名称
• image:刚才打包好的镜像的id,或者使用<名称>:<版本>的方式也可以
3.2 启动triton服务
# 启动服务
/opt/tritonserver/bin/tritonserver \
--model-repository /{path}/model_repository \
--grpc-port 9001 \
--http-port 9000 \
--metrics-port 9002
# 端口可以自定义
• path:放置model_repo的位置
如果要打印server详细日志,启动命令中加--log-verbose=1即可
出现下方信息则为启动成功
I0614 08:38:22.900838 535 grpc_server.cc:2519] Started GRPCInferenceService at 0.0.0.0:9001
I0614 08:38:22.901152 535 http_server.cc:4637] Started HTTPService at 0.0.0.0:9000
I0614 08:38:22.942263 535 http_server.cc:320] Started Metrics Service at 0.0.0.0:9002
3.3 测试请求
向triton服务发送请求
python3 grpc_client.py
grpc_client.py 内容如下:
import numpy as np
import tritonclient.grpc as grpcclient
def client_init(url="0.0.0.0:9001",
ssl=False, private_key=None, root_certificates=None, certificate_chain=None,
verbose=False):
"""
:param url:
:param ssl: Enable SSL encrypted channel to the server
:param private_key: File holding PEM-encoded private key
:param root_certificates: File holding PEM-encoded root certificates
:param certificate_chain: File holding PEM-encoded certicate chain
:param verbose:
:return:
"""
triton_client = grpcclient.InferenceServerClient(
url=url,
verbose=verbose,
ssl=ssl,
root_certificates=root_certificates,
private_key=private_key,
certificate_chain=certificate_chain)
return triton_client
def infer(triton_client, model_name,
compression_algorithm=None):
input0_data = np.random.rand(1, 3, 640, 640).astype(np.float32)
inputs = [grpcclient.InferInput("images", [1,3,640,640], "FP32")]
inputs[0].set_data_from_numpy(input0_data)
results = triton_client.infer(
model_name=model_name,
inputs=inputs,
compression_algorithm=compression_algorithm
)
print(results)
# 转化为numpy格式
print("output shape:",results.as_numpy('output0').shape)
if __name__ == '__main__':
import time
client = client_init()
s = time.time()
infer(triton_client=client, model_name='yolov8')
print("grpc infer: {}".format(time.time() - s))
输出推理结果:
4. 常见问题
4.1 ImportError: libhccl.so: cannot open shared object file: No such file or directory. Please check that the cann package is installed. Please run 'source set_env.sh' in the CANN installation path.
这是没有配置cann包环境导致的,运行下方命令配置cann包环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 建议将环境变量配置添加到 ~/.bashrc 中,在进入容器时会自动配置
- 点赞
- 收藏
- 关注作者
评论(0)