操作场景
TI 平台预置了 TensorFlow、Pytorch 等流行的机器学习框架,方便用户快速提交训练任务。除了平台预置的框架外,TI 还允许使用自定义镜像到平台进行训练。
无论您使用哪种编程语言、系统环境、机器学习框架,及需要安装哪些库依赖,只要您的自定义镜像及训练脚本遵循 TI 的容器规范约束,即可在 TI 平台完成训练。
本文档将向您介绍 TI 自定义镜像的制作规范,再通过几个典型案例向您演示如何制作镜像。
平台基础镜像说明
平台提供的基础镜像包括以下几个:
1.
ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-common-image-devel:1.0.8
基于腾讯自研的操作系统,安装了常用系统工具(git、cmake、wget、curl、tcpdump、rz,sz,vi,vim,telnet,tcpdump,dig,wget,curl,zip,tar 等等各种常见工具)以及常见深度学习框架 TensorFlow、PyTorch 依赖 gcc-7.3.0,open-mpi 等。
不推荐使用 Python2 以及 Python3 以下版本,所以推荐平台预装了 Python 的版本。平台依赖 coscmd,需要自行安装。2.
ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-common-image-py3.7.13-devel:1.0.8
基于1中所述镜像,安装了3.7.13版本的 Python,安装了 pip3、xgboost、sklearn、pandas、tensorBoard 等常用工具以及coscmd 等操作 cos 的工具。
可以利用该版本的镜像构建 TensorFlow1.x 版本的 CPU 镜像。3.
ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-common-image-py3.8.13-devel:1.0.8
基于1中所述镜像,安装了3.8.13版本的 Python,安装了 xgboost、sklearn、pandas、tensorBoard 等常用工具以及 coscmd 等操作 cos 的工具。
可以利用该版本的镜像构建 TensorFlow2.x 版本、PyTorch 的 CPU 镜像。4.
ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-gpu-image-py3.7-devel:1.0.8
基于2中所述镜像,安装了常用的GPU依赖包:cuda-10.0、navidia cudnn-7.6.5.32-1、navidia libnccl-2.4.8-1 等。
可以利用该版本的镜像构建 TensorFlow1.x 版本的 GPU 镜像。5.
ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-gpu-image-py3.8-devel:1.0.8
基于3中所述镜像,安装了常用的 GPU 依赖包:cuda-11.1.1、navidia cudnn-8.0.5.39-1、navidia libnccl-2.11.4-1 等。
可以利用该版本的镜像构建 TensorFlow2.x 版本、PyTorch 的 GPU 镜像。自定义镜像规范说明
1. 镜像内部无外网权限,所以自定义镜像获取软件源需要安装 tencentyun 软件源中的镜像。自定义镜像中需要替换软件源,操作如下:
RUN sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/tlinux.repo \\&& sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/tlinux-sources.repo \\&& sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/epel.repo
2. 容器启动前会执行 source .bashrc,因此要添加的环境变量,可以提前写入自定义镜像的 .bashrc 文件中。
3. 平台基础镜像已经进行了缓存处理,使用平台 base 镜像构建镜像,可以充分复用已经缓存的层,拉取镜像大小变小,启动任务更快速。具体内容可以参考下面的典型案例。
典型案例
1. 下面的例子实现了一个 Tensorflow1.15-CPU 自定义镜像
ARG BASE=ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-common-image-py3.7.13-devel:1.0.8ARG TF_VERSION_DEFAULT=1.15.0ARG HOROVOD_VERSION_DEFAULT=0.21.3FROM ${BASE} AS base0#install basic utilsARG BASEENV DISTRO redhatENV OS_VERSION rhel7.4ENV OS_VERSION_SHORT rhel7ENV PLATFORM x86_64WORKDIR /rootFROM base0 AS base1ARG TF_VERSION_DEFAULTARG TF_VERSION_DEFAULTARG HOROVOD_VERSION_DEFAULTENV TF_VERSION ${TF_VERSION_DEFAULT}ENV HOROVOD_VERSION ${HOROVOD_VERSION_DEFAULT}WORKDIR /rootRUN pip3 install --no-cache-dir tensorflow-cpu==$TF_VERSION# install horovod from source.RUN git clone -b v$HOROVOD_VERSION --single-branch --recursive --depth 1 https://github.com/horovod/horovod.git \\&& pushd horovod \\&& rm -rf dist \\&& python3 setup.py sdist \\&& HOROVOD_WITH_TENSORFLOW=1 HOROVOD_WITHOUT_PYTORCH=1 \\pip3 install -v dist/*horovod*.tar.gz --no-cache-dir 2>&1 | tee trace.log \\&& popd \\&& rm -rf horovod \\FROM base1 AS base2RUN sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/tlinux.repo \\&& sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/tlinux-sources.repo \\&& sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/epel.repo \\&& pip3 config --user set global.index-url http://mirrors.tencentyun.com/pypi/simple \\&& pip3 config --user set install.trusted-host mirrors.tencentyun.com
2. 下面的例子实现了一个 Tensorflow2.4-GPU 自定义镜像
ARG BASE=ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-common-image-py3.8.13-devel:1.0.8ARG TF_VERSION_DEFAULT=2.4.0ARG HOROVOD_VERSION_DEFAULT=0.21.3FROM ${BASE} AS base0#install basic utilsARG BASEENV DISTRO redhatENV OS_VERSION rhel7.4ENV OS_VERSION_SHORT rhel7ENV PLATFORM x86_64WORKDIR /rootFROM base0 AS base1ARG TF_VERSION_DEFAULTARG HOROVOD_VERSION_DEFAULTENV TF_VERSION ${TF_VERSION_DEFAULT}ENV HOROVOD_VERSION ${HOROVOD_VERSION_DEFAULT}WORKDIR /rootRUN pip3 install --no-cache-dir tensorflow-cpu==$TF_VERSION# install horovod from source.RUN git clone -b v$HOROVOD_VERSION --single-branch --recursive --depth 1 https://github.com/horovod/horovod.git \\&& pushd horovod \\&& rm -rf dist \\&& python3 setup.py sdist \\&& HOROVOD_WITH_TENSORFLOW=1 HOROVOD_WITHOUT_PYTORCH=1 \\pip3 install -v dist/*horovod*.tar.gz --no-cache-dir 2>&1 | tee trace.log \\&& popd \\&& rm -rf horovodFROM base1 AS base2RUN sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/tlinux.repo \\&& sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/tlinux-sources.repo \\&& sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/epel.repo \\&& pip3 config --user set global.index-url http://mirrors.tencentyun.com/pypi/simple \\&& pip3 config --user set install.trusted-host mirrors.tencentyun.com
制作镜像
镜像制作推荐在腾讯云 CVM 上制作,并推送到腾讯云镜像仓库
#!/bin/bashexport TF_VERSION_DEFAULT=2.4.0export HOROVOD_VERSION_DEFAULT=0.21.3export BASE=ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-gpu-image-py3.8-devel:1.0.8CCR_REGISTRY_NAMESPACE=ccr.ccs.tencentyun.com/your_namespaceIMAGE_VERSION='1.0.8'CCR_IMAGE_NAME=$CCR_REGISTRY_NAMESPACE/ti-cloud-tf2.4-gpu-develDOCKER_BUILDKIT=1 docker build --network host \\--build-arg TF_VERSION_DEFAULT=$TF_VERSION_DEFAULT \\--build-arg HOROVOD_VERSION_DEFAULT=$HOROVOD_VERSION_DEFAULT \\--build-arg BASE \\-t "$CCR_IMAGE_NAME":${IMAGE_VERSION} .docker push "$CCR_IMAGE_NAME":${IMAGE_VERSION}ARG BASE=ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-gpu-image-py3.8-devel:1.0.8ARG TF_VERSION_DEFAULT=2.4.0ARG HOROVOD_VERSION_DEFAULT=0.21.3FROM ${BASE} AS base0#install basic utilsARG BASEENV DISTRO redhatENV OS_VERSION rhel7.4ENV OS_VERSION_SHORT rhel7ENV PLATFORM x86_64WORKDIR /rootFROM base0 AS base1ARG TF_VERSION_DEFAULTARG HOROVOD_VERSION_DEFAULTENV TF_VERSION ${TF_VERSION_DEFAULT}ENV HOROVOD_VERSION ${HOROVOD_VERSION_DEFAULT}WORKDIR /rootRUN pip3 install --no-cache-dir tensorflow-gpu==$TF_VERSION# install horovod from source.RUN git clone -b v$HOROVOD_VERSION --single-branch --recursive --depth 1 https://github.com/horovod/horovod.git \\&& pushd horovod \\&& rm -rf dist \\&& python3 setup.py sdist \\# && HOROVOD_GPU_OPERATIONS=NCCL \\&& HOROVOD_GPU_BROADCAST=NCCL HOROVOD_GPU_ALLGATHER=NCCL HOROVOD_GPU_ALLREDUCE=NCCL \\HOROVOD_NCCL_HOME=/usr/local/nccl HOROVOD_NCCL_INCLUDE=/usr/local/nccl/include HOROVOD_NCCL_LIB=/usr/local/nccl/lib \\HOROVOD_WITH_TENSORFLOW=1 HOROVOD_WITHOUT_PYTORCH=1 \\pip3 install -v dist/*horovod*.tar.gz --no-cache-dir 2>&1 | tee trace.log \\&& popd \\&& rm -rf horovodFROM base1 AS base2RUN sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/tlinux.repo \\&& sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/tlinux-sources.repo \\&& sed -i "s/mirrors.tencent.com/mirrors.tencentyun.com/g" /etc/yum.repos.d/epel.repo \\&& pip3 config --user set global.index-url http://mirrors.tencentyun.com/pypi/simple \\&& pip3 config --user set install.trusted-host mirrors.tencentyun.com \\&& ln -s /usr/local/cuda-11.1/targets/x86_64-linux/lib/libcusolver.so.11 /usr/local/cuda-11.1/targets/x86_64-linux/lib/libcusolver.so.10