MindSpore-Lite适配TritonServer部署

举报
昇腾适配 发表于 2024/10/25 15:28:57 2024/10/25
【摘要】 本教程是基于triton作为服务端,mslite作为后端推理框架,以yolov8模型为例介绍适配昇腾的方案

基本介绍

本教程是基于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

    注:英伟达官方镜像有x86arm版本,需要在arm机器上拉取镜像,则会自动安装arm版本镜像


0.5 获取CANN包及配套依赖包

       可以在官网下载对应版本包:https://www.hiascend.com/developer/download/community/result?module=pt+cann

       下载toolkitkernelsrun包即可

        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 中,在进入容器时会自动配置

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。