AES200 容器内推理测试
前提条件
- 宿主机已经安装过Driver和Firmware,本文基于以下驱动和固件测试
软件包 | 配套操作系统版本 | 架构 | 说明 |
---|---|---|---|
Ascend-hdk-310p-npu-driver-soc_6.0.rc1_linux-aarch64.run | OpenEuler 20.03 | Arm | Atlas 200I SoC A1昇腾NPU驱动包(run格式),可以直接在OpenEuler命令行升级 |
Ascend-hdk-310p-npu-firmware-soc_6.0.rc1.run | OpenEuler 20.03 | Arm | Atlas 200I SoC A1昇腾固件安装包(run格式),可以直接在OpenEuler命令行升级 |
Ascend-hdk-310p-npu-firmware-soc_6.0.rc1.hpm | OpenEuler 20.03 | Arm | Atlas 200I SoC A1昇腾固件安装包(hpm格式),可以通过BMC来升级固件 |
Atlas-200i-soc-a1-mcu_3.3.4.zip | - | - | MCU固件zip包(内含MCU固件hpm包),可以通过BMC来升级MCU固件 |
-
需用户在宿主机自行安装docker。
yum install docker
-
重启服务与容器,命令为:
systemctl daemon-reload systemctl restart docker
-
访问官方推理镜像网站
点击获取镜像,注册华为用户,如果有则直接登录。
选择22.0.RC3-mxvision镜像版本,并点击下载,将弹出以下窗口,根据窗口中说明的步骤,下载推理镜像。
-
查看镜像,命令为:
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ascendhub.huawei.com/public-ascendhub/infer-modelzoo 22.0.RC3-mxvision 3933143d0eea 3 weeks ago 6.2GB
-
操作步骤
-
在宿主机执行以下命令查看宿主机HwHiAiUser、HwDmUser、HwBaseUser用户的gid和uid,并记录该gid和uid的取值,如下图所示。
id HwHiAiUser id HwDmUser id HwBaseUser
如果用户安装Driver包时使用**–install-username=username** –install-usergroup=usergroup参数指定了其他非root用户,则需要使用同样的方法记录此非root用户的gid和uid,容器内创建非root用户时,需要使用该gid和uid,确保宿主机和容器内相关进程的非root用户同属组。
查看宿主机HwHiAiUser、HwDmUser、HwBaseUser的gid和uid
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mOcfxtgQ-1672109167880)(https://download.huawei.com/mdl/image/download?uuid=d3e28f04a2a541098116f6b19d3da203)]
-
在宿主机创建并启动容器。
docker run -it --rm -u root \ --device=/dev/davinci0 \ --device=/dev/xsmem_dev \ --device=/dev/event_sched \ --device=/dev/svm0 \ --device=/dev/sys \ --device=/dev/vdec \ --device=/dev/venc \ --device=/dev/vpc \ --device=/dev/davinci_manager \ --device=/dev/spi_smbus \ --device=/dev/upgrade \ --device=/dev/user_config \ --device=/dev/ts_aisle \ --device=/dev/memory_bandwidth \ -v /etc/sys_version.conf:/etc/sys_version.conf:ro \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi:ro \ -v /usr/local/bin/aes200_container_prepare.sh:/usr/local/bin/aes200_container_prepare.sh:ro \ -v /var/dmp_daemon:/var/dmp_daemon:ro \ -v /var/slogd:/var/slogd:ro \ -v /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf:ro \ -v /etc/hdcBasic.cfg:/etc/hdcBasic.cfg:ro \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /sys/fs/cgroup/memory:/sys/fs/cgroup/memory:ro \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /usr/local/Ascend/ascend-toolkit:/usr/local/Ascend/ascend-toolkit \ -v /usr/lib64/aicpu_kernels:/usr/lib64/aicpu_kernels \ -v /usr/lib64/libtensorflow.so:/usr/lib64/libtensorflow.so:ro \ -v /home/HwHiAiUser:/home/HwHiAiUser \ ascendhub.huawei.com/public-ascendhub/infer-modelzoo:22.0.RC3-mxvision /bin/bash -c "/usr/local/bin/aes200_container_prepare.sh; /bin/bash"
其中:
/usr/local/Ascend/driver: 为驱动的安装目录,需要映射到容器中 /usr/local/Ascend/ascend-toolkit: CANN toolkit的安装目录需要映射到容器中,如果客户安装的是nnrt运行环境,则替换为nnrt的安装目录 /home/HwHiAiUser: 此处我为了方便,直接把我的宿主机的HwHiAiUser的Home目录直接映射到了容器,主要是HwHiAiUser目录中有环境变量的配置和从http://www.gitee.com/ascend/samples下载的官方测试代码
这里重点介绍一下容器初始化步骤,每次容器启动时,需要对容器进行初始化,我用aes200_container_prepare.sh来完成以下相应的初始化操作。
a. 在容器内创建相关目录。
mkdir -m 750 /var/driver -m 750 /var/dmp -m 750 /usr/slog mkdir -m 755 /home/drv mkdir -m 750 /home/drv/hdc_ppc -m 750 /var/log/npu/slog
b. 设置环境变量,用于在容器中加载驱动so:
export LD\_LIBRARY\_PATH=/usr/local/Ascend/driver/lib64:${LD\_LIBRARY\_PATH}
其中“/usr/local/Ascend”为默认安装路径,请根据实际情况修改。通过export方式设置环境变量,设置完成后立即生效,只在当前终端使用。
c. 在容器内创建HwHiAiUser、HwDmUser、HwBaseUser用户及属组。
groupadd -g _gid_ HwHiAiUser && useradd -u _uid_ -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && echo ok groupadd -g _gid_ HwDmUser && useradd -u _uid_ -g HwDmUser -d /home/HwDmUser -m HwDmUser && echo ok groupadd -g _gid_ HwBaseUser && useradd -u _uid_ -g HwBaseUser -d /home/HwBaseUser -m HwBaseUser && echo ok
请将上述命令中的gid和uid替换为步骤1中查出的gid和uid值。若返回“ok”,则说明创建成功。
如果用户创建了其他非root用户,请确保该用户所属的属组必须和Driver运行用户所属属组相同;如果不同,请用户自行添加到Driver运行用户属组。
d. 配置HwHiAiUser、HwDmUser、HwBaseUser用户的相关属组信息。
usermod -a -G HwBaseUser HwHiAiUser usermod -a -G HwDmUser HwHiAiUser usermod -a -G HwBaseUser HwDmUser usermod -a -G HwHiAiUser HwDmUser
e. 配置“/var/dmp ”、“/var/driver ”、“/usr/slog”目录属组信息。
chown HwDmUser:HwDmUser /var/dmp chown HwHiAiUser:HwHiAiUser /var/driver chown HwHiAiUser:HwHiAiUser /usr/slog chown HwHiAiUser:HwHiAiUser /home/drv/hdc_ppc chown HwHiAiUser:HwHiAiUser /var/log/npu/slog
f. 启动slogd与dmp_daemon进程。
su - HwHiAiUser -c "export LD\_LIBRARY\_PATH=/usr/local/Ascend/driver/lib64/ && /var/slogd >/dev/null &" su - HwDmUser -c "export LD\_LIBRARY\_PATH=/usr/local/Ascend/driver/lib64/ && /var/dmp_daemon -I -M -U 8087 &"
所以aes200_container_prepare.sh脚本内容如下:
#!/bin/bash mkdir -m 750 /var/driver -m 750 /var/dmp -m 750 /usr/slog mkdir -m 755 /home/drv mkdir -m 750 /home/drv/hdc_ppc -m 750 /var/log/npu/slog export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64:${LD_LIBRARY_PATH} groupadd -g 1000 HwHiAiUser && useradd -u 1000 -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && echo ok groupadd -g 1002 HwDmUser && useradd -u 1002 -g HwDmUser -d /home/HwDmUser -m HwDmUser && echo ok groupadd -g 1003 HwBaseUser && useradd -u 1003 -g HwBaseUser -d /home/HwBaseUser -m HwBaseUser && echo ok usermod -a -G HwBaseUser HwHiAiUser usermod -a -G HwDmUser HwHiAiUser usermod -a -G HwBaseUser HwDmUser usermod -a -G HwHiAiUser HwDmUser chown HwDmUser:HwDmUser /var/dmp chown HwHiAiUser:HwHiAiUser /var/driver chown HwHiAiUser:HwHiAiUser /usr/slog chown HwHiAiUser:HwHiAiUser /home/drv/hdc_ppc chown HwHiAiUser:HwHiAiUser /var/log/npu/slog su - HwHiAiUser -c "export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64/ && /var/slogd >/dev/null &" su - HwDmUser -c "export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64/ && /var/dmp_daemon -I -M -U 8087 &"
将脚本存放到/usr/local/bin/目录下,并将脚本aes200_container_prepare.sh映射到容器中,容器启动时调用此脚本完成初始化操作。
验证
-
准备推理测试程序
[HwHiAiUser@localhost ~]$ git clone https://gitee.com/ascend/samples.git [HwHiAiUser@localhost ~]$ cd samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
根据resnet50_imagenet_classification中的readme文件,下载模型文件、转换模型、下载测试文件,编译程序,并在宿主机上测试推理代码,保证测试代码能在宿主机上成功执行。
-
启动容器
docker_run.sh
注意需要修改你的容器启动脚本,将你的推理测试代码目录映射到容器中
-
运行npu-smi info 查看npu信息
root@68354f94195d:/home/hwMindX# npu-smi info +--------------------------------------------------------------------------------------------------------+ | npu-smi 22.0.3 Version: 22.0.3.130 | +-------------------------------+-----------------+------------------------------------------------------+ | NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) | | Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) | +===============================+=================+======================================================+ | 0 310P1 | OK | NA 27 0 / 0 | | 0 0 | NA | 0 12233/ 43195 | +===============================+=================+======================================================+
-
测试推理代码
在容器中执行推理程序
HwHiAiUser@eea18d81ae6a:~/samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification/out$ ./main [INFO] acl init success [INFO] set device 0 success [INFO] create context success [INFO] create stream success [INFO] get run mode success [INFO] load model ../model/resnet50.om success [INFO] create model description success [INFO] create model input success [INFO] create model output success [INFO] start to process file:../data/dog1_1024_683.bin [INFO] model execute success [INFO] top 1: index[161] value[0.764648] [INFO] top 2: index[162] value[0.156616] [INFO] top 3: index[167] value[0.038971] [INFO] top 4: index[163] value[0.021698] [INFO] top 5: index[166] value[0.011887] [INFO] output data success [INFO] start to process file:../data/dog2_1024_683.bin [INFO] model execute success [INFO] top 1: index[267] value[0.935059] [INFO] top 2: index[266] value[0.041412] [INFO] top 3: index[265] value[0.019104] [INFO] top 4: index[219] value[0.002884] [INFO] top 5: index[160] value[0.000311] [INFO] output data success [INFO] destroy model input success [INFO] destroy model output success [INFO] unload model success, modelId is 1 [INFO] destroy model description success [INFO] execute sample success [INFO] end to destroy stream [INFO] end to destroy context [INFO] end to reset device 0 [INFO] end to finalize acl