Ascend NPU 实战(一):原生 Docker 与 Ascend Docker Runtime vNPU

Ascend NPU 实战(一):原生 Docker 与 Ascend Docker Runtime vNPU

💡 原文中文,约14600字,阅读约需35分钟。
📝

内容提要

本文介绍Ascend 310P3 NPU的vNPU虚拟化使用方法。原生Docker需手动用npu-smi创建vNPU并挂载设备;Ascend Docker Runtime支持静态挂载(复用已创建vNPU)和动态虚拟化(启动时自动创建释放)。通过环境变量指定设备与模板,容器内可见310Pvir01实例,动态实例随容器退出自动回收。

🔎

延伸解读

vNPU 与 MIG 的类比及差异

文章将 Ascend vNPU 类比为 NVIDIA MIG,两者都可将物理加速卡切分为多个隔离实例。但需注意,这只是概念类比,命令、资源模型和实现方式并不相同。例如,Ascend 使用 vir01 等模板划分 AICORE、内存等资源,而 NVIDIA 使用 profile 划分 GPU 核心和显存。理解这一差异有助于避免将 NVIDIA 的使用经验直接套用到昇腾环境。

三种使用方式的职责划分

原生 Docker、Ascend Docker Runtime 和集群调度组件(如 Device Plugin)对 vNPU 的职责不同:原生 Docker 需用户手动创建 vNPU 并挂载设备;Runtime 静态模式仍需预创建 vNPU,但自动注入设备;动态模式则自动创建和释放 vNPU。集群调度则在此基础上统一管理资源。选择哪种方式取决于对自动化程度和资源管理粒度的需求。

注意区分三种设备编号

文中强调物理 NPU ID、vNPU ID 和容器内设备编号三者不同,不能混用。例如,宿主机物理 NPU ID 为 1536,创建的 vNPU ID 为 100,容器内显示的 NPU 编号为 13。在实际操作中,务必明确每个编号的用途,避免因混淆导致挂载错误或资源分配失败。

动态 vNPU 的自动回收机制

Ascend Docker Runtime 动态模式下,容器启动时通过环境变量自动创建 vNPU,容器退出后实例自动释放。文中实测显示,容器退出后 vNPU 数量归零,资源完全回收。这一机制适合短时任务或弹性场景,但需注意关闭 vNPU 配置恢复功能(vnpu-cfg-recover),否则可能影响动态创建。

Q&A

什么是 Ascend vNPU?它与 NVIDIA MIG 有何异同?

Ascend vNPU 是昇腾的虚拟化实例(AVI),可将一个物理 NPU 按模板划分为多个相互隔离的 vNPU,供容器使用。它与 NVIDIA MIG 类似,都是将物理加速卡切分为多个隔离实例,但命令、资源模型和实现方式不同。

原生 Docker 下如何使用 vNPU?

原生 Docker 下需手动创建 vNPU 并挂载:先用 npu-smi set -t create-vnpu 创建 vNPU,再在 docker run 时用 --device 参数挂载 vNPU 设备节点(如 /dev/vdavinci100)及基础设备节点,并挂载 npu-smi 和 Ascend 驱动库。

Ascend Docker Runtime 的静态 vNPU 和动态 vNPU 有何区别?

静态 vNPU 需要提前用 npu-smi 创建 vNPU,启动容器时通过 ASCEND_VISIBLE_DEVICES 指定 vNPU ID,并设置 ASCEND_RUNTIME_OPTIONS=VIRTUAL,由 Runtime 注入设备;动态 vNPU 无需提前创建,启动时通过 ASCEND_VISIBLE_DEVICES 指定物理设备、ASCEND_VNPU_SPECS 指定模板,Runtime 自动创建并在容器退出后释放。

如何查看 Ascend 310P3 支持的 vNPU 模板?

使用命令 npu-smi info -t template-info -i <NPU ID> 可查看支持的 vNPU 模板,例如 vir01、vir02、vir04 等。

在容器内如何确认 vNPU 是否生效?

在容器内执行 npu-smi info,如果看到 NPU Name 为 310Pvir01 等 vNPU 类型,说明 vNPU 已成功注入。

动态 vNPU 容器退出后,vNPU 资源如何回收?

动态 vNPU 由 Ascend Docker Runtime 在容器启动时自动创建,容器退出后自动释放,无需手动删除。可通过 npu-smi info -t info-vnpu 查询确认 vNPU 数量变为 0。

原生 Docker 与 Ascend Docker Runtime 在 vNPU 使用上的主要区别是什么?

原生 Docker 需要用户手动创建 vNPU 并手动挂载设备;Ascend Docker Runtime 则自动完成设备注入,静态模式仍需提前创建 vNPU,动态模式可自动创建和释放。

🏷️

标签

➡️

继续阅读