AES200 容器内推理测试

AES200 容器内推理测试

前提条件


  1. 宿主机已经安装过Driver和Firmware,本文基于以下驱动和固件测试
软件包配套操作系统版本架构说明
Ascend-hdk-310p-npu-driver-soc_6.0.rc1_linux-aarch64.runOpenEuler 20.03ArmAtlas 200I SoC A1昇腾NPU驱动包(run格式),可以直接在OpenEuler命令行升级
Ascend-hdk-310p-npu-firmware-soc_6.0.rc1.runOpenEuler 20.03ArmAtlas 200I SoC A1昇腾固件安装包(run格式),可以直接在OpenEuler命令行升级
Ascend-hdk-310p-npu-firmware-soc_6.0.rc1.hpmOpenEuler 20.03ArmAtlas 200I SoC A1昇腾固件安装包(hpm格式),可以通过BMC来升级固件
Atlas-200i-soc-a1-mcu_3.3.4.zip--MCU固件zip包(内含MCU固件hpm包),可以通过BMC来升级MCU固件

详情请参见华为的官方文档:安装驱动安装固件

  1. 需用户在宿主机自行安装docker。

    yum install docker
    
  2. 重启服务与容器,命令为:

    systemctl daemon-reload
    systemctl restart docker
    
  3. 访问官方推理镜像网站

    image-20221227094753088

    点击获取镜像,注册华为用户,如果有则直接登录。

    选择22.0.RC3-mxvision镜像版本,并点击下载,将弹出以下窗口,根据窗口中说明的步骤,下载推理镜像。

    1. 查看镜像,命令为:

      [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
      

操作步骤


  1. 在宿主机执行以下命令查看宿主机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

    在这里插入图片描述

注意:
由于系统版本的不一样,会导致这几个账号的user id 和group id会变化,请千万注意,如果有变化请做相应的修改,特别是那个aes200_container_prepare.sh脚本中的内容需要做相应的修改。

  1. 在宿主机创建并启动容器。

    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"
    

    更新:
    针对24.0RC1的两个镜像版本:ubuntu20.04和openEuler20.03分别采用不同的docker启动脚本。
    在这里插入图片描述
    Ubuntu20.04:

docker run -it --rm -u root \
        --device=/dev/davinci0 \
        --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 \
        -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 /lib64/libyaml-0.so.2:/lib/aarch64-linux-gnu/libyaml-0.so.2:ro \ #注意:区别主要在这里
        -v /home/HwHiAiUser:/home/HwHiAiUser \
        swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-infer:24.0.RC1-ubuntu20.04  /bin/bash -c "/usr/local/bin/aes200_container_prepare.sh; /bin/bash"

openEuler20.03

docker run -it --rm -u root \
        --device=/dev/davinci0 \
        --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 \
        -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 /lib64/libyaml-0.so.2:/usr/lib64/libyaml-0.so.2:ro \   #注意:区别主要在这里
        -v /home/HwHiAiUser:/home/HwHiAiUser \
        swr.cn-south-1.myhuaweicloud.com/ascendhub/ascend-infer:24.0.RC1-openeuler20.03 /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下载的官方测试代码
```
> 说明

如果Atlas 200I SoC A1 核心板的驱动是1.0.0(Ascend HDK 22.0.0)及之前的版本,则需要挂载/dev/xsmem_dev和/dev/event_sched这两个设备。
如果Atlas 200I SoC A1 核心板的驱动是1.0.0(Ascend HDK 22.0.0)之后的版本,则不需要挂载/dev/xsmem_dev和/dev/event_sched这两个设备。

这里重点介绍一下容器初始化步骤,每次容器启动时,需要对容器进行初始化,我用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映射到容器中,容器启动时调用此脚本完成初始化操作。

验证

  1. 准备推理测试程序

    [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文件,下载模型文件、转换模型、下载测试文件,编译程序,并在宿主机上测试推理代码,保证测试代码能在宿主机上成功执行。

  2. 启动容器

    docker_run.sh
    

    注意需要修改你的容器启动脚本,将你的推理测试代码目录映射到容器中

  3. 运行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                            |
    +===============================+=================+======================================================+
    
  4. 测试推理代码

    在容器中执行推理程序

    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
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值