使用Containerd的集群调度组件

Kubernetes 1.20版本之后,将不再支持使用Docker作为CRI(container runtime interface)。生产环境中,如果对使用的K8s有高版本要求时,需要考虑改用其它CRI。集群调度组件基于主流CRI Containerd的1.4.4版本进行安装和验证,各组件能够在Containerd + Kubernetes场景下正常运行,且功能正常。

Containerd安装流程请参见官方资料集群调度组件安装时默认使用Ascend Docker Runtime,可以配置Containerd使用Ascend Docker Runtime替代runc,用于在启动容器时自动挂载设备,对Containerd需要做的配置请参见Containerd启用Ascend Docker Runtime

在已完成Containerd和Kubernetes安装的环境上,对于集群调度组件的安装请参见安装集群调度组件

Containerd启用Ascend Docker Runtime

Containerd客户端使用Ascend Docker Runtime可执行如下步骤。

  1. 修改配置文件。

    执行以下命令,查看配置文件。
    mkdir /etc/containerd
    containerd config default > /etc/containerd/config.toml
    vim /etc/containerd/config.toml
    根据实际情况修改runtime的安装路径,示例如下加粗部分所示。
    ...
     [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming] 
       tls_cert_file = "" 
       tls_key_file = "" 
     [plugins."io.containerd.internal.v1.opt"] 
       path = "/opt/containerd" 
     [plugins."io.containerd.internal.v1.restart"] 
       interval = "10s" 
     [plugins."io.containerd.metadata.v1.bolt"] 
       content_sharing_policy = "shared" 
     [plugins."io.containerd.monitor.v1.cgroups"] 
       no_prometheus = false 
     [plugins."io.containerd.runtime.v1.linux"] 
       shim = "containerd-shim" 
       runtime = "/usr/local/Ascend/Ascend-Docker-Runtime/ascend-docker-runtime" 
       runtime_root = "" 
       no_shim = false 
       shim_debug = false 
     [plugins."io.containerd.runtime.v2.task"] 
       platforms = ["linux/amd64"] 
     [plugins."io.containerd.service.v1.diff-service"] 
       default = ["walking"] 
     [plugins."io.containerd.snapshotter.v1.devmapper"] 
       root_path = "" 
       pool_name = "" 
       base_image_size = "" 
       async_remove = false

  2. 执行命令,重启containerd,示例如下。

    systemctl restart containerd

  3. 启动容器。

    启动容器命令示例如下。
    • 示例1:启动容器时,挂载物理芯片ID为0的芯片。
      ctr run --runtime io.containerd.runtime.v1.linux -t --env ASCEND_VISIBLE_DEVICES=0 image-name:tag containerID
    • 示例2:启动容器时,仅挂载NPU设备和管理设备,不挂载驱动相关目录。
      ctr run --runtime io.containerd.runtime.v1.linux -t --env ASCEND_VISIBLE_DEVICES=0 --env ASCEND_RUNTIME_OPTIONS=NODRV image-name:tag containerID
    • 示例3:启动容器时,挂载物理芯片ID为0的芯片,读取自定义配置文件hostlog中的挂载内容。
      ctr run --runtime io.containerd.runtime.v1.linux -t --env ASCEND_VISIBLE_DEVICES=0 --env ASCEND_RUNTIME_MOUNTS=hostlog image-name:tag containerID
    • 示例4:启动容器时,挂载虚拟芯片ID为100的芯片。
      ctr run --runtime io.containerd.runtime.v1.linux -t --env ASCEND_VISIBLE_DEVICES=100 --env ASCEND_RUNTIME_OPTIONS=VIRTUAL image-name:tag containerID
    • 示例5:启动容器时,从物理芯片ID为0的芯片上,切分出4个AI Core作为虚拟设备并挂载至容器中。
      ctr run --runtime io.containerd.runtime.v1.linux -t --env ASCEND_VISIBLE_DEVICES=0 --env ASCEND_VNPU_SPECS=vir04 image-name:tag containerID

    容器启动后,可使用ls /dev | grep davinci* && ls /dev | grep devmm_svm && ls /dev | grep hisi_hdc && ls /usr/local/Ascend/driver && ls /usr/local/ |grep dcmi && ls /usr/local/bin命令来检查相应设备和驱动是否挂载成功,每台机型具体的挂载目录参考Ascend Docker Runtime默认挂载内容

    • 可用的芯片ID可通过如下方式查询确认:
      • 物理芯片ID:
        ls /dev/davinci*
      • 虚拟芯片ID:
        ls /dev/vdavinci*
    • image-name:tag:镜像名称与标签,请根据实际情况修改。如“ascend-tensorflow:tensorflow_TAG”。
    • containerID:容器ID。使用ctr启动容器需要指定容器ID,如“c1”。
    • 若用户不需要挂载基础配置文件base中的所有内容时,可指定自定义配置文件hostlog减少挂载的内容,hostlog请根据实际创建的配置文件名修改。

      hostlog文件挂载内容须基于“base.list”文件,base.list内容如Ascend Docker Runtime默认挂载内容所示。

      创建配置文件请参见创建配置文件,以配置文件“hostlog.list”为例(文件后缀必须为.list)。

    • 用户在使用过程中,请勿重复定义和在容器镜像中固定ASCEND_VISIBLE_DEVICES、ASCEND_RUNTIME_OPTIONS、ASCEND_RUNTIME_MOUNTS和ASCEND_VNPU_SPECS等环境变量。
    表1 参数解释

    参数

    说明

    举例

    ASCEND_VISIBLE_DEVICES

    使用ASCEND_VISIBLE_DEVICES环境变量指定被挂载至容器中的NPU设备,使用设备序号指定设备,支持单个和范围指定且支持混用。

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

    ASCEND_RUNTIME_OPTIONS

    对参数ASCEND_VISIBLE_DEVICES中指定的芯片ID作出限制:

    • NODRV:表示不挂载驱动相关目录。
    • VIRTUAL:表示挂载的是虚拟芯片。
    • NODRV,VIRTUAL:表示挂载的是虚拟芯片,并且不挂载驱动相关目录。
    说明:

    虚拟设备的相关约束及创建方法具体请参见《Ascend 910 NPU驱动和固件安装指南(AI服务器)》(其他产品型号请参考对应的驱动和固件安装手册)的“算力分组场景下的安装”章节。

    • ASCEND_RUNTIME_OPTIONS=NODRV
    • ASCEND_RUNTIME_OPTIONS=VIRTUAL
    • ASCEND_RUNTIME_OPTIONS=NODRV,VIRTUAL

    ASCEND_RUNTIME_MOUNTS

    读取配置文件中的挂载内容。

    ASCEND_RUNTIME_MOUNTS=hostlog
    说明:

    hostlog请根据实际自定义配置文件名修改。

    ASCEND_VNPU_SPECS

    从物理NPU设备中切分出一定数量的AI Core,指定为虚拟设备。支持的取值为(vir01,vir02,vir02_1c,vir04,vir04_3c,vir08,vir16、vir04_4c_dvpp、vir04_3c_ndvpp)。

    • Atlas 推理系列产品仅支持vir01、vir02、vir02_1c、vir04、vir04_3c、vir04_4c_dvpp、vir04_3c_ndvpp。
    • Atlas 训练系列产品仅支持vir02、vir04、vir08和vir16。

    需配合参数“ASCEND_VISIBLE_DEVICES”一起使用,参数“ASCEND_VISIBLE_DEVICES”指定用于切分的物理NPU设备。

    ASCEND_VNPU_SPECS=vir04表示切分4个AI Core作为虚拟设备,挂载至容器中。

    说明:
    • vir后面的数字表示AI Core数量。
    • c前面的数字表示AI CPU数量。
    • dvpp表示虚拟化时包含所有数字视觉预处理模块(即VPC,VDEC,JPEGD,PNGD,VENC,JPEGE)。
    • ndvpp表示虚拟化时没有数字视觉预处理硬件资源。