构建推理容器镜像
宿主机与容器操作系统兼容性关系
宿主机操作系统与容器操作系统的兼容性关系如表4-8所示(推荐Ubuntu 18.04作为容器OS)。
架构 |
宿主机OS版本 |
宿主机kernel版本 |
容器OS版本 |
---|---|---|---|
X86 |
Ubuntu 18.04.1 |
4.15.0-29-generic |
Ubuntu 18.04 |
CentOS 7.6 说明:
需要在容器中安装driver。 |
|||
CentOS 7.6 |
3.10.0-957.el7.x86_64 |
CentOS 7.6 |
|
Ubuntu 18.04 |
|||
Arm |
Ubuntu 18.04.1 |
4.15.0-29-generic |
Ubuntu 18.04 |
CentOS 7.6 说明:
需要在容器中安装driver。 |
|||
CentOS 7.6 |
4.14.0-115.el7a.0.1.aarch64 |
CentOS 7.6 |
|
Ubuntu 18.04 |
- 表4-8中若未注明“需要在容器中安装driver”,则不需要在容器中安装driver。
- 容器镜像OS场景只支持客户运行态业务,不支持开发态。
- 容器镜像OS目前支持的Ubuntu操作系统版本为18.04.1和18.04.4。
前提条件
- 请按照表4-9所示,获取软件包与打包镜像所需Dockerfile文件与脚本文件。
软件包名称中{version}表示软件包版本,{arch}表示操作系统架构,{gcc_version}为gcc版本。
- 用户环境拉取镜像需要联网,若未联网,请参见配置系统网络代理。
- 容器OS镜像可从Docker Hub上拉取,如拉取容器镜像Ubuntu 18.04:
docker pull ubuntu:18.04
由于不能从Docker Hub上获取到Arm架构的CentOS 7.6镜像,若需使用,可从AscendHub上拉取。拉取成功后需要执行以下命令进行重命名:
docker tag swr.cn-south-1.myhuaweicloud.com/public-ascendhub/centos:7.6.1810 arm64v8/centos:7
操作步骤
- 以root用户登录服务器。
- 创建软件包上传路径(以“/home/test”为例)。
mkdir -p /home/test
- 将准备的软件包上传到服务器“/home/test”目录下。
- Ascend-cann-nnrt_{version}_linux-{arch}_{gcc_version}.run
- A300-30x0-npu-driver_{version}_centos7.6-gcc4.8.5-{arch}.run(若不需要在容器中安装driver请忽略)
- 业务推理程序压缩包
- 执行以下步骤准备Dockerfile文件。
- 进入软件包上传目录,执行以下命令创建Dockerfile文件(文件名示例“Dockerfile”)。
vi Dockerfile
- 写入以下内容后执行:wq命令保存内容。Dockerfile文件的内容编写分以下两种场景。
- 不需要在容器中安装driver,内容以Ubuntu 18.04操作系统为例,详细介绍请参见编写示例。
#拉取容器镜像ubuntu:18.04 FROM ubuntu:18.04 #指定离线推理引擎包与用户ID ARG NNRT_PKG ARG ASCEND_BASE=/usr/local/Ascend ARG HWHIAIUSER_UID ARG HWHIAIUSER_GID #环境变量 ENV LD_LIBRARY_PATH=\ $LD_LIBRARY_PATH:\ $ASCEND_BASE/driver/lib64:\ $ASCEND_BASE/nnrt/latest/acllib/lib64 #指定工作容器主目录与拷贝安装包 WORKDIR /root COPY $NNRT_PKG . #安装离线推理引擎包 RUN umask 0022 && \ if [ "$(uname -m)" = "aarch64" ] && [ ! -d "/lib64" ]; \ then \ mkdir /lib64 && ln -sf /lib/ld-linux-aarch64.so.1 /lib64/ld-linux-aarch64.so.1; \ fi && \ groupadd HwHiAiUser && \ useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && \ groupmod -g $HWHIAIUSER_GID HwHiAiUser && \ usermod -u $HWHIAIUSER_UID HwHiAiUser && \ chmod +x ${NNRT_PKG} && \ ./${NNRT_PKG} --quiet --install && \ rm ${NNRT_PKG} #拷贝业务程序压缩包与脚本文件 ARG DIST_PKG COPY $DIST_PKG . COPY install.sh . COPY run.sh /usr/local/bin/ #执行安装脚本 RUN chmod +x /usr/local/bin/run.sh && \ sh install.sh && \ rm $DIST_PKG && \ rm install.sh #容器启动时默认执行的程序 CMD run.sh
- 需要在容器中安装driver,内容以CentOS Arm 7.6为例,详细介绍请参见编写示例。
FROM arm64v8/centos:7 #指定离线推理引擎包、驱动包与用户ID ARG NNRT_PKG ARG DRIVER_PKG ARG ASCEND_BASE=/usr/local/Ascend ARG HWHIAIUSER_UID ARG HWHIAIUSER_GID #环境变量 ENV LD_LIBRARY_PATH=\ $LD_LIBRARY_PATH:\ $ASCEND_BASE/driver/lib64:\ $ASCEND_BASE/nnrt/latest/acllib/lib64 #指定工作容器主目录与拷贝安装包 WORKDIR /root COPY $NNRT_PKG . COPY $DRIVER_PKG . #安装离线推理引擎包、驱动包 RUN umask 0022 && \ groupadd HwHiAiUser && \ useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && \ groupmod -g $HWHIAIUSER_GID HwHiAiUser && \ usermod -u $HWHIAIUSER_UID HwHiAiUser && \ chmod +x ${DRIVER_PKG} && \ chmod +x ${NNRT_PKG} && \ ./${DRIVER_PKG} --docker && \ ./${NNRT_PKG} --quiet --install && \ rm ${DRIVER_PKG} && \ rm ${NNRT_PKG} #拷贝业务程序压缩包与脚本文件 ARG DIST_PKG COPY $DIST_PKG . COPY install.sh . COPY run.sh /usr/local/bin/ #执行安装脚本 RUN chmod +x /usr/local/bin/run.sh && \ sh install.sh && \ rm $DIST_PKG && \ rm install.sh #容器启动时默认执行的程序 CMD run.sh
“install.sh”脚本与“run.sh”脚本文件准备与Dockerfile文件准备操作一致,文件内容如编写示例所示。
- 本文档所给示例都是基于宿主机的驱动运行用户为HwHiAiUser,若用户指定其他用户作为驱动的运行用户,请根据实际情况进行修改。
- 在创建Dockerfile文件后,执行以下命令修改Dockerfile文件权限。
chmod 600 Dockerfile
- 不需要在容器中安装driver,内容以Ubuntu 18.04操作系统为例,详细介绍请参见编写示例。
- 进入软件包上传目录,执行以下命令创建Dockerfile文件(文件名示例“Dockerfile”)。
- 进入软件包所在目录,执行以下命令(此命令根据本文档编写示例给出,用户需根据实际情况修改),构建容器镜像。
docker build -t image-name --build-arg NNRT_PKG=nnrt-name --build-arg DRIVER_PKG=drivepackage-name --build-arg HWHIAIUSER_UID=uid --build-arg HWHIAIUSER_GID=gid --build-arg DIST_PKG=distpackage-name .
其中--build-arg DRIVER_PKG=drivepackage-name为指定驱动包,若不需要在容器中安装driver,请自行删除。注意不要遗漏命令结尾的“.”,命令解释如表4-10所示。
表4-10 命令参数说明参数
说明
image-name
镜像名称与标签,请用户根据实际情况更换。
--build-arg
指定dockerfile文件内的参数。
NNRT_PKG
nnrt-name为离线推理引擎包名称,注意不要遗漏文件后缀,请用户自行更换。
DRIVER_PKG
drivepackage-name为驱动安装包名称,注意不要遗漏文件后缀,请用户自行更换。
HWHIAIUSER_UID
uid为HwHiAiUser的uid,请用户根据host侧HwHiAiUser用户的uid进行替换。
HWHIAIUSER_GID
gid为HwHiAiUser的gid,请用户根据host侧HwHiAiUser用户的gid进行替换。
DIST_PKG
distpackage-name为业务推理程序压缩包名称,注意不要遗漏文件后缀,请用户自行更换。
可执行如下命令查询host侧HwHiAiUser用户的uid、gid。
id HwHiAiUser
当出现“Successfully built xxx”表示镜像构建成功。
- 构建完成后,执行以下命令查看镜像信息。
docker images
显示示例:
REPOSITORY TAG IMAGE ID CREATED SIZE workload-image v1.0 1372d2961ed2 About an hour ago 249MB
编写示例
Dockerfile编写有以下注意事项:
- 拉取基础镜像的语句替换:
FROM ubuntu:18.04
为获取镜像“ubuntu:18.04”。根据容器需要的操作系统的不同,用户需要参考表4-11替换。
- 容器OS对应软件包:
根据容器OS的不同,用户需要参考表4-12获取对应gcc版本的离线推理引擎包。
表4-12 容器OS对应软件包容器OS版本
离线推理引擎包
获取链接
CentOS 7.6 Arm
CentOS 7.6 X86
Ascend-cann-nnrt_{version}_linux-{arch}_gcc4.8.5.run
- 离线推理引擎包 获取链接
Ubuntu 18.04 X86
Ubuntu 18.04 Arm
Ascend-cann-nnrt_{version}_linux-{arch}_gcc7.3.0.run
install.sh编写示例
#!/bin/bash #创建日志相关文件 mkdir -p /usr/slog mkdir -p /var/log/npu/slog/slogd chown -Rf HwHiAiUser:HwHiAiUser /usr/slog chown -Rf HwHiAiUser:HwHiAiUser /var/log/npu/slog #进入容器工作目录、解压业务推理程序压缩包 cd /root tar xf dist.tar
run.sh编写示例
#!/bin/bash #验证npu-smi工具的安装 npu-smi info #启动slogd守护进程 su HwHiAiUser --command "env LD_LIBRARY_PATH=/usr/local/Ascend/add-ons:$LD_LIBRARY_PATH /usr/local/Ascend/driver/tools/slogd &" sleep 1 ps -ef | grep -v grep | grep "tools/slogd" #进入业务推理程序的可执行文件所在目录 cd /root/dist #运行可执行文件 ./main