下载
中文
注册

部署容器(制作容器镜像方式)

本章节介绍如何制作包含CANN软件的镜像来部署容器。

拥有制作容器镜像Dockerfile文件的OS:Ubuntu18.04、CentOS 7.6、openEuler 20.03。

前提条件

  • 容器OS镜像可从Docker Hub拉取,请确保安装环境能够连接网络。
  • 由于Docker Hub中不存在openEuler 20.03 LTS的镜像,如果需要在容器内使用openEuler OS,可执行如下步骤。
    1. 登录https://repo.openeuler.org/openEuler-20.03-LTS-SP2/docker_img/aarch64/,下载镜像文件“openEuler-docker.aarch64.tar.xz”
    2. 将镜像文件上传到服务器任意目录(如“/home”)。
    3. 在存放镜像的目录下执行命令导入镜像。
      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

制作容器镜像

  1. root用户登录服务器,执行docker images命令查看宿主机上是否已存在容器OS镜像,如下所示,如果已存在镜像,则直接执行3,否则执行2拉取容器OS镜像。
    ubuntu       18.04            7266638574fb   5 months ago    56.6MB
    ubuntu       20.04            d5ca7a445605   5 months ago    65.6MB
  2. 执行docker pull ubuntu:18.04命令拉取容器OS镜像,拉取后可以按照1方法查看镜像是否已拉取成功。

    ubuntu:18.04请根据现场实际OS和版本刷新。

  3. 登录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
  4. 构建镜像ascendbase-toolkit。
    1. 进入以下路径。
      cd /home/ascend-docker-image-master/ascendbase-toolkit/{os}-{arch}

      其中{os}表示容器镜像操作系统版本,{arch}表示架构,请根据实际情况替换,如“/home/ascend-docker-image-master/ascendbase-toolkit/ubuntu18.04-arm64”

    2. Dockerfile文件已存在当前目录,用户可根据实际需要自行定制。
    3. (可选)请在当前目录准备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  文件路径  ./ 
    4. 在当前目录执行以下命令构建镜像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.
      表1 命令参数说明

      参数

      说明

      ascendbase-toolkit:base_TAG

      镜像名称与标签,建议将base_TAG命名为“日期-容器OS-架构”(例如“20210106-ubuntu18.04-arm64”)。

  5. 基于镜像ascendbase-toolkit,构建镜像ascend-toolkit。
    1. 进入以下路径。
      cd /home/ascend-docker-image-master/ascend-toolkit
    2. 执行vi Dockerfile命令修改Dockerfile文件。
      1. 添加如下加粗内容。
         # 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
      2. 同时将如下加粗内容删除或注释。
        # 安装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
      3. 修改完成后保存。
    3. 请在当前目录准备以下软件包和相关文件。
      表2 所需软件或文件

      软件或文件

      说明

      获取方法

      Ascend-cann-toolkit_*.run

      开发套件包。

      参见下载软件

      Ascend-cann-kernels-*_linux.run

      二进制算子包。

      参见下载软件

      Dockerfile

      制作镜像需要。

      已存在于当前目录。

      用户可根据实际需要自行定制。

    4. 在当前目录执行以下命令构建镜像ascend-toolkit。
      docker build -t ascend-toolkit:infer_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_TAG4.d中设置的镜像标签。

      命令示例如下所示。

      docker build -t ascend-toolkit:8.0.RC1-ubuntu18.04-arm64 --build-arg BASE_VERSION=20210106-ubuntu18.04-arm64 .

启动容器

当宿主机环境为CentOS系统时,由于CentOS的安全模块selinux默认开启,会导致挂载到容器的本地目录没有执行权限,因此需要临时关闭selinux,命令为:su -c "setenforce 0"。完成相关业务后再重新开启selinux,命令为: su -c "setenforce 1"

  1. 请执行如下命令基于新镜像运行一个容器。
    docker run -itd -e ASCEND_VISIBLE_DEVICES=xxx image-name:tag /bin/bash
    表4 参数解释

    参数

    参数说明

    ASCEND_VISIBLE_DEVICES=xxx

    使用ASCEND_VISIBLE_DEVICES环境变量指定被挂载至容器中的NPU设备(用户可执行ls /dev/ | grep davinci*命令查询宿主机的NPU设备),使用设备序号指定设备,支持单个和范围指定且支持混用。例如:

    • ASCEND_VISIBLE_DEVICES=0 表示将0号设备(/dev/davinci0)挂载入容器中。
    • ASCEND_VISIBLE_DEVICES=1,3 表示将1、3号设备挂载入容器中。
    • ASCEND_VISIBLE_DEVICES=0-2 表示将0号至2号设备(包含0号和2号)挂载入容器中,效果同

      ASCEND_VISIBLE_DEVICES=0,1,2。

    • ASCEND_VISIBLE_DEVICES=0-2,4 表示将0号至2号以及4号设备挂载入容器,效果同

      ASCEND_VISIBLE_DEVICES=0,1,2,4。

    image-name:tag

    镜像名称与标签,填写5.d中构建的镜像和tag(如“ascend-toolkit:8.0.RC1-ubuntu18.04-arm64”)。

    命令示例:

    docker run -itd -e ASCEND_VISIBLE_DEVICES=0 ascend-toolkit:8.0.RC1-ubuntu18.04-arm64  /bin/bash

    执行该命令后,如果显示容器ID(本例为“1dc80f32c263”),则表示已经启动该容器。

    执行如下命令进入容器。

    docker exec -it 容器ID /bin/bash
    docker exec -it 1dc80f32c263 /bin/bash

    回显以下信息,表示成功进入该容器。

    root@1dc80f32c263:/tmp#

    如果用户在宿主机创建了模型文件目录(用于容器中应用执行推理业务),可以在启动容器时挂载模型目录(如“/data/model ”),命令示例如下所示:

    docker run -itd -e ASCEND_VISIBLE_DEVICES=0 -v /data/model:/data/model ascend-toolkit:8.0.RC1-ubuntu18.04-arm64  /bin/bash
  2. 容器启动后,执行以下命令查看当前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”目录结构

删除容器镜像

用户可将不需要的容器镜像删除,避免占用磁盘空间。

  • 删除容器
    1. root用户登录服务器。
    2. 执行如下命令查看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
    3. 删除正在运行的容器,需要先将容器停止运行。若删除的是已经停止运行的容器,请跳过该步骤。
      docker stop CONTAINER ID
      # 命令示例
      docker stop 5f45daf9eb8f
    4. 执行如下命令删除容器。
      docker rm CONTAINER ID
      # 命令示例
      docker rm 5f45daf9eb8f
  • 删除镜像

    删除镜像前,先要删除依赖它的容器,删除镜像步骤如下:

    1. 参见1~4删除依赖镜像的容器。若没有依赖镜像的容器,可跳过该步骤。
    2. 执行docker images命令查看IMAGE ID(镜像ID)。

      回显类似如下信息(镜像ID为“feb5d9fea6a5”):

      REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
      docker.io/hello-world   latest              feb5d9fea6a5        14 months ago       13.3 kB
    3. 执行如下命令删除镜像。
      docker rmi IMAGE ID
      # 命令示例
      docker rmi feb5d9fea6a5

容器镜像导出导入

用户可将容器导出为一个镜像文件,再导入其它服务器使用。

  1. root用户登录服务器。
  2. 执行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
  3. 执行如下命令将容器保存成镜像。
    docker commit CONTAINER ID image-name:tag
    表5 命令参数说明

    参数

    参数说明

    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
  4. 执行docker images命令查看镜像。
    回显类似如下信息(该镜像仅为示例,请用户以实际情况为准):
    REPOSITORY          TAG                                   IMAGE ID       CREATED          SIZE
    ascend-toolkit      8.0.RC1-ubuntu18.04-arm64-20230109      c885a9197446   9 seconds ago    5.62GB
  5. 执行如下命令保存镜像文件。
    docker save -o image.tar image-name:tag
    表6 命令参数说明

    参数

    参数说明

    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
  6. 将生成的镜像文件下载至本地,再将镜像文件上传到另一台服务器的任意目录(如“/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