00 前言

在与伙伴/客户交流合作过程中,经常遇到一张算力卡资源同时分配给多个使用方进行模型任务的需求,毕竟如今AI算力还比较稀缺和昂贵。那么本片内容则为大家介绍一个针对这个痛点的创新技术——昇腾虚拟化实例AVI(Ascend Virtual Instance)。

01 功能介绍

昇腾虚拟化实例功能是指通过资源虚拟化的方式将物理机配置的NPU(昇腾AI产品)切分成若干份vNPU(虚拟NPU)挂载到容器中使用,虚拟化管理方式能够实现统一不同规格资源的分配和回收处理,满足多用户反复申请/释放的资源操作请求。

昇腾虚拟化实例功能的优点是可实现多个用户按需申请共同使用一台服务器,降低了用户使用NPU算力的门槛和成本。多个用户共同使用一台服务器的NPU,并借助容器进行资源隔离,资源隔离性好,保证运行环境的平稳和安全,且资源分配,资源回收过程统一,方便多租户管理。

昇腾虚拟化实例功能适用于多用户多任务并行,且每个任务算力需求较小的场景。

02 原理介绍

昇腾NPU硬件资源主要包括AICore(用于AI模型的计算)、AICPU、内存等,昇腾虚拟化实例功能主要原理是将上述硬件资源根据用户指定的资源需求划分出vNPU,每个vNPU对应若干AICore、AICPU、内存资源。比如用户只需要使用4个AICore的算力,那么系统就会创建一个vNPU,通过vNPU向NPU芯片获取4个AICore提供给容器使用,整体昇腾虚拟化实例方案如下图所示。

图片

03 应用方案

在昇腾解决方案中,昇腾虚拟化实例功能当前支持以下应用方案:

  • 原生Docker:结合原生Docker使用。通过npu-smi工具创建多个vNPU,通过Docker拉起运行容器时将vNPU挂载到容器。
  • Ascend Docker Runtime:结合Ascend Docker Runtime(容器引擎插件)使用。通过npu-smi工具创建多个vNPU,通过Ascend Docker拉起运行容器时将vNPU挂载到容器。
  • 集群调度组件:结合MindX DL中的集群调度组件Ascend Device Plugin、Volcano使用,支持静态虚拟化方案。静态虚拟化方式下,通过npu-smi工具提前创建多个vNPU,当用户需要使用vNPU资源时,基于Ascend Device Plugin组件的设备发现、设备分配、设备健康状态上报功能,分配vNPU资源提供给上层用户使用,此方案下,集群调度组件的Volcano组件为可选。

04 使用指导

创建vNPU

  • 如果采用静态虚拟化方式使用vNPU,在使用原生Docker、MindX DL挂载vNPU前,需要通过npu-smi工具使用虚拟化实例命令按照用户的使用需求创建vNPU。
  • Ascend Docker Runtime使用vNPU,既可以先通过npu-smi工具创建vNPU,再将vNPU挂载到容器中;也可以在拉起容器时,直接通过ASCEND_VISIBLE_DEVICES和ASCEND_VNPU_SPECS参数从物理芯片上虚拟化出多个vNPU并挂载至容器。两种方式的具体使用方法及区别请参见使用方法。

使用方法

使用示例如下:

  • 设置虚拟化模式。命令格式:npu-smi set -t vnpu-mode -d mode
  • 1745497906127.png
  • 创建vNPU。
  • 命令格式:npu-smi set -t create-vnpu -i id -c chip_id -f vnpu_config

image.png

  • 在设备1中编号为0的芯片上根据模板vir02创建vNPU。
npu-smi set -t create-vnpu -i 1 -c 0 -f vir02
        Status : OK         Message : Create vnpu success
  • 在设备1中编号为0的芯片上指定vnpu_id为103创建vNPU设备,此vNPU的模板为vir02。

npu-smi set -t create-vnpu -i 1 -c 0 -f vir02 -v 103
        Status : OK         Message : Create vnpu success
  • 在设备1中编号为0的芯片上指定vnpu_id为100并指定vgroup_id为1创建vNPU设备,此vNPU的模板为vir02。

npu-smi set -t create-vnpu -i 1 -c 0 -f vir02 -v 100 -g 1
        Status : OK         Message : Create vnpu success
  • 配置vNPU恢复状态。该参数用于设备重启时,设备能够保存vNPU配置信息,重启后,vNPU配置依然有效。
    命令格式:npu-smi set -t vnpu-cfg-recover -d mode

mode表示vNPU的配置恢复使能状态,“1”表示开启状态,“0”表示关闭状态,默认为使能状态。

执行如下命令设置vNPU的配置恢复状态,以下命令表示将vNPU的配置恢复状态设置为使能状态。

npu-smi set -t vnpu-cfg-recover -d 1

Status : OK
      Message : The VNPU config recover mode Enable is set successfully.
  • 查询vNPU的配置恢复状态。

    以下命令表示查询当前环境中vNPU的配置恢复使能状态。
    
    npu-smi info -t vnpu-cfg-recover
    

`VNPU config recover mode : Enable`
  • 查询vNPU信息。

    命令格式:npu-smi info -t info-vnpu -i id -c chip_id
    
    ![image.png](/img/bVdjbQq)
    

执行如下命令查询vNPU信息。以下命令表示查询设备1中编号为0的芯片的vNPU信息。
npu-smi info -t info-vnpu -i 1 -c 0

图片

  • 销毁指定vNPU。
    命令格式:npu-smi set -t destroy-vnpu -i id -c chip_id -v vnpu_id
    示例:执行npu-smi set -t destroy-vnpu -i 1 -c 0 -v 103销毁设备1编号0的芯片中编号为103的vNPU设备。回显以下信息表示销毁成功。

    Status : OK
    Message : Destroy vnpu 103 success

使用vNPU

原生Docker使用vNPU

原生Docker场景主要为使用npu-smi工具创建vNPU后,将vNPU,挂载到容器。

使用方法

用户通过npu-smi工具创建vNPU后,在拉起容器时执行以下命令将vNPU挂载至容器中。以下命令表示用户在拉起容器时,挂载虚拟芯片ID为100的芯片。

docker run -it \
--device=/dev/vdavinci100:/dev/davinci100 \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /home:/home \
-v /usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/common \
-v /usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64/driver \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
docker_image_id  /bin/bash

执行之后即可启动容器,并将创建的虚拟设备映射到容器中。

容器启动之后,执行以下命令查看当前Docker容器中可以使用的davinci设备,如果有davinci设备则表示虚拟设备成功映射到容器中。

ls /dev/ | grep davinci*

Ascend Docker使用vNPU

Ascend Docker Runtime场景主要通过结合Ascend Docker Runtime(容器引擎插件)使用,将vNPU挂载到容器。

使用方法

  • 用户通过npu-smi工具创建vNPU后,在拉起容器时执行以下命令将vNPU挂载至容器中。以下命令表示用户在拉起容器时,挂载虚拟芯片ID为100的芯片。
docker run -it -e ASCEND_VISIBLE_DEVICES=100 -e ASCEND_RUNTIME_OPTIONS=VIRTUAL image-name:tag /bin/bash
  • 用户在拉起容器时,执行以下命令切分算力资源,以下命令表示从物理芯片ID为0的芯片上,切分出4个AI Core作为vNPU并挂载至容器。以此方式拉起的容器,在结束容器进程时,虚拟设备会自动销毁。

docker run -it --rm -e ASCEND_VISIBLE_DEVICES=0 -e ASCEND_VNPU_SPECS=vir04 image-name:tag /bin/bash

参考资料

  • 前言-昇腾虚拟化实例(AVI)用户指南-用户指南-虚拟化实例(AVI)3.0.0开发文档-昇腾社区