文档首页/ AI开发平台ModelArts/ 最佳实践/ AIGC模型训练推理/ Bert基于DevServer适配MindSpore Lite 推理指导(6.3.910)
更新时间:2024-12-17 GMT+08:00
分享

Bert基于DevServer适配MindSpore Lite 推理指导(6.3.910)

方案概览

本方案介绍了在ModelArts的DevServer上使用昇腾Atlas 300I Duo推理卡计算资源,部署Bert-base-chinese模型推理的详细过程。完成本方案的部署,需要先联系您所在企业的华为方技术支持购买DevServer资源。

本方案目前仅适用于企业客户。

资源规格要求

推荐使用“西南-贵阳一”Region上的DevServer资源和Atlas 300I Duo。

表1 资源规格要求

名称

版本

资源规格

Atlas 300I Duo

PyTorch

2.1.0

驱动

24.1.RC2.3

Python

3.9

CANN

8.0.RC3

MindSpore Lite

2.3.0

OS

arm

获取软件和镜像

表2 获取软件和镜像

分类

名称

获取路径

插件代码包

AscendCloud-6.3.910-xxx.zip软件包中的AscendCloud-CV-6.3.910-xxx.zip

说明:

包名中的xxx表示具体的时间戳,以包名的实际时间为准。

获取路径:Support-E,在此路径中查找下载ModelArts 6.3.910 版本。

说明:

如果没有下载权限,请联系您所在企业的华为方技术支持下载获取。

基础镜像

西南-贵阳一:

swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.0.rc3-py_3.9-hce_2.0.2406-aarch64-snt3p-20240906180137-154bd1b

从SWR拉取。

约束限制

本文档适配昇腾云ModelArts 6.3.910版本,请参考表2的软件包和镜像,请严格遵照版本配套关系使用本文档。

确保容器可以访问公网。

准备容器环境

  1. 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。

    购买DevServer资源时如果无可选资源规格,需要联系华为云技术支持申请开通。

    当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据

  2. SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。
    npu-smi info                    # 在每个实例节点上运行此命令可以看到NPU卡状态 
    npu-smi info -l | grep Total    # 在每个实例节点上运行此命令可以看到总卡数

    如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先释放被挂载的NPU或者联系华为方技术支持。

  1. 检查驱动版本。

    运行如下命令查询驱动版本,回显信息中的“Software Version”字段值表示驱动版本。NPU ID表示设备编号,可通过npu-smi info -l命令查询。

    npu-smi info -t board -i NPU ID

    如果Atlas 300I Duo推理卡的驱动版本低于24.1.RC2.3,请参考升级文档升级驱动(24.1.RC2.3升级操作和24.1.RC2相同),24.1.RC2.3驱动软件包获取地址参考驱动软件包

  2. 检查docker是否安装。
    docker -v   #检查docker是否安装

    如尚未安装,运行以下命令安装docker。

    yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
  3. 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。
    sysctl -p | grep net.ipv4.ip_forward

    如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置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

获取基础镜像

建议使用官方提供的镜像部署服务。镜像地址{image_url}参见表2

docker pull {image_url}

启动容器镜像

启动容器镜像。启动前请先按照参数说明修改${}中的参数。

docker run -it --net=host \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
--shm-size=32g \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /var/log/npu/:/usr/slog \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v ${work_dir}:${container_work_dir} \
--name ${container_name} \
${image_id}  \
/bin/bash

参数说明:

  • device=/dev/davinci0,..., --device=/dev/davinci7:挂载NPU设备,示例中挂载了8张卡davinci0~davinci7,可根据需要选择挂载卡数。
  • ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统,work_dir为宿主机中工作目录,目录下存放着训练所需代码、数据等文件。container_dir为要挂载到的容器中的目录。为方便两个地址可以相同。
  • shm-size:共享内存大小。
  • ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称。
  • ${image_id}:镜像ID,通过docker images查看刚拉取的镜像ID。

容器不能挂载到/home/ma-user目录,此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下,拉起容器时会与基础镜像冲突,导致基础镜像不可用。

driver及npu-smi需同时挂载至容器。

不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。

获取代码并上传

上传推理代码AscendCloud-CV-6.3.910-xxx.zip到宿主机的工作目录中,包获取路径请参见表2。

上传代码到宿主机时使用的是root用户,此处需要在容器中执行如下命令统一文件属主为ma-user用户。

#统一文件属主为ma-user用户 
sudo chown -R ma-user:ma-group  ${container_work_dir} 
# ${container_work_dir}:/home/ma-user/ws 容器内挂载的目录 
#例如:sudo chown -R ma-user:ma-group  /home/ma-user/ws

准备推理环境

  1. 安装transformers,用于转换模型和推理。
    pip install transformers==4.45.2
  2. 获取推理代码。
    cd ${container_work_dir} 
    unzip AscendCloud-CV-6.3.910-*.zip 
    cd Bert/bert_infer/mindspore_lite
  3. 获取bert-base-chinese模型文件。
    mkdir bert-base-chinese
    wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/pytorch_model.bin
    wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/config.json
    wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/tokenizer.json
    wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/tokenizer_config.json
    wget -P bert-base-chinese https://huggingface.co/google-bert/bert-base-chinese/resolve/main/vocab.txt
  4. pt模型转onnx模型。
    python pth2onnx.py ./bert-base-chinese/ ./bert_model.onnx
    python modify_onnx.py ./bert_model.onnx

    该转换脚本用于Fill-Mask 任务,若是其他类型任务请按实际场景修改转换脚本。

  5. onnx模型转mindir格式,执行如下命令,转换完成后会生成bert_model.mindir文件。
    converter_lite --fmk=ONNX --modelFile=bert_model.onnx --outputFile=bert_model --inputShape='input_ids:1,512;attention_mask:1,512;token_type_ids:1,512' --saveType=MINDIR --optimize=ascend_oriented

    动态seq_len场景下需要创建转换配置文件convert_config.ini,将如下内容写入配置文件:

    [acl_build_options]
    input_format="ND"
    input_shape="input_ids:1,-1;attention_mask:1,-1;token_type_ids:1,-1"
    ge.dynamicDims="50,50,50;100,100,100;150,150,150;200,200,200;250,250,250;300,300,300;350,350,350;400,400,400;450,450,450;512,512,512"

    其中input_shape中的-1表示设置动态seq_len,ge.dynamicDims表示支持的seq_len值,可根据实际业务场景选取要支持的seq_len,上面的配置表示模型的三个输入shape支持[1, seq_len],seq_len取值[50,100, …,450,512]。另外需要注意seq_len不能超过模型支持的最大值,本文中下载的bert模型seq_len最大支持512。关于动态batch配置说明详见:https://www.mindspore.cn/lite/docs/zh-CN/r2.3.0/use/cloud_infer/converter_tool_ascend.html

    使用如下转换命令:

    converter_lite --fmk=ONNX --modelFile=bert_model.onnx --outputFile=bert_model_dy --saveType=MINDIR --optimize=ascend_oriented --configFile=convert_config.ini

    使用converter_lite转换模型时,如果报E10001: Value [linux] for parameter [--host_env_os] is invalid. Reason: os not supported, support setting are the OS types of opp package。

    建议在启动容器镜像中通过docker run启动容器时,加上--privileged=true参数。

开始推理

执行如下命令开始推理。

python infer.py --tokennizer_config_path ./bert-base-chinese/ --mindir_model_path bert_model_dy.mindir --onnx_model_path bert_model.onnx --input_text [MASK]京是中国的[MASK]都。

infer.py是NPU上使用MindSpore Lite推理的样例,不同业务场景需根据实际情况做相应修改。infer.py文件预置在AscendCloud-CV-6.3.910-xxx.zip软件包中。

infer.py中包含使用MindSpore Lite在NPU上推理和使用推理onnxruntime在CPU上推理,结果如下图,按顺序展示[MASK]位置最大概率填充的文字。

如果是静态seq_len推理,修改infer脚本中45行max_length 的值为静态seq_len,并屏蔽或者删除25~26行以及46~49行,如下图所示。

相关文档