配置 Ascend 切片模式

使用此操作步骤在 HAMi 管理的 Ascend 节点之间切换固定模板硬切片和 hami-core 软切片。整卡工作负载通过仅请求计数资源来选择,可在任一节点模式下运行。

WARNING

在更改目标节点的模式之前,请先停止或迁移这些节点上的部分内存 Ascend 工作负载。硬切片和软切片工作负载不会在模式之间迁移。

了解有效配置

v1.4.0 Alauda 交付版通常会设置 spec.config.create: false,并复用 HAMi 所拥有的 hami-scheduler-device ConfigMap。在这种布局下,仅更改 spec.hamiVnpuCore.enabled 不会更新共享的 ConfigMap,因此不会改变实际生效的节点模式。

请在 HAMiAscendDevicePlugin 资源上使用 spec.nodeConfig 进行显式的按节点设置。operator 会将该字符串渲染到 hami-device-node-config 中,匹配的节点条目会覆盖全局值。

检查当前所有者和生效值:

kubectl get hamiadp -A
kubectl -n <hami-namespace> get hamiadp <instance-name> \
  -o jsonpath='{.spec.config.create}{"\n"}{.spec.config.existingDeviceConfigMapName}{"\n"}{.spec.hamiVnpuCore.enabled}{"\n"}{.spec.nodeConfig}{"\n"}'
kubectl -n <hami-namespace> get configmap hami-scheduler-device -o yaml
kubectl get node <node-name> \
  -o go-template='hami-vnpu-core={{ index .metadata.annotations "hami-vnpu-core" }}{{ "\n" }}'

仅对部分内存请求解释节点注解:

  • hami-vnpu-core=false:固定模板硬切片;
  • hami-vnpu-core=truehami-core 软切片;
  • 整卡:通过仅请求 count 资源来选择,不受此注解影响。

更新自定义资源

编辑现有实例;不要创建第二个 HAMiAscendDevicePlugin 实例:

kubectl -n <hami-namespace> edit hamiadp <instance-name>

spec.nodeConfig 设置为多行字符串。编辑列表时,请保留其他节点的条目。

要在某个节点上启用软切片:

spec:
  config:
    create: false
    deviceConfigMapName: hami-scheduler-device
    existingDeviceConfigMapName: hami-scheduler-device
  nodeConfig: |
    nodes:
      - name: "<node-name>"
        hami-vnpu-core: true

若要改为硬切片,请将节点值设置为 false

spec:
  nodeConfig: |
    nodes:
      - name: "<node-name>"
        hami-vnpu-core: false

请使用 kubectl get nodes 返回的准确 Kubernetes Node 名称。nodeConfig 是 YAML 格式的字符串,因此 nodes 列表必须保持缩进并位于 | 块下。

对于其 nodeConfig 仅包含此节点的实例,等效的完整 patch 命令如下:

# Enable soft slicing on the target node.
kubectl -n <hami-namespace> patch hamiadp <instance-name> \
  --type merge \
  --patch '{"spec":{"nodeConfig":"nodes:\n  - name: \"<node-name>\"\n    hami-vnpu-core: true"}}'

# Select hard slicing on the target node.
kubectl -n <hami-namespace> patch hamiadp <instance-name> \
  --type merge \
  --patch '{"spec":{"nodeConfig":"nodes:\n  - name: \"<node-name>\"\n    hami-vnpu-core: false"}}'

这些 merge patch 会替换完整的 spec.nodeConfig 字符串。当该字符串已经包含其他节点时,请使用 kubectl edit 并保留每个必需条目,而不是应用单节点 patch。

配置逻辑调度槽位

vDeviceCount 是为每个物理 NPU 报告的逻辑调度槽位数量。它不会将内存平均切分,也不是通用的软切片默认值。

保持其未设置,以使用从已安装设备配置中派生的值:

memoryAllocatable / memory of the smallest hard-slice template

例如,v1.4.0 配置会根据 65536 / 16384 为 Ascend 910B4-1 派生出 4 个槽位。仅当容量规划明确允许那么多并发分配时,才设置不同的整数。下面的值 20 是 operator 选择的并发策略,而不是 Ascend 910B4-1 的默认值:

spec:
  nodeConfig: |
    nodes:
      - name: "<ascend-910b4-1-node-name>"
        hami-vnpu-core: true
        vDeviceCount: 20

不要将 vDeviceCount 作为字符串加引号。每个工作负载仍受其内存和可选核心请求的限制。

等待更改生效

operator 管理的 ConfigMap 校验和通常会在 spec.nodeConfig 更改后触发 Device Plugin 滚动更新:

kubectl -n <hami-namespace> rollout status \
  daemonset/hami-ascend-device-plugin --timeout=5m
kubectl -n <hami-namespace> get configmap hami-device-node-config -o yaml
kubectl get node <node-name> \
  -o go-template='hami-vnpu-core={{ index .metadata.annotations "hami-vnpu-core" }}{{ "\n" }}'

如果自定义资源和生成的 ConfigMap 中已经包含预期值,但 DaemonSet 没有滚动更新,请仅重启 operator 管理的 Device Plugin:

kubectl -n <hami-namespace> rollout restart \
  daemonset/hami-ascend-device-plugin
kubectl -n <hami-namespace> rollout status \
  daemonset/hami-ascend-device-plugin --timeout=5m

不要为了重新加载 hami-device-node-config 而重启 HAMi scheduler 或应用工作负载。不要将生成的 ConfigMap 作为正常更新路径进行编辑;应修改其所属的自定义资源。

使用工作负载进行验证