更新时间:2025-03-04 gmt 08:00

在ecs上构建自定义镜像并在notebook中使用-九游平台

使用场景和构建流程说明

用户可以使用modelarts提供的基础镜像或第三方的镜像来编写dockerfile,在ecs服务器上构建出完全适合自己的镜像。然后将镜像进行注册,用以创建新的开发环境,满足自己的业务需求。

本案例将基于modelarts提供的pytorch基础镜像,安装pytorch 1.8、ffmpeg 3和gcc 8,构建一个面向ai开发的新环境。

主要流程如下图所示:

图1 构建与调测镜像流程

本案例适用于华为云-北京四region。

notebook自定义镜像规范

制作自定义镜像时,base镜像需满足如下规范:

  • 基于昇腾、dockerhub九游平台官网等官方开源的镜像制作,开源镜像需要满足如下操作系统约束:

    x86:ubuntu18.04、ubuntu20.04

    arm:euler2.8.3、euler2.10.7

    ubuntu20.04.6可能有兼容性问题,请优先使用低于该版本的操作系统。

  • 不满足以上镜像规范,所制作的镜像使用可能会出现故障,请用户检查镜像规范,并参考notebook自定义镜像故障基础排查自行排查,如未解决请联系华为技术工程师协助解决。

操作流程

  1. 准备一台linux环境,这里以ecs为例。
  2. 在ecs中构建镜像(本文档提供了dockflie样例文件)。
  3. 将构建的镜像推到swr。
  4. 注册swr镜像到modelarts。
  5. 创建notebook并验证新镜像。

准备docker机器并配置环境信息

准备一台具有docker功能的机器,如果没有,建议申请一台弹性云服务器并购买弹性公网ip,并在准备好的机器上安装必要的软件。

modelarts提供了ubuntu系统的脚本,方便安装docker。

本地linux机器的操作等同ecs服务器上的操作,请参考本案例。

  1. 登录ecs控制台,购买弹性云服务器,镜像选择“公共镜像”,推荐使用ubuntu18.04的镜像;系统盘设置为100gib。具体操作请参考购买并登录弹性云服务器
    图2 选择镜像和磁盘
  2. 购买弹性公网ip并绑定到弹性云服务器。具体操作请参考配置网络
  3. 配置vm环境。
    1. 在docker机器中,使用如下命令下载安装脚本。
      wget https://cnnorth4-modelarts-sdk.obs.cn-north-4.myhuaweicloud.com/modelarts/custom-image-build/install_on_ubuntu1804.sh

      当前仅支持ubuntu系统的脚本。

    2. 在docker机器中并执行如下命令,即可完成环境配置。
      bash install_on_ubuntu1804.sh
      图3 配置成功
      source /etc/profile

      安装脚本依次执行了如下任务:

      1. 安装docker。
      2. 如果挂载了gpu,则会安装nvidia-docker2,用以将gpu挂载到docker容器中。

制作自定义镜像

这一节描述如何编写一个dockerfile,并据此构建出一个新镜像在notebook创建实例并使用。关于dockerfile的具体编写方法,请参考。

  1. 查询基础镜像(第三方镜像可跳过此步骤)

    modelarts提供的公共镜像,请参考notebook专属预置镜像列表,根据预置镜像的引擎类型在对应的章节查看镜像url。

  2. 连接容器镜像服务。
    1. 登录容器镜像服务控制台。选择左侧导航栏的“总览”,单击页面右上角的“登录指令”,在弹出的页面中单击复制登录指令。
      图4 获取登录指令
      • 此处生成的登录指令有效期为24小时,如果需要长期有效的登录指令,请参见获取长期有效登录指令。获取了长期有效的登录指令后,在有效期内的临时登录指令仍然可以使用。
      • 登录指令末尾的域名为镜像仓库地址,请记录该地址,后面会使用到。
    2. 在安装容器引擎的机器中执行上一步复制的登录指令。登录成功会显示“login succeeded”。
  3. 拉取基础镜像或第三方镜像(此处以基础镜像举例,第三方镜像直接替换镜像地址)。

    拉取modelarts提供的公共镜像(请参考预置镜像)。

    docker pull swr.cn-north-4.myhuaweicloud.com/atelier/notebook2.0-pytorch-1.4-kernel-cp37:3.3.3-release-v1-20220114
  4. 编写dockerfile。

    vim一个dockerfile,如果使用的基础镜像是modelarts提供的公共镜像,dockerfile的具体内容可参考dockerfile文件(基础镜像为modelarts提供)

    如果使用的基础镜像是第三方镜像(非modelarts提供的公共镜像),dockerfile文件中需要添加uid为1000的用户ma-user和gid为100的用户组ma-group,具体可参考dockerfile文件(基础镜像为非modelarts提供)

    本例的dockerfile将基于pytorch基础镜像安装pytorch 1.8、ffmpeg 3和gcc 8,构建一个面向ai任务的镜像。

  1. 构建镜像

    使用docker build命令从dockerfile构建出一个新镜像。命令参数解释如下:

    • “-t” 指定了新的镜像地址,包括{局点信息}/{组织名称}/{镜像名称}:{版本名称},请根据实际填写。建议使用完整的swr地址,因为后续的调试和注册需要使用。
    • “-f ”指定了dockerfile的文件名,根据实际填写。
    • 最后的“ . ”指定了构建的上下文是当前目录,根据实际填写。
    docker build -t swr.cn-north-4.myhuaweicloud.com/sdk-test/pytorch_1_8:v1 -f dockerfile .
    图5 构建成功

注册新镜像

调试完成后,将新镜像注册到modelarts镜像管理服务中,进而能够在modelarts中使用该镜像。

  1. 将镜像推到swr

    推送前需要登录swr,请参考登录swr。登录后使用docker push命令进行推送,如下:

    docker push swr.cn-north-4.myhuaweicloud.com/sdk-test/pytorch_1_8:v1

    完成后即可在swr上看到该镜像。

    图6 将镜像推到swr

    swr地址,包括{局点信息}/{组织名称}/{镜像名称}:{版本名称},局点信息可以参考下图查看,组织名称在“容器镜像服务>组织管理”创建。

  2. 注册镜像

    在modelarts console上注册镜像

    登录modelarts控制台,在左侧导航栏选择“镜像管理”,进入镜像管理页面。

    1. 单击“注册镜像”,镜像源即为步骤1中推送到swr中的镜像。请将完整的swr地址复制到这里即可,或单击可直接从swr选择自有镜像进行注册。
    2. “架构”“类型”根据实际情况选择,与镜像源保持一致。

    注册镜像时,“架构”“类型”需要和镜像源保持一致,否则在使用此自定义镜像创建notebook时会创建失败。

创建开发环境并使用

  1. 镜像注册成功后,即可在modelarts控制台的notebook页面,创建开发环境时选择该自定义镜像。
    图7 创建开发环境
  2. 打开开发环境,即可看到dockerfile中创建的conda环境pytorch_1_8。
    图8 打开开发环境
  3. 单击图中的pytorch_1_8,即可创建一个ipynb文件,导入torch,可以看到安装的pytorch 1.8已经能够使用。
    图9 创建一个ipynb文件
  4. 再打开一个terminal,查看ffmpeg和gcc的版本,是dockerfile中安装的版本。
    图10 查看ffmpeg和gcc的版本

dockerfile文件(基础镜像为modelarts提供)

vim一个dockerfile文件。基础镜像为modelarts提供的镜像时,dockerfile文件的具体内容如下:

from swr.cn-north-4.myhuaweicloud.com/atelier/notebook2.0-pytorch-1.4-kernel-cp37:3.3.3-release-v1-20220114
user root
# section1: config apt source
run mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
    echo -e "deb http://repo.huaweicloud.com/ubuntu/ bionic main restricted\ndeb http://repo.huaweicloud.com/ubuntu/ bionic-updates main restricted\ndeb http://repo.huaweicloud.com/ubuntu/ bionic universe\ndeb http://repo.huaweicloud.com/ubuntu/ bionic-updates universe\ndeb http://repo.huaweicloud.com/ubuntu/ bionic multiverse\ndeb http://repo.huaweicloud.com/ubuntu/ bionic-updates multiverse\ndeb http://repo.huaweicloud.com/ubuntu/ bionic-backports main restricted universe multiverse\ndeb http://repo.huaweicloud.com/ubuntu bionic-security main restricted\ndeb http://repo.huaweicloud.com/ubuntu bionic-security universe\ndeb http://repo.huaweicloud.com/ubuntu bionic-security multiverse" > /etc/apt/sources.list && \
    apt-get update
# section2: install ffmpeg and gcc
run apt-get -y install ffmpeg && \
    apt -y install gcc-8 g  -8 && \
    update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g   g   /usr/bin/g  -8 && \
    rm $home/.pip/pip.conf
user ma-user
# section3: configure conda source and pip source
run echo -e "channels:\n  - defaults\nshow_channel_urls: true\ndefault_channels:\n  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main\n  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r\n  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2\ncustom_channels:\n  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n  pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud\n  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud" > $home/.condarc && \
    echo -e "[global]\nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple\n[install]\ntrusted-host = https://pypi.tuna.tsinghua.edu.cn" > $home/.pip/pip.conf
# section4: create a conda environment(only support python=3.7) and install pytorch1.8
run source /home/ma-user/anaconda3/bin/activate && \
    conda create -y --name pytorch_1_8 python=3.7 && \
    conda activate pytorch_1_8 && \
    pip install torch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 && \
    conda deactivate

dockerfile文件(基础镜像为非modelarts提供)

如果使用的镜像是第三方镜像,dockerfile文件中需要添加uid为1000的用户ma-user和gid为100的用户组ma-group。如果基础镜像中uid 1000或者gid 100已经被其他用户和用户组占用,需要将其对应的用户和用户组删除。如下dockerfile文件已添加指定的用户和用户组,您直接使用即可。

用户只需要设置uid为1000的用户ma-user和gid为100的用户组ma-group,并使ma-user有对应目录的读写执行权限,其他如启动cmd不需要关心,无需设置或更改。

vim一个dockerfile文件,添加第三方镜像(即非modelarts提供的官方镜像)为基础镜像,如以ubuntu18.04为例。dockerfile文件的具体内容如下:

# replace it with the actual image version.
from ubuntu:18.04
# set the user ma-user whose uid is 1000 and the user group ma-group whose gid is 100
user root
run default_user=$(getent passwd 1000 | awk -f ':' '{print $1}') || echo "uid: 1000 does not exist" && \
    default_group=$(getent group 100 | awk -f ':' '{print $1}') || echo "gid: 100 does not exist" && \
    if [ ! -z ${default_user} ] && [ ${default_user} != "ma-user" ]; then \
        userdel -r ${default_user}; \
    fi && \
    if [ ! -z ${default_group} ] && [ ${default_group} != "ma-group" ]; then \
        groupdel -f ${default_group}; \
    fi && \
    groupadd -g 100 ma-group && useradd -d /home/ma-user -m -u 1000 -g 100 -s /bin/bash ma-user && \
# grant the read, write, and execute permissions on the target directory to the user ma-user.
chmod -r 750 /home/ma-user
#configure the apt source and install the zip and wget tools (required for installing conda).
run mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
    echo "deb http://repo.huaweicloud.com/ubuntu/ bionic main restricted\ndeb http://repo.huaweicloud.com/ubuntu/ bionic-updates main restricted\ndeb http://repo.huaweicloud.com/ubuntu/ bionic universe\ndeb http://repo.huaweicloud.com/ubuntu/ bionic-updates universe\ndeb http://repo.huaweicloud.com/ubuntu/ bionic multiverse\ndeb http://repo.huaweicloud.com/ubuntu/ bionic-updates multiverse\ndeb http://repo.huaweicloud.com/ubuntu/ bionic-backports main restricted universe multiverse\ndeb http://repo.huaweicloud.com/ubuntu bionic-security main restricted\ndeb http://repo.huaweicloud.com/ubuntu bionic-security universe\ndeb http://repo.huaweicloud.com/ubuntu bionic-security multivers e" > /etc/apt/sources.list && \
apt-get update && \
apt-get install -y zip wget
#modifying the system configuration of the image (required for creating the conda environment)
run rm /bin/sh && ln -s /bin/bash /bin/sh
#switch to user ma-user , download miniconda from the tsinghua repository, and install miniconda in /home/ma-user.
user ma-user
run cd /home/ma-user/ && \
    wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/miniconda3-4.6.14-linux-x86_64.sh && \
    bash miniconda3-4.6.14-linux-x86_64.sh -b -p /home/ma-user/anaconda3 && \
    rm -rf miniconda3-4.6.14-linux-x86_64.sh
#configure the conda and pip sources
run mkdir -p /home/ma-user/.pip && \
    echo -e "channels:\n  - defaults\nshow_channel_urls: true\ndefault_channels:\n  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main\n  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r\n  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2" > /home/ma-user/.condarc && \
    echo -e "[global]\nindex-url = https://pypi.tuna.tsinghua.edu.cn/simple\n[install]\ntrusted-host = https://pypi.tuna.tsinghua.edu.cn" > /home/ma-user/.pip/pip.conf
#create the conda environment and install the python third-party package. the ipykernel package is mandatory for starting a kernel.
run source /home/ma-user/anaconda3/bin/activate && \
    conda create -y --name pytorch_1_8 python=3.7 && \
    conda activate pytorch_1_8 && \
    pip install torch==1.8.1 torchvision==0.9.1 && \
    pip install ipykernel==6.7.0 && \
    conda init bash && \
    conda deactivate 
#install ffmpeg and gcc
user root
run apt-get -y install ffmpeg && \
    apt -y install gcc-8 g  -8

相关文档

网站地图