使用Dockerfile构建容器镜像(PyTorch)
前提条件
请按照表1所示,获取对应操作系统的软件包与打包镜像所需Dockerfile文件与脚本文件。
深度学习引擎软件包名称中{version}表示版本号,{arch}表示架构。配套的CANN软件包在6.3.RC3、6.2.RC3及以上版本增加了“您是否接受EULA来安装CANN(Y/N)”的安装提示;在Dockerfile编写示例中的安装命令包含“--quiet”参数的默认同意EULA,用户可自行修改。
软件包 |
说明 |
获取方法 |
---|---|---|
Ascend-cann-toolkit_{version}_linux-{arch}.run |
深度学习引擎软件包。 |
|
Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run |
二进制算子包。 |
|
apex-0.1+ascend-cp3x-cp3x-linux_{arch}.whl |
混合精度模块。x表示8、9、10或11,当前可支持Python 3.8、Python 3.9、Python 3.10和Python3.11。 |
请参见《Ascend Extension for PyTorch 配置与安装》中的“(可选)安装APEX模块”章节,根据实际情况编译APEX软件包。 |
|
官方PyTorch包。x表示8、9、10或11,当前可支持Python 3.8、Python 3.9、Python 3.10和Python3.11。 |
|
torch_npu-2.1.0.post{version}-cp3x-cp3x-manylinux_2_17_{arch}.manylinux2014_{arch}.whl |
Ascend Extension for PyTorch插件。Pythonx表示8、9、10或11,当前可支持Python 3.8、Python 3.9、Python 3.10和Python3.11。 |
Ascend Extension for PyTorch2.1.0版本获取链接 说明:
如果使用MindSpeed-LLM代码仓上的PyTorch模型,需要使用Ascend Extension for PyTorch 2.1.0及以上版本。 |
Dockerfile |
制作镜像需要。 |
|
dllogger-master |
PyTorch日志工具。 |
|
ascend_install.info |
驱动安装信息文件。 |
从host拷贝“/etc/ascend_install.info”文件。 |
version.info |
驱动版本信息文件。 |
从host拷贝“/usr/local/Ascend/driver/version.info”文件。 |
prebuild.sh |
执行训练运行环境安装准备工作,例如配置代理等。 |
参考步骤3 |
install_ascend_pkgs.sh |
昇腾软件包安装脚本。 |
参考步骤4 |
postbuild.sh |
清除不需要保留在容器中的安装包、脚本、代理配置等。 |
参考步骤5 |
为了防止软件包在传递过程或存储期间被恶意篡改,下载软件包时需下载对应的数字签名文件用于完整性验证。
在软件包下载之后,请参考《OpenPGP签名验证指南》,对从Support网站下载的软件包进行PGP数字签名校验。如果校验失败,请不要使用该软件包,先联系华为技术支持工程师解决。
使用软件包安装/升级之前,也需要按上述过程先验证软件包的数字签名,确保软件包未被篡改。
运营商客户请访问:https://support.huawei.com/carrier/digitalSignatureAction
企业客户请访问:https://support.huawei.com/enterprise/zh/tool/pgp-verify-TL1000000054

本章节以Ubuntu 18.04、配套Python 3.10为例来介绍使用Dockerfile构建容器镜像的详细过程,使用过程中需根据实际情况修改相关步骤。
操作步骤
- 将准备的软件包、深度学习框架相关包、host侧驱动安装信息文件及驱动版本信息文件上传到服务器同一目录(如“/home/test”)。
- Ascend-cann-toolkit_{version}_linux-{arch}.run
- Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run
- apex-0.1+ascend-cp310-cp310-linux_{arch}.whl
- torch-2.1.0+cpu.cxx11.abi-cp310-cp310-linux_{arch}.whl
- torch_npu-2.1.0.post{version}-cp310-cp310-manylinux_2_17_{arch}.manylinux2014_{arch}.whl
- dllogger-master
- ascend_install.info
- version.info
- 以root用户登录服务器。
- 执行以下步骤准备prebuild.sh文件。
- 进入软件包所在目录,执行以下命令创建prebuild.sh文件。
vi prebuild.sh
- 写入内容参见prebuild.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
- 进入软件包所在目录,执行以下命令创建prebuild.sh文件。
- 执行以下步骤准备install_ascend_pkgs.sh文件。
- 进入软件包所在目录,执行以下命令创建install_ascend_pkgs.sh文件。
vi install_ascend_pkgs.sh
- 写入内容参见install_ascend_pkgs.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
- 进入软件包所在目录,执行以下命令创建install_ascend_pkgs.sh文件。
- 执行以下步骤准备postbuild.sh文件。
- 进入软件包所在目录,执行以下命令创建postbuild.sh文件。
vi postbuild.sh
- 写入内容参见postbuild.sh编写示例,写入后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
- 进入软件包所在目录,执行以下命令创建postbuild.sh文件。
- 执行以下步骤准备Dockerfile文件。
- 进入软件包所在目录,执行以下命令创建Dockerfile文件(文件名示例“Dockerfile”)。
vi Dockerfile
- 写入内容参见Dockerfile编写示例,然后执行:wq命令保存内容,内容以Ubuntu操作系统为例。
- 进入软件包所在目录,执行以下命令创建Dockerfile文件(文件名示例“Dockerfile”)。
- 进入软件包所在目录,执行以下命令,构建容器镜像,注意不要遗漏命令结尾的“.”。
docker build -t 镜像名_系统架构:镜像tag .
例如:docker build -t test_train_arm64:v1.0 .
命令解释如所表2示。
当出现“Successfully built xxx”表示镜像构建成功。
- 构建完成后,执行以下命令查看镜像信息。
docker images
回显示例如下。
1 2
REPOSITORY TAG IMAGE ID CREATED SIZE test_train_arm64 v1.0 d82746acd7f0 27 minutes ago 749MB
编写示例
- prebuild.sh编写示例。Ubuntu Arm系统prebuild.sh编写示例。
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,执行安装准备工作,例如配置代理等 # 本脚本将会在正式构建过程启动前被执行 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # dns设置 tee /etc/resolv.conf <<- EOF nameserver xxx.xxx.xxx.xxx #DNS服务器IP,可填写多个,根据实际配置 nameserver xxx.xxx.xxx.xxx nameserver xxx.xxx.xxx.xxx EOF # apt代理设置 tee /etc/apt/apt.conf.d/80proxy <<- EOF Acquire::http::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #http代理服务器IP地址及端口 Acquire::https::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #https代理服务器IP地址及端口 EOF chmod 777 -R /tmp rm /var/lib/apt/lists/* #apt源设置(以ubuntu 18.04 Arm源为示例,请根据实际配置) tee /etc/apt/sources.list <<- EOF deb http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu-ports/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu-ports/ bionic-backports main restricted universe multiverse EOF
Ubuntu x86_64系统prebuild.sh编写示例。
#!/bin/bash #-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,执行安装准备工作,例如配置代理等 # 本脚本将会在正式构建过程启动前被执行 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- # apt代理设置 tee /etc/apt/apt.conf.d/80proxy <<- EOF Acquire::http::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #http代理服务器IP地址及端口 Acquire::https::Proxy "http://xxx.xxx.xxx.xxx:xxx"; #https代理服务器IP地址及端口 EOF #apt源设置(以ubuntu 18.04 x86_64源为示例,请根据实际配置) tee /etc/apt/sources.list <<- EOF deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main multiverse restricted universe deb-src http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main multiverse restricted universe EOF
- install_ascend_pkgs.sh编写示例。
#-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,安装昇腾软件包 # # 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 #-------------------------------------------------------------------------------- umask 0022 cp ascend_install.info /etc/ # 构建之前把host的/usr/local/Ascend/driver/version.info拷贝一份到当前目录 mkdir -p /usr/local/Ascend/driver/ cp version.info /usr/local/Ascend/driver/ # Ascend-cann-toolkit_{version}_linux-{arch}.run chmod +x Ascend-cann-toolkit_{version}_linux-{arch}.run chmod +x Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run ./Ascend-cann-toolkit_{version}_linux-{arch}.run --install-path=/usr/local/Ascend/ --install --quiet echo y | ./Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run --install # 只为了安装toolkit包,所以需要清理,容器启动时通过ascend docker挂载进来 rm -f version.info rm -rf /usr/local/Ascend/driver/
- postbuild.sh编写示例。
#-------------------------------------------------------------------------------- # 请在此处使用bash语法编写脚本代码,清除不需要保留在容器中的安装包、脚本、代理配置等 # 本脚本将会在正式构建过程结束后被执行 # # 注:本脚本运行结束后会被自动清除,不会残留在镜像中;脚本所在位置和Working Dir位置为/tmp #-------------------------------------------------------------------------------- rm -f ascend_install.info rm -f prebuild.sh rm -f install_ascend_pkgs.sh rm -f Dockerfile rm -f Ascend-cann-toolkit_{version}_linux-{arch}.run rm -f Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run rm -f apex-0.1+ascend-cp310-cp310-linux_{arch}.whl rm -f torch-2.1.0+cpu.cxx11.abi-cp310-cp310-linux_{arch}.whl rm -f torch_npu-2.1.0.post7-cp310-cp310-manylinux_2_17_{arch}.manylinux2014_{arch}.whl rm -f /etc/apt/apt.conf.d/80proxy
- Dockerfile编写示例。
- Ubuntu Arm系统,配套Python 3.10的Dockerfile示例。
FROM ubuntu:18.04 ARG PYTORCH_PKG=torch-2.1.0+cpu.cxx11.abi-cp310-cp310-linux_aarch64.whl ARG PYTORCH_NPU_PKG=torch_npu-2.1.0.post{version}-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl ARG APEX_PKG=apex-0.1_ascend-cp310-cp310-linux_aarch64.whl ARG HOST_ASCEND_BASE=/usr/local/Ascend ARG TOOLKIT_PATH=/usr/local/Ascend/toolkit/latest ARG INSTALL_ASCEND_PKGS_SH=install_ascend_pkgs.sh ARG PREBUILD_SH=prebuild.sh ARG POSTBUILD_SH=postbuild.sh WORKDIR /tmp COPY . ./ # 触发prebuild.sh RUN bash -c "test -f $PREBUILD_SH && bash $PREBUILD_SH || true" ENV http_proxy http://xxx.xxx.xxx.xxx:xxx ENV https_proxy http://xxx.xxx.xxx.xxx:xxx # 系统包 RUN apt update && \ apt install -y --no-install-recommends curl g++ pkg-config unzip wget build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev \ libblas3 liblapack3 liblapack-dev openssl libssl-dev libblas-dev gfortran libhdf5-dev libffi-dev libicu60 libxml2 \ patch libbz2-dev llvm libncursesw5-dev xz-utils liblzma-dev m4 dos2unix libopenblas-dev libsqlite3-dev RUN wget https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tgz --no-check-certificate RUN tar -zxvf Python-3.10.5.tgz && cd Python-3.10.5 && ./configure --prefix=/usr/local/python3.10.5 --enable-shared && make && make install RUN ln -s /usr/local/python3.10.5/bin/python3.10 /usr/local/python3.10.5/bin/python && \ ln -s /usr/local/python3.10.5/bin/pip3.10 /usr/local/python3.10.5/bin/pip # 配置Python pip源 RUN mkdir -p ~/.pip \ && echo '[global] \n\ index-url=https://pypi.doubanio.com/simple/\n\ trusted-host=pypi.doubanio.com' >> ~/.pip/pip.conf ENV LD_LIBRARY_PATH=/usr/local/python3.10.5/lib:$LD_LIBRARY_PATH ENV PATH=/usr/local/python3.10.5/bin:$PATH ENV PYTHONPATH=/usr/local/python3.10.5/lib/python3.10/site-packages:$PYTHONPATH # Python包 RUN pip3 install decorator && \ pip3 install sympy && \ pip3 install cffi && \ pip3 install pyyaml && \ pip3 install pathlib2 && \ pip3 install grpcio && \ pip3 install grpcio-tools && \ pip3 install protobuf && \ pip3 install scipy && \ pip3 install requests && \ pip3 install attrs && \ pip3 install Pillow==9.1.0 && \ pip3 install torchvision==0.16.0 && \ pip3 install numpy==1.23.5 && \ pip3 install psutil && \ pip3 install absl-py # 创建HwHiAiUser用户和属主,UID和GID请与物理机保持一致避免出现无属主文件。示例中会自动创建user和对应的group,UID和GID都为1000 RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser # Ascend包 RUN umask 0022 && bash $INSTALL_ASCEND_PKGS_SH RUN umask 0022 && pip3 install $APEX_PKG RUN umask 0022 && pip3 install $PYTORCH_PKG RUN umask 0022 && pip3 install $PYTORCH_NPU_PKG RUN cd /tmp/dllogger-master/ && \ python3 setup.py build && \ python3 setup.py install # 环境变量 ENV HCCL_WHITELIST_DISABLE=1 ENV PYTHONPATH=/tmp/dllogger-master # 创建/lib64/ld-linux-aarch64.so.1 RUN umask 0022 && \ if [ ! -d "/lib64" ]; \ then \ mkdir /lib64 && ln -sf /lib/ld-linux-aarch64.so.1 /lib64/ld-linux-aarch64.so.1; \ fi ENV http_proxy "" ENV https_proxy "" # 触发postbuild.sh RUN bash -c "test -f $POSTBUILD_SH && bash $POSTBUILD_SH || true" && \ rm $POSTBUILD_SH
- Ubuntu x86_64系统,配套Python 3.10的Dockerfile示例
FROM ubuntu:18.04 ARG PYTORCH_PKG=torch-2.1.0+cpu.cxx11.abi-cp310-cp310-linux_x86_64.whl ARG PYTORCH_NPU_PKG=torch_npu-2.1.0.post{version}-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl ARG APEX_PKG=apex-0.1_ascend-cp310-cp310-linux_x86_64.whl ARG HOST_ASCEND_BASE=/usr/local/Ascend ARG TOOLKIT_PATH=/usr/local/Ascend/toolkit/latest ARG INSTALL_ASCEND_PKGS_SH=install_ascend_pkgs.sh ARG PREBUILD_SH=prebuild.sh ARG POSTBUILD_SH=postbuild.sh WORKDIR /tmp COPY . ./ # 触发prebuild.sh RUN bash -c "test -f $PREBUILD_SH && bash $PREBUILD_SH || true" ENV http_proxy http://xxx.xxx.xxx.xxx:xxx ENV https_proxy http://xxx.xxx.xxx.xxx:xxx # 系统包 RUN apt update && \ apt install -y --no-install-recommends curl g++ pkg-config unzip wget build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev \ libblas3 liblapack3 liblapack-dev openssl libssl-dev libblas-dev gfortran libhdf5-dev libffi-dev libicu60 libxml2 \ patch libbz2-dev llvm libncursesw5-dev xz-utils liblzma-dev m4 dos2unix libopenblas-dev libsqlite3-dev RUN wget https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tgz --no-check-certificate RUN tar -zxvf Python-3.10.5.tgz && cd Python-3.10.5 && ./configure --prefix=/usr/local/python3.10.5 --enable-shared && make && make install RUN ln -s /usr/local/python3.10.5/bin/python3.10 /usr/local/python3.10.5/bin/python && \ ln -s /usr/local/python3.10.5/bin/pip3.10 /usr/local/python3.10.5/bin/pip # 配置Python pip源 RUN mkdir -p ~/.pip \ && echo '[global] \n\ index-url=https://pypi.doubanio.com/simple/\n\ trusted-host=pypi.doubanio.com' >> ~/.pip/pip.conf ENV LD_LIBRARY_PATH=/usr/local/python3.10.5/lib:$LD_LIBRARY_PATH ENV PATH=/usr/local/python3.10.5/bin:$PATH ENV PYTHONPATH=/usr/local/python3.10.5/lib/python3.10/site-packages:$PYTHONPATH # Python包 RUN pip3 install decorator && \ pip3 install sympy && \ pip3 install cffi && \ pip3 install pyyaml && \ pip3 install pathlib2 && \ pip3 install grpcio && \ pip3 install grpcio-tools && \ pip3 install protobuf && \ pip3 install scipy && \ pip3 install requests && \ pip3 install attrs && \ pip3 install Pillow==9.1.0 && \ pip3 install torchvision==0.16.0 && \ pip3 install numpy==1.23.5 && \ pip3 install psutil && \ pip3 install absl-py # 创建HwHiAiUser用户和属主,UID和GID请与物理机保持一致避免出现无属主文件。示例中会自动创建user和对应的group,UID和GID都为1000 RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser # Ascend包 RUN bash $INSTALL_ASCEND_PKGS_SH RUN pip3 install $APEX_PKG RUN pip3 install $PYTORCH_PKG RUN pip3 install $PYTORCH_NPU_PKG RUN cd /tmp/dllogger-master/ && \ python3 setup.py build && \ python3 setup.py install # 环境变量 ENV HCCL_WHITELIST_DISABLE=1 ENV PYTHONPATH=/tmp/dllogger-master ENV http_proxy "" ENV https_proxy "" # 触发postbuild.sh RUN bash -c "test -f $POSTBUILD_SH && bash $POSTBUILD_SH || true" && \ rm $POSTBUILD_SH
- Ubuntu Arm系统,配套Python 3.10的Dockerfile示例。