部署容器(制作容器镜像方式-MindSpore)
本章节介绍如何制作包含CANN软件的镜像来部署容器。
拥有制作容器镜像Dockerfile文件的OS:Ubuntu18.04、CentOS 7.6、openEuler 20.03。
前提条件
- 容器OS镜像可从Docker Hub拉取,请确保安装环境能够连接网络。
- 由于Docker Hub中不存在openeuler 20.03的镜像,如果需要在容器内使用openeuler OS,可执行如下步骤。
- 登录https://repo.openeuler.org/openEuler-20.03-LTS-SP2/docker_img/aarch64/,下载镜像文件“openEuler-docker.aarch64.tar.xz”。
- 将镜像文件上传到服务器任意目录(如“/home”)。
- 在存放镜像的目录下执行如下命令导入镜像。
docker load -i openEuler-docker.aarch64.tar.xz docker images
回显类似如下信息表示成功导入。REPOSITORY TAG IMAGE ID CREATED SIZE openeuler-20.03-lts-sp2 latest 58b9cc5bcb76 10 months ago 331MB
操作步骤
- 执行docker images命令查看宿主机上是否已存在容器OS镜像,如下所示,如果已存在镜像,则直接执行3,否则执行2拉取容器OS镜像。
ubuntu 20.04 d5ca7a445605 5 months ago 65.6MB ubuntu 18.04 7266638574fb 5 months ago 56.6MB
- 执行docker pull ubuntu:18.04命令拉取容器OS镜像,拉取后可以按照1方法查看镜像是否已拉取成功。
ubuntu:18.04请根据现场实际OS和版本刷新。
- 登录Dockerfile目录,单击黄色按钮“克隆/下载”,选择“SSH”页签,单击“下载ZIP”按钮,下载目录压缩文件“ascend-docker-image-master.zip”(该操作需登录 Gitee 帐号,如果没有账号,请用户根据提示自行注册账号),将文件上传至服务器任意目录,如“/home”,解压文件。
unzip ascend-docker-image-master.zip
Dockerfile目录结构如下所示。ascend-docker-image-master │──ascend-algorithm │──ascend-mindspore // 制作mindspore训练镜像路径 │ │──Dockerfile │──ascend-pytorch // 制作pytorch训练镜像路径 │ │──Dockerfile │──ascend-tensorflow // 制作tensorflow训练镜像路径 │ │──Dockerfile │──ascend-toolkit // 制作toolkit镜像路径 │ │──Dockerfile │──ascendbase-toolkit // 该目录中的Dockerfile文件包含toolkit软件的安装,用于制作基础镜像,请用户根据需要的容器镜像操作系统版本和架构选择相应的路径制作镜像 │ ├──centos7.6-arm64 │ │ │──Dockerfile │ ├──centos7.6-x64 │ │ │──Dockerfile │ ├──debian9.9-x64 │ │ │──Dockerfile │ ├──openeuler20.03-arm64 │ │ │──Dockerfile │ ├──openeuler20.03-x64 │ │ │──Dockerfile │ ├──ubuntu18.04-arm64 │ │ │──Dockerfile │ ├──ubuntu18.04-x64 │ │ │──Dockerfile
- 构建镜像ascendbase-toolkit。
- 进入Dockerfile所在路径。
cd /home/ascend-docker-image-master/ascendbase-toolkit/{os}-{arch}
其中{os}表示容器镜像操作系统版本,{arch}表示架构,请根据实际情况替换,如“/home/ascend-docker-image-master/ascendbase-toolkit/ubuntu18.04-arm64”。
- Dockerfile文件已存在当前目录,用户可根据实际需要自行定制。
- (可选)请在当前目录准备libstdc++.so.6.0.24(动态库文件,仅当容器镜像OS为CentOS时需要准备libstdc++.so.6.0.24文件)。
在当前目录下,执行如下命令查询libstdc++.so.6.0.24文件所在路径,并将文件拷贝到当前目录。
find / -name libstdc++.so.6.0.24 cp -r 文件路径 ./
- 在当前目录执行以下命令构建镜像ascendbase-toolkit。
docker build -t ascendbase-toolkit:base_TAG .
注意不要遗漏命令结尾的“.”,命令解释如表1所示。
构建镜像时,如果在pip安装python依赖包时出现类似如下超时或证书错误,请修改Dockerfile更换pip源。
SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1076)'))) ReadTimeoutError: HTTPSConnectionPool(host='mirrors.huaweicloud.com', port=443): Read timed out.
- 进入Dockerfile所在路径。
- 基于镜像ascendbase-toolkit,构建镜像ascend-toolkit。
- 进入Dockerfile所在路径。
cd /home/ascend-docker-image-master/ascend-toolkit
- 执行vi Dockerfile命令修改Dockerfile文件。
- 添加如下加粗内容。
# 2. 训练引擎TOOLKIT安装 ARG TOOLKIT_PKG=Ascend-cann-toolkit_*.run ARG TOOLKIT_PATH=$ASCEND_BASE/ascend-toolkit/latest ARG Kernel_PKG=Ascend-cann-kernels-*.run # 安装TOOLKIT RUN umask 0022 && \ mkdir -p $ASCEND_BASE/driver && \ if [ "$CHIP" != "all" ]; \ then \ CHIPOPTION="--chip=$CHIP"; \ else \ CHIPOPTION=""; \ fi && \ chmod +x $TOOLKIT_PKG && \ ./$TOOLKIT_PKG --quiet --install --install-path=$ASCEND_BASE \ --install-for-all $CHIPOPTION && \ chmod +x $Kernel_PKG && \ ./$Kernel_PKG --quiet --install \ --install-for-all $CHIPOPTION && \ rm -f $Kernel_PKG && \ rm -f $TOOLKIT_PKG
- 同时将如下加粗内容删除或注释。
# 安装TOOLKIT RUN umask 0022 && \ mkdir -p $ASCEND_BASE/driver && \ if [ "$CHIP" != "all" ]; \ then \ CHIPOPTION="--chip=$CHIP"; \ else \ CHIPOPTION=""; \ fi && \ chmod +x $TOOLKIT_PKG && \ ./$TOOLKIT_PKG --quiet --install --install-path=$ASCEND_BASE --install-for-all $CHIPOPTION && \ # bash /tmp/Ascend-cann-kernels-xxx_*.run --install-path=/usr/local/Ascend/ --install --quiet --install-for-all && \ # bash /tmp/Ascend-cann-kernels-xxx_*.run --install-path=/usr/local/Ascend/ --install --quiet --install-for-all && \ rm -f $TOOLKIT_PKG
- 修改完成后保存。
- 添加如下加粗内容。
- 请在当前目录准备以下软件包和相关文件。
- 在当前目录执行以下命令构建镜像ascend-toolkit。
docker build -t ascend-toolkit:toolkit_TAG --build-arg BASE_VERSION=base_TAG .
注意不要遗漏命令结尾的“.”,命令解释如表3所示。
表3 命令参数说明 参数
说明
ascend-toolkit:toolkit_TAG
镜像名称与标签,建议将toolkit_TAG命名为“软件包版本-容器OS-架构”(例如“8.0.RC1-ubuntu18.04-arm64”)。
--build-arg
指定dockerfile文件内的参数。
BASE_VERSION
base_TAG为4.d中设置的镜像标签。
命令示例如下所示。
docker build -t ascend-toolkit:8.0.RC1-ubuntu18.04-arm64 --build-arg BASE_VERSION=20210106-ubuntu18.04-arm64 .
- 进入Dockerfile所在路径。
- 基于镜像ascend-toolkit,构建镜像ascend-mindspore。
- 进入Dockerfile所在路径。
cd /home/ascend-docker-image-master/ascend-mindspore
- 请在当前目录准备以下软件包和相关文件。
- 在当前目录下执行vi Dockerfile命令,修改Dockerfile文件。
- 修改如下加粗内容:
RUN umask 0022 && \ groupadd HwHiAiUser -g 1000 && \ useradd -d /home/HwHiAiUser -u 1000 -g 1000 -m -s /bin/bash HwHiAiUser && \ pip3 install easydict && \ mkdir -p $ASCEND_BASE/driver && \ declare -A ARCHS_SUFFIX=(['x86_64']='x86' ['aarch64']='aarch64') && \ ARCH=$(uname -m) && \ OS_ID=$(grep -oP "^ID=\"?\K\w+" /etc/os-release) && \ if [ "$OS_ID" == "ubuntu" ]; then \ apt-get update; \ apt-get install --no-install-recommends libnuma1 libgomp1 libxml2 -y; \ rm -rf /var/lib/apt/lists/*; \ elif [ "$OS_ID" == "centos" ]; then \ yum makecache fast; \ yum -y install numactl-libs libgomp libxml2; \ yum clean all; \ fi && \ if [ "$ARCH" == "aarch64" ]; then \ pip3 install psutil; \ fi && \ pip3 install /tmp/mindspore-*.whl && \ rm -rf $ASCEND_BASE/driver && \ rm -rf /tmp/*
- 将以下内容删除。
COPY --chown=HwHiAiUser:HwHiAiUser Open_Source_Software_Notice.txt /home/HwHiAiUser/Open_Source_Software_Notice.txt COPY --chown=HwHiAiUser:HwHiAiUser Resnet50_Cifar_for_MindSpore /home/HwHiAiUser/Resnet50_Cifar_for_MindSpore COPY --chown=HwHiAiUser:HwHiAiUser test_model.sh /home/HwHiAiUser/test_model.sh
内容删除后,执行:wq!命令保存文件并退出。
- 修改如下加粗内容:
- 在当前目录执行以下命令构建镜像ascend-mindspore。
docker build -t ascend-mindspore:mindspore_TAG --build-arg BASE_VERSION=toolkit_TAG .
注意不要遗漏命令结尾的“.”,命令解释如表5所示。
表5 命令参数说明 参数
说明
ascend-mindspore:mindspore_TAG
镜像名称与标签,建议将mindspore_TAG命名为“软件包版本-容器OS-架构”(例如“8.0.RC1-ubuntu18.04-arm64”)。
--build-arg
指定dockerfile文件内的参数。
BASE_VERSION
toolkit_TAG为5.d中设置的镜像标签。
- 进入Dockerfile所在路径。
部署容器
当宿主机环境为CentOS系统时,由于CentOS的安全模块selinux默认开启,会导致挂载到容器的本地目录没有执行权限,因此需要临时关闭selinux,命令为:su -c "setenforce 0"。完成相关业务后再重新开启selinux,命令为: su -c "setenforce 1"。
- 请执行如下命令基于新镜像运行一个容器。
docker run -itd -e ASCEND_VISIBLE_DEVICES=xxx --pids-limit 409600 image-name:tag /bin/bash
表6 参数解释 参数
参数说明
ASCEND_VISIBLE_DEVICES=xxx
使用ASCEND_VISIBLE_DEVICES环境变量指定被挂载至容器中的NPU设备(用户可执行ls /dev/ | grep davinci*命令查询宿主机的NPU设备),使用设备序号指定设备,支持单个和范围指定且支持混用。例如:
--pids-limit 409600
当host宿主机系统为CentOS和BC-linux时,docker内的线程数最大为4092,无法满足训练要求,启动容器时需要添加该参数以配置CentOS/BC-linux下docker的最大线程。
image-name:tag
镜像名称与标签,填写6.d中构建的镜像和tag(如“ascend-mindspore:8.0.RC1-ubuntu18.04-arm64”)。
命令示例:
docker run -itd -e ASCEND_VISIBLE_DEVICES=0 ascend-mindspore:8.0.RC1-ubuntu18.04-arm64 /bin/bash
执行该命令后,如果显示容器ID(本例为“1dc80f32c263”),则表示已经启动该容器。
执行如下命令进入容器。
docker exec -it 容器ID /bin/bash docker exec -it 1dc80f32c263 /bin/bash
回显以下信息,表示成功进入该容器。
HwHiAiUser@1dc80f32c263:~$
如果用户在宿主机创建了模型文件目录(用于容器中调用模型进行训练),可以在启动容器时挂载模型目录(如“/data/model ”),命令示例如下所示:
docker run -itd -e ASCEND_VISIBLE_DEVICES=0 -v /data/model:/data/model ascend-mindspore:8.0.RC1-ubuntu18.04-arm64 /bin/bash
- 容器启动后,执行以下命令查看当前docker容器中可以使用的davinci设备:
ls /dev/ | grep davinci*
命令执行情况如下图。
其中:
- davinci_manager为管理模块的字符设备节点。
- davinci0为该容器使用的davinci设备。
查看容器目录结构
- 查看“/usr/local/Ascend”目录结构。
cd /usr/local/Ascend ll
图1 “/usr/local/Ascend”目录结构
- 查看“/usr/local/Ascend/ascend-toolkit”目录结构。
cd /usr/local/Ascend/ascend-toolkit ll
图2 “/usr/local/Ascend/ascend-toolkit”目录结构
删除容器镜像
用户可将不需要的容器镜像删除,避免占用磁盘空间。
- 删除容器
- 以root用户登录服务器。
- 执行如下命令查看CONTAINER ID(容器ID)。
# 查看正在运行的容器 docker ps # 查看所有容器 docker ps -a
回显类似如下信息(容器ID为“5f45daf9eb8f”):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5f45daf9eb8f ascend-toolkit:8.0.RC1 "/bin/bash" 39 seconds ago Up 28 minutes boring_wright
- 删除正在运行的容器,需要先将容器停止运行。若删除的是已经停止运行的容器,请跳过该步骤。
docker stop CONTAINER ID # 命令示例 docker stop 5f45daf9eb8f
- 执行如下命令删除容器。
docker rm CONTAINER ID # 命令示例 docker rm 5f45daf9eb8f
- 删除镜像
容器镜像导出导入
用户可将容器导出为一个镜像文件,再导入其它服务器使用。
- 以root用户登录服务器。
- 执行docker ps -a命令查看容器。回显类似如下信息(该容器仅为示例,请用户以实际情况为准):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2ad9695f9589 ascend-toolkit:8.0.RC1-ubuntu18.04-arm64 "/bin/bash" 41 hours ago Up 41 hours cranky_lamport
- 执行如下命令将容器保存成镜像。
docker commit CONTAINER ID image-name:tag
表7 命令参数说明 参数
参数说明
CONTAINER ID
容器ID。
image-name:tag
镜像名称与标签,用户可自定义。(例:ascend-toolkit:8.0.RC1-ubuntu18.04-arm64-20230109)。
命令示例如下:
docker commit 2ad9695f9589 ascend-toolkit:8.0.RC1-ubuntu18.04-arm64-20230109
- 执行docker images命令查看镜像。回显类似如下信息(该镜像仅为示例,请用户以实际情况为准):
REPOSITORY TAG IMAGE ID CREATED SIZE ascend-toolkit 8.0.RC1-ubuntu18.04-arm64-20230109 c885a9197446 9 seconds ago 5.62GB
- 执行如下命令保存镜像文件。
docker save -o image.tar image-name:tag
表8 命令参数说明 参数
参数说明
image.tar
镜像压缩文件名称,用户可自定义。(例:ascend-toolkit.tar)
image-name:tag
镜像名称与标签,填写3中保存的镜像和tag(如“ascend-toolkit:8.0.RC1-ubuntu18.04-arm64-20230109”)。
命令示例如下:
docker save -o ascend-toolkit.tar ascend-toolkit:8.0.RC1-ubuntu18.04-arm64-20230109
镜像打包完成后,会在当前目录下生成,执行ls命令查看。
[root@localhost zzh]# ls ascend-toolkit.tar
- 将生成的镜像文件下载至本地,再将镜像文件上传到另一台服务器的任意目录(如“/home”),在存放镜像的目录下执行docker load -i ascend-toolkit.tar命令导入镜像,再执行docker images命令查看镜像是否已导入,回显如下镜像信息表示导入成功。
REPOSITORY TAG IMAGE ID CREATED SIZE ascend-toolkit 8.0.RC1-ubuntu18.04-arm64-20230109 c885a9197446 About an hour ago 5.62GB