华为 Ascend NPU 安装

本章介绍针对配备华为 Ascend NPU 的集群的端到端安装步骤。对于 NVIDIA GPU,请参见 安装 NVIDIA GPU

Alauda Build of Hami v2.8 开始,部署表单中会提供 Enable Ascend 开关,使 hami-scheduler 能够调度华为 Ascend NPU,并与 NVIDIA GPU 一起使用(或替代 NVIDIA GPU)。

与 NVIDIA 不同——开启该开关会同时部署 hami-scheduler 和 NVIDIA device plugin——开启 Enable Ascend 时,会为 hami-scheduler 配置 Ascend 感知能力,并提供包含 Ascend 虚拟化模板的 hami-scheduler-device ConfigMap。HAMi chart 中不包含 Ascend device plugin DaemonSet,必须单独安装。

前提条件

  • 对你的 ACP 集群具有集群管理员权限
  • Kubernetes 版本:v1.16+
  • ACP 版本:v4.0+
  • 一台或多台配备受支持的华为 Ascend NPU 的节点(例如 Ascend 910BAscend 310P 等)

步骤 1:安装 Ascend driver 和 Ascend Docker Runtime

Alauda Build of NPU Operator 是在 NPU 节点上安装 Ascend driver、firmware 和 Ascend Docker Runtime 的推荐方式。请按照 安装 Alauda Build of NPU Operator 执行,并注意部署表单中的选项:

ComponentSettingReason
DriverEnabled在每个 NPU 节点上安装 Ascend driver 和 firmware。
Ascend Docker RuntimeEnabled安装 runtime,以便容器可以挂载 Ascend 设备。
Ascend Device PluginDisabledHAMi 自带自己的 ascend-device-plugin(在步骤 3 中安装)。启用 operator 的 plugin 会与 HAMi 的 plugin 以及 hami-scheduler-device ConfigMap 冲突。
NPU exporterOptional如果你需要 NPU 指标,请启用。

operator 完成后,请在每个 NPU 节点上验证 driver:

npu-smi info

步骤 2:在 HAMi 部署表单中启用 Ascend

  1. 打开 管理员 -> Marketplace -> 集群插件,切换到目标集群,然后部署或更新 Alauda Build of Hami
  2. 在部署表单中,打开 Enable Ascend
  3. Enable NVIDIA 可以保持开启(混合集群)或关闭(仅 NPU 集群)。
  4. 提交表单。等滚动更新完成后,hami-scheduler 将以 --enable-ascend=true 启动,并且 hami-scheduler-device ConfigMap 会包含第 3 步中的 device plugin 所使用的 Ascend vnpus 模板。
TIP

Enable NVIDIAEnable Ascend 是相互独立的。你可以关闭其中任意一个,但至少应保持一种设备类型处于启用状态。

步骤 3:部署 HAMi ascend-device-plugin

  1. 为每个 NPU 节点打标签,以便 DaemonSet 只在需要的节点上运行:

    kubectl label node {ascend-node} ascend=on
  2. 下载 DaemonSet manifest ascend-device-plugin.yaml 并将其应用到业务集群:

    kubectl apply -f ascend-device-plugin.yaml

    该 manifest 会创建:

    • 位于 kube-system 命名空间中的 ServiceAccountClusterRoleClusterRoleBinding,名称为 hami-ascend
    • 名为 hami-ascend-device-pluginDaemonSet,调度到带有 ascend=on 标签的节点。
    • 该 DaemonSet 会挂载 hami-scheduler-device ConfigMap;该 ConfigMap 由第 2 步中的 HAMi chart 创建,包含 Ascend 虚拟化模板(vnpus)。
  3. 如需使用自定义 plugin 镜像(例如内部镜像源),请在应用之前编辑 ascend-device-plugin.yaml 中的 image 字段。

步骤 4:验证

  1. 检查每个 NPU 节点上的 device plugin Pod 是否都在运行:

    kubectl -n kube-system get pods -l app.kubernetes.io/component=hami-ascend-device-plugin -o wide
  2. 检查 NPU 资源是否已报告为可分配(资源名称会因芯片而异,例如 huawei.com/Ascend910Bhuawei.com/Ascend310P):

    kubectl get node {ascend-node} -o=jsonpath='{.status.allocatable}'
  3. 运行一个示例工作负载来申请一个 vNPU 切片。下面的示例请求一个 Ascend910B4 芯片,并将内存限制为 4096 MiB;HAMi 会选择满足该内存请求的最小虚拟化模板:

    apiVersion: v1
    kind: Pod
    metadata:
      name: ascend-pod
    spec:
      containers:
        - name: npu-pod
          image: ascendai/pytorch:ubuntu-python3.8-cann8.0.rc1.beta1-pytorch2.1.0
          command: ["sleep", "infinity"]
          resources:
            limits:
              huawei.com/Ascend910B4: "1"
              # If you omit Ascend910B4-memory, the whole NPU is allocated.
              huawei.com/Ascend910B4-memory: "4096"

    更多 device 侧示例,请参见 HAMi ascend-device-plugin examples

如需深入了解 vNPU 切片的工作原理(模板、内存取整以及按卡预算核算),请参见 Ascend vNPU 切片的工作原理

故障排查

  • Pod 一直处于 Pending,且未报告 Ascend 资源:确认节点已带有 ascend=on 标签,并且该节点上的 hami-ascend-device-plugin Pod 处于 Running 状态。
  • hami-scheduler-device ConfigMap 中缺少 vnpus 部分:重新打开 HAMi 部署表单并确认 Enable Ascend 已开启;只有在打开该开关时才会渲染该部分。
  • Alauda Build of NPU Operator 冲突:确保在 operator 部署表单中已禁用 Ascend Device Plugin。如果误开启了,请在关闭该选项后重新部署 operator,然后再次应用 HAMi ascend-device-plugin.yaml
  • 需要自定义 Ascend 虚拟化模板:编辑 hami-scheduler-device ConfigMap 中的 vnpus 部分(kubectl -n kube-system edit configmap hami-scheduler-device),然后重启 hami-ascend-device-plugin Pod。请注意,该修改会在下次 chart 升级时丢失。