有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

操作场景

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.8
ARG TF_VERSION_DEFAULT=1.15.0
ARG HOROVOD_VERSION_DEFAULT=0.21.3

FROM ${BASE} AS base0
#install basic utils
ARG BASE
ENV DISTRO redhat
ENV OS_VERSION rhel7.4
ENV OS_VERSION_SHORT rhel7
ENV PLATFORM x86_64
WORKDIR /root

FROM base0 AS base1
ARG TF_VERSION_DEFAULT
ARG TF_VERSION_DEFAULT
ARG HOROVOD_VERSION_DEFAULT
ENV TF_VERSION ${TF_VERSION_DEFAULT}
ENV HOROVOD_VERSION ${HOROVOD_VERSION_DEFAULT}
WORKDIR /root
RUN 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 base2
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 \\
&& 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.8
ARG TF_VERSION_DEFAULT=2.4.0
ARG HOROVOD_VERSION_DEFAULT=0.21.3

FROM ${BASE} AS base0
#install basic utils
ARG BASE
ENV DISTRO redhat
ENV OS_VERSION rhel7.4
ENV OS_VERSION_SHORT rhel7
ENV PLATFORM x86_64
WORKDIR /root

FROM base0 AS base1
ARG TF_VERSION_DEFAULT
ARG HOROVOD_VERSION_DEFAULT
ENV TF_VERSION ${TF_VERSION_DEFAULT}
ENV HOROVOD_VERSION ${HOROVOD_VERSION_DEFAULT}
WORKDIR /root
RUN 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 base2
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 \\
&& 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/bash

export TF_VERSION_DEFAULT=2.4.0
export HOROVOD_VERSION_DEFAULT=0.21.3
export BASE=ccr.ccs.tencentyun.com/qcloud-ti-platform/ti-cloud-gpu-image-py3.8-devel:1.0.8

CCR_REGISTRY_NAMESPACE=ccr.ccs.tencentyun.com/your_namespace
IMAGE_VERSION='1.0.8'
CCR_IMAGE_NAME=$CCR_REGISTRY_NAMESPACE/ti-cloud-tf2.4-gpu-devel

DOCKER_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.8
ARG TF_VERSION_DEFAULT=2.4.0
ARG HOROVOD_VERSION_DEFAULT=0.21.3

FROM ${BASE} AS base0
#install basic utils
ARG BASE
ENV DISTRO redhat
ENV OS_VERSION rhel7.4
ENV OS_VERSION_SHORT rhel7
ENV PLATFORM x86_64
WORKDIR /root


FROM base0 AS base1
ARG TF_VERSION_DEFAULT
ARG HOROVOD_VERSION_DEFAULT
ENV TF_VERSION ${TF_VERSION_DEFAULT}
ENV HOROVOD_VERSION ${HOROVOD_VERSION_DEFAULT}
WORKDIR /root
RUN 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 horovod

FROM base1 AS base2
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 \\
&& 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