训练镜像制作
训练镜像制作前需对物理机环境进行部署配置,准备好构建镜像所需的文件,具体请参见部署容器内的开发环境。
构建镜像
- 在用于构建镜像的目录下创建Dockerfile,包括基础镜像(base)和训练镜像(train)。
- 基础镜像主要包括编译环境和相关依赖软件的安装和配置,例如gcc、cmake、openmpi、python和部分Python依赖包。构建镜像的Dockerfile参考如下。其中基础镜像及具体命令请根据实际操作系统修改。
FROM centos:7.6.1810 as mxrec-base WORKDIR /tmp COPY . ./ RUN chmod 777 /tmp # 安装编译环境 RUN yum makecache && \ yum -y install centos-release-scl && \ yum -y install devtoolset-7 && \ yum -y install devtoolset-7-gcc-c++ && \ yum -y install epel-release && \ yum -y install wget zlib-devel bzip2 bzip2-devel openssl-devel ncurses-devel \ openssh-clients \ sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel \ xz-devel libffi-devel hdf5-devel patch pciutils && \ yum clean all && \ rm -rf /var/cache/yum && \ echo "source /opt/rh/devtoolset-7/enable" >> /etc/profile # 安装gcc 7.3.0 RUN source /etc/profile && \ tar -zxvf gcc-7.3.0.tar.gz && \ cd gcc-7.3.0 && \ wget https://mirrors.huaweicloud.com/gnu/gmp/gmp-6.1.0.tar.bz2 --no-check-certificate && \ wget --no-check-certificate https://mirrors.huaweicloud.com/gnu/mpfr/mpfr-3.1.4.tar.bz2 && \ wget --no-check-certificate https://mirrors.huaweicloud.com/gnu/mpc/mpc-1.0.3.tar.gz && \ wget --no-check-certificate https://mindx.obs.cn-south-1.myhuaweicloud.com/opensource/isl-0.16.1.tar.bz2 && \ sed -i "246s/tar -xf "${ar}"/tar --no-same-owner -xf "${ar}"/" contrib/download_prerequisites && \ ./contrib/download_prerequisites && \ ./configure --enable-languages=c,c++ --disable-multilib --with-system-zlib --prefix=/usr/local/gcc7.3.0 && \ make -j && make -j install && cd .. && \ find gcc-7.3.0/ -name libstdc++.so.6.0.24 -exec cp {} /lib64/ \; && \ rm -rf gcc-7.3.0* ENV LD_LIBRARY_PATH=/usr/local/gcc7.3.0/lib64:$LD_LIBRARY_PATH \ PATH=/usr/local/gcc7.3.0/bin:$PATH # 安装cmake RUN source /etc/profile && gcc -v && tar -zxf cmake-3.20.6.tar.gz && \ cd cmake-3.20.6 && \ ./bootstrap && make && make install && \ rm -rf ../cmake-3.20.6* # 安装openmpi RUN source /etc/profile && gcc -v && tar zxf openmpi-4.1.5.tar.gz && \ cd openmpi-4.1.5 && \ sed -i 's/stxr/stlxr/g' opal/include/opal/sys/arm64/atomic.h && \ sed -i 's/ldxr/ldaxr/g' opal/include/opal/sys/arm64/atomic.h && \ sed -i 's/stxr/stlxr/g' opal/mca/pmix/pmix3x/pmix/src/atomics/sys/arm64/atomic.h && \ sed -i 's/ldxr/ldaxr/g' opal/mca/pmix/pmix3x/pmix/src/atomics/sys/arm64/atomic.h && \ ./configure --enable-orterun-prefix-by-default --prefix=/usr/local/openmpi && \ make -j && make -j install && cd .. && rm -rf openmpi-4.1.5* ENV LD_LIBRARY_PATH=/usr/local/openmpi/lib:$LD_LIBRARY_PATH \ PATH=/usr/local/openmpi/bin:$PATH # 安装easy_profiler RUN source /etc/profile && gcc -v && tar xf easy_profiler-2.1.0.tar.gz && \ cd easy_profiler-2.1.0 && cmake . && make -j && make install && \ cd .. && rm -rf easy_profiler-2.1.0* ENV LD_LIBRARY_PATH=/usr/local/openmpi/lib:/usr/lib/x86_64-linux-gnu/hdf5/serial:$LD_LIBRARY_PATH \ PATH=/usr/local/openmpi/bin:$PATH # scl enable devtoolset-7 bash SHELL ["/usr/bin/scl", "enable", "devtoolset-7"] # 安装Python RUN wget --no-check-certificate https://repo.huaweicloud.com/python/3.7.5/Python-3.7.5.tar.xz && \ tar -xf Python-3.7.5.tar.xz && \ cd Python-3.7.5 && \ mkdir build && cd build && \ ../configure --enable-shared --prefix=/usr/local/python3.7.5 && \ make -j && make install && \ cd .. && rm -rf build && cd .. && rm -rf Python-3.7.5* && \ ldconfig ENV PATH=$PATH:/usr/local/python3.7.5/bin \ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/python3.7.5/lib RUN mkdir ~/.pip && touch ~/.pip/pip.conf && \ echo "[global]" > ~/.pip/pip.conf && \ echo "trusted-host=pypi.douban.com" >> ~/.pip/pip.conf && \ echo "index-url=http://pypi.douban.com/simple/" >> ~/.pip/pip.conf && \ echo "timeout=200" >> ~/.pip/pip.conf # python包 RUN pip3.7 install -U pip && \ pip3.7 install numpy && \ pip3.7 install decorator && \ pip3.7 install sympy==1.4 && \ pip3.7 install cffi==1.12.3 && \ pip3.7 install pyyaml && \ pip3.7 install pathlib2 && \ pip3.7 install grpcio && \ pip3.7 install grpcio-tools && \ pip3.7 install protobuf==3.20.0 && \ pip3.7 install scipy && \ pip3.7 install requests && \ pip3.7 install mpi4py && \ pip3.7 install scikit-learn==0.20.0 && \ pip3.7 install easydict && \ pip3.7 install attrs && \ rm -rf /root/.cache/pip # 训练镜像涉及CANN、TFPlugin、mxRec等软件的安装,追加构建的Dockerfile参考如下 FROM mxrec-base ARG ASCEND_BASE=/usr/local/Ascend ARG CHIP=all WORKDIR /tmp RUN useradd -d /home/HwHiAiUser -u 1000 -m -s /bin/bash HwHiAiUser # 安装cann和tfplugin # 1.1 驱动路径环境变量设置 ENV LD_LIBRARY_PATH=\ $ASCEND_BASE/driver/lib64:\ $ASCEND_BASE/driver/lib64/common:\ $ASCEND_BASE/driver/lib64/driver:\ $LD_LIBRARY_PATH # 2.1 cann相关 ARG TOOLKIT_PKG=Ascend-cann-toolkit*.run # 2.2 TF安装相关 ARG TFPLUGIN_PKG=Ascend-cann-tfplugin*.run # MODIFIED TF=1.15.0 or TF=2.6.5 ARG TF_PKG=tensorflow-cpu== # 3. 安装cann-toolkit和tfplugin,及其他python依赖包 RUN umask 0022 && \ mkdir -p $ASCEND_BASE/driver && \ cp version.info $ASCEND_BASE/driver/ && \ cp ascend_install.info /etc/ && \ if [ "$CHIP" != "all" ]; \ then \ CHIPOPTION="--chip=$CHIP"; \ else \ CHIPOPTION=""; \ fi && \ chmod +x $TOOLKIT_PKG && \ bash $TOOLKIT_PKG --quiet --install --install-path=$ASCEND_BASE \ --install-for-all $CHIPOPTION && \ source $ASCEND_BASE/ascend-toolkit/set_env.sh && \ chmod +x ./$TFPLUGIN_PKG && \ bash $TFPLUGIN_PKG --quiet --install \ --install-for-all && \ source $ASCEND_BASE/tfplugin/set_env.sh && \ rm -f ./$TFPLUGIN_PKG && \ pip3.7 install $TF_PKG && \ HOROVOD_WITH_MPI=1 HOROVOD_WITH_TENSORFLOW=1 pip3.7 install horovod --no-cache-dir && \ pip3.7 install tf_slim && \ pip3.7 install funcsigs && \ rm -rf /root/.cache/pip && \ rm -f $TOOLKIT_PKG && \ rm -rf $ASCEND_BASE/driver && \ rm -f /etc/ascend_install.info # 安装mx-rec, MODIFIED tf1 or tf2 RUN tar -xf Ascend-mindxsdk-mxrec-*.tar.gz && \ pip3 install mindxsdk-mxrec/{tf1|tf2}-whl/mx_rec-*.whl # 清理临时目录 RUN rm -rf ./*
- 构建镜像,命令参考如下。
docker build -t mxrec-{tf1|tf2}:cann-{version} .
启动容器
- 启动容器参考命令:
docker run -it --name ${container_name} --net=host --shm-size="300g" -e ASCEND_VISIBLE_DEVICES=0-7 -v /etc/localtime:/etc/localtime -v /data:/data -v /root/.ssh:/root/.ssh mxrec-{tf1|tf2}:cann-{version} /bin/bash
docker参数说明:
- 需要使用Host网络:--net=host。
- 需要配置足够的共享内存(shared memory):--shm-size。
- 保证容器内的时区和系统的时区一致:-v /etc/localtime:/etc/localtime。
- 若用户已经完成准备安装环境,Ascend Docker Runtime会为用户默认挂载驱动以及设备相关的文件,具体可参见《MindX DL Ascend Docker Runtime用户指南》,用户可通过“-e ASCEND_VISIBLE_DEVICES”使用设备序号指定挂载至容器中的NPU设备。如果不使用该参数,可使用“--device”手动挂载设备启动容器。
若没有安装Ascend Docker Runtime,则需要在启动容器命令中增加“-v /usr/local/Ascend/driver/:/usr/local/Ascend/driver”指定挂载驱动目录。
- 如需使用numactl绑定memory操作,需要在特权模式下运行,即启动容器命令中增加--privileged参数。
- CANN软件提供进程级环境变量设置脚本,供用户在进程中引用,以自动完成环境变量设置。用户进程结束后自动失效。
示例如下(以root用户默认安装路径“/usr/local/Ascend”为例),可在程序启动的shell脚本中使用如下命令设置CANN的相关环境变量,也可在bash命令行窗口中执行如下命令:
source /usr/local/Ascend/ascend-toolkit/set_env.sh source /usr/local/Ascend/tfplugin/set_env.sh
(可选)动态扩容算子包安装
如需使用动态扩容功能,请参考本步骤编译安装动态扩容算子包。
- 启动容器,设置CANN相关环境变量,具体请参见启动容器。
- 进入已解压的mxRec软件包“mindxsdk-mxrec/cust_op/cust_op_by_addr”目录中,参考以下命令编译动态扩容算子包。
bash run.sh
- 编译完成后,将在当前目录(“mindxsdk-mxrec/cust_op/cust_op_by_addr”)下生成“custom_op”算子包文件夹。
- 进入算子包文件夹(“mindxsdk-mxrec/cust_op/cust_op_by_addr/custom_op/build_out”),参考以下命令执行“custom_opp_centos_{arch}.run”。
bash custom_opp_centos_{arch}.run
父主题: 常用操作