制作推理镜像
- 本文以一个resnet50图像分类样例为例,该样例已编译完成且带有模型。样例压缩包为“vpc_resnet50_imagenet_classification.tar.gz”,样例可执行文件为“main”,在解压后的“vpc_resnet50_imagenet_classification/out”目录中,将样例压缩包上传到服务器任意目录,如“/home/test”。
业务典型场景示例
在AI应用中需要使用到边缘设备的NPU算力,下文将展示怎样制作相应推理镜像,仅供参考。
- 该镜像以HwHiAiUser用户运行。
- 该容器应用部署时无需配置特权容器、能力集、主机网络等。
前提条件
- 容器OS镜像由用户自行准备。
- 请按下表所示,获取离线推理引擎包与业务推理程序压缩包。
软件包 |
说明 |
获取方法 |
---|---|---|
Ascend-cann-nnrt_{version}_linux-aarch64.run |
离线推理引擎包。 {version}表示软件包版本。推荐nnrt 6.2及以上版本。 |
|
Dockerfile |
制作镜像需要。 |
用户根据业务自行准备。 |
业务推理程序压缩包 |
业务推理程序合集,包含模型文件、推理代码、配置文件等,可为tar、tar.gz等格式文件,install.sh安装业务推理程序的命令请根据实际情况适配。
说明:
容器应用内的运行用户需具备业务推理程序压缩包的相关权限。 |
用户根据业务自行准备。 |
slog.conf |
日志配置文件。每个推理镜像需要使用独立的配置文件,因此需要在制作推理镜像时拷贝到镜像里。 |
从镜像制作环境或用户运行环境中获取。 |
install.sh |
业务推理程序的安装脚本。 |
用户根据业务自行准备。 |
run.sh |
业务推理程序的运行脚本。 |
用户根据业务自行准备。 |
软件数字签名验证
为了防止软件包在传递过程或存储期间被恶意篡改,下载软件包时需下载对应的数字签名文件用于完整性验证。
在软件包下载之后,请参考《OpenPGP签名验证指南》,对从Support网站下载的软件包进行PGP数字签名校验。如果校验失败,请不要使用该软件包,先联系华为技术支持工程师解决。
使用软件包安装/升级之前,也需要按上述过程先验证软件包的数字签名,确保软件包未被篡改。
运营商客户请访问:http://support.huawei.com/carrier/digitalSignatureAction
企业客户请访问:https://support.huawei.com/enterprise/zh/tool/pgp-verify-TL1000000054
操作步骤
- 将准备的软件包及脚本上传至同一目录(如“/home/test”)。
- Ascend-cann-nnrt_{version}_linux-aarch64.run
- 业务推理程序压缩包
- Dockerfile
- slog.conf
- install.sh
- run.sh
- 执行以下步骤准备Dockerfile文件。
- 以root用户登录,依次执行以下命令查询并记录镜像环境上用户HwHiAiUser,HwBaseUser,HwDmUser的UID和GID(“Dockerfile”文件中会使用到)。
id HwHiAiUser id HwBaseUser id HwDmUser
- 进入步骤 1中软件包上传目录,执行以下命令创建Dockerfile文件(文件名示例“Dockerfile”)。
vi Dockerfile
- 写入以下内容后执行:wq命令保存,以Ubuntu Arm操作系统为例(以下内容仅为编写示例,请用户根据实际情况结合自身理解进行二次开发)。
# 容器操作系统及TAG,根据实际修改 FROM ubuntu:22.04 ARG NNRT_PKG ARG DIST_PKG # 本文以/usr/local/Ascend目录为例作为NNRT安装目录,如果您希望安装在其他目录,请修改为您希望的目录 ARG ASCEND_BASE=/usr/local/Ascend WORKDIR /home/AscendWork COPY $NNRT_PKG . COPY $DIST_PKG . COPY install.sh . # 推理程序需要使用到底层驱动,底层驱动的运行依赖HwHiAiUser,HwDmUser,HwBaseUser三个用户 # 创建运行推理应用的用户及组,以步骤2第1点中查到的HwHiAiUse,HwDmUser,HwBaseUser的UID与GID分别为1000,1101,1102为例 RUN umask 0022 && \ groupadd HwHiAiUser -g 1000 && \ useradd -d /home/HwHiAiUser -u 1000 -g 1000 -m -s /bin/bash HwHiAiUser && \ groupadd HwDmUser -g 1101 && \ useradd -d /home/HwDmUser -u 1101 -g 1101 -m -s /bin/bash HwDmUser && \ usermod -aG HwDmUser HwHiAiUser && \ groupadd HwBaseUser -g 1102 && \ useradd -d /home/HwBaseUser -u 1102 -g 1102 -m -s /bin/bash HwBaseUser && \ usermod -aG HwBaseUser HwHiAiUser # 安装nnrt,解压推理程序 RUN chmod +x $NNRT_PKG && \ echo y | ./$NNRT_PKG --quiet --install --install-path=$ASCEND_BASE \ --install-for-all --force && \ sh install.sh && \ chown -R HwHiAiUser:HwHiAiUser /home/AscendWork/ && \ rm $NNRT_PKG && \ rm $DIST_PKG && \ rm install.sh ENV LD_LIBRARY_PATH=/usr/local/Ascend/nnrt/latest/lib64:/usr/local/Ascend/driver/lib64:/usr/lib64 ENV LD_PRELOAD=/lib/aarch64-linux-gnu/libc.so.6 RUN ln -sf /lib /lib64 && \ mkdir /var/dmp && \ mkdir /usr/slog && \ chown HwHiAiUser:HwHiAiUser /usr/slog && \ chown HwHiAiUser:HwHiAiUser /var/dmp # 拷贝日志配置文件 COPY --chown=HwHiAiUser:HwHiAiUser slog.conf /etc COPY --chown=HwHiAiUser:HwHiAiUser run.sh /home/AscendWork/run.sh RUN chmod 640 /etc/slog.conf && \ chmod +x /home/AscendWork/run.sh # 若用户需要使用AICPU算子,则请用户将如下指令中的注释“#”删除 #RUN cp /usr/local/Ascend/nnrt/latest/opp/Ascend/aicpu/Ascend-aicpu_syskernels.tar.gz /home/HwHiAiUser/ && \ # rm -rf /usr/local/Ascend/nnrt/latest/opp/Ascend/aicpu/Ascend-aicpu_syskernels.tar.gz && \ # echo $(wc -c /home/HwHiAiUser/Ascend-aicpu_syskernels.tar.gz|awk ' {print$1} ') > /home/HwHiAiUser/aicpu_package_install.info && \ # tail -c +8449 /home/HwHiAiUser/Ascend-aicpu_syskernels.tar.gz > /home/HwHiAiUser/aicpu.tar.gz && \ # rm -rf /home/HwHiAiUser/Ascend-aicpu_syskernels.tar.gz && \ # chown HwHiAiUser:HwHiAiUser /home/HwHiAiUser/aicpu.tar.gz && \ # mkdir -p /home/HwHiAiUser/aicpu_kernels #RUN tar -xvf /home/HwHiAiUser/aicpu.tar.gz -C /home/HwHiAiUser/ 2>/dev/null;exit 0 #RUN rm -rf /home/HwHiAiUser/aicpu.tar.gz && \ # mv /home/HwHiAiUser/aicpu_kernels_device/* /home/HwHiAiUser/aicpu_kernels/ && \ # chown -R HwHiAiUser:HwHiAiUser /home/HwHiAiUser/ # 若用户不需要使用AICPU算子,请将如下指令的注释“#”删除 #RUN rm -rf /usr/local/Ascend/nnrt/latest/opp/Ascend/aicpu/Ascend-aicpu_syskernels.tar.gz && \ # chown -R HwHiAiUser:HwHiAiUser /home/HwHiAiUser/ USER 1000 CMD bash /home/AscendWork/run.sh
- 在创建Dockerfile文件后,执行以下命令修改Dockerfile文件权限。
chmod 600 Dockerfile
- install.sh编写示例:
cd /home/AscendWork #解压业务推理程序压缩包,请根据压缩包格式适配 tar -xzvf vpc_resnet50_imagenet_classification.tar.gz
run.sh编写示例:#!/bin/bash mkdir /dev/shm/dmp nohup /var/dmp_daemon -I -M -U 8087 >&/dev/null & /var/slogd -d #进入业务推理程序的可执行文件所在目录,用户需根据实际路径修改 cd /home/AscendWork/vpc_resnet50_imagenet_classification/out #运行可执行文件,用户需根据实际应用修改 ./main
- 以root用户登录,依次执行以下命令查询并记录镜像环境上用户HwHiAiUser,HwBaseUser,HwDmUser的UID和GID(“Dockerfile”文件中会使用到)。
- 进入软件包所在目录,执行以下命令,构建容器镜像。
docker build -t image-name:tag --build-arg NNRT_PKG=nnrt-name --build-arg DIST_PKG=distpackage-name .
当出现“Successfully built xxx”表示镜像构建成功,命令解释如表2所示。
注意不要遗漏命令结尾的“.”。
- 执行以下命令保存容器镜像到磁盘。
docker save image-name:tag |gzip -c > image-name.tar.gz