使用指南

更新时间:
复制 MD 格式

灵骏 Runtime Kit 为 Kubernetes 中的 GPU / PPU 资源提供整卡、切分、多卡和拓扑感知调度能力。阅读本文可了解各场景的 YAML 写法及监控指标消费方法。

说明

公测中:本产品当前处于公测阶段,如有问题或建议,请联系灵骏技术支持。

1. 使用前提

使用本指南前,请确认集群已按部署与版本指南完成 3.3 节的一键部署,并通过3.4 节的部署验证:

  1. 目标节点已打 lj_runtimekit_enable=true 标签,且节点 Runtime Kit 功能已启用(见3.5 功能启用与开关);

  2. Device Plugin 与 Scheduler Framework 已部署并正常运行,节点资源已上报(见3.4 部署验证);

  3. 集群已创建 lj-runtime RuntimeClass,节点 containerd 已注册对应 runtime handler(见3.2 部署前置操作第五步);

  4. 使用跨节点 Gang 拓扑调度时,如集群本身不具备 Gang 调度能力,需已安装 JobSet。JobSet 为 Gang 调度提供 Pod 组语义,保证多机训练任务同时启停。

2. 资源模型

Device Plugin 向集群上报以下扩展资源,在 Pod 的 resources.limits 中声明即可(扩展资源只需填 limits,无需填 requests):

资源名

用途

用法示例

aliyun.com/gpu-core

时分算力切分

"50" 表示请求单卡 50% 算力

aliyun.com/gpu-memory

显存切分

"4" 表示请求 4 GiB 显存

aliyun.com/gpu-slice

MIG 空分

"3" 表示请求算力为 3 份的 MIG 实例

aliyun.com/gpu

整卡(厂商无关)

"1" 表示请求 1 张整卡;资源名厂商无关,如需将 Pod 调度到特定厂商加速卡的节点,可自定义节点标签并配合节点亲和使用

nvidia.com/gpu

社区兼容整卡

"1" 表示请求 1 张 NVIDIA GPU

aliyun.com/rdma

RDMA 网卡挂载开关

"1" 表示开启 RDMA 网卡挂载(共享模式,取值仅 0/1,非网卡数量),系统根据 GPU 拓扑自动关联对应 RDMA 网卡

说明:

  • gpu-slice 支持 1、2、3、4、7,对应 NVIDIA MIG 的标准 Profile 切分规格;MIG 当前支持 A100 与 H800 卡型号;

  • aliyun.com/gpu 是厂商无关的整卡资源名。若需将 Pod 调度到特定厂商加速卡节点,可自定义节点标签并配合节点亲和,例如:为节点打上 accelerator/vendor=ppu 标签(kubectl label node <node-name> accelerator/vendor=ppu),再在 Pod 中通过 nodeSelector 指定该标签。nvidia.com/gpu 是社区标准资源名,仅用于 NVIDIA GPU 整卡场景。

  • 上表为默认资源名。如需自定义资源名前缀以适配平台命名规范,修改后须同步更新 Device Plugin、Scheduler Framework、Exporter 三个组件的配置(详见开源组件定制)。

使用灵骏调度能力的 Pod 须做两项设置:

spec:
  schedulerName: lj-runtimekit-scheduler   # 使用灵骏调度器分配切分资源
  runtimeClassName: lj-runtime             # 使 GPU/PPU 设备正确注入容器

未指定 schedulerName 的 Pod 将由默认调度器处理,无法识别 GPU 切分资源。

3. 资源申请场景

3.1 整卡分配

请求整卡时只需声明整卡类资源,无需声明算力与显存:

apiVersion: v1
kind: Pod
metadata:
  name: whole-card-demo
spec:
  schedulerName: lj-runtimekit-scheduler
  runtimeClassName: lj-runtime
  containers:
  - name: app
    image: <your-image>
    resources:
      limits:
        nvidia.com/gpu: "1"     # NVIDIA GPU 整卡(社区兼容资源名);其他厂商整卡使用 aliyun.com/gpu

3.2 时分算力切分(TDM)

通过 gpu-core(算力百分比,1~100)与 gpu-memory(显存,GiB)两个独立维度组合声明,二者可自由搭配:

apiVersion: v1
kind: Pod
metadata:
  name: tdm-demo
spec:
  schedulerName: lj-runtimekit-scheduler
  runtimeClassName: lj-runtime
  containers:
  - name: app
    image: <your-image>
    resources:
      limits:
        aliyun.com/gpu-core: "50"      # 单卡 50% 算力
        aliyun.com/gpu-memory: "4"     # 4 GiB 显存

注意:整卡使用时不要填写 gpu-core。不填表示不开启算力限制;显式填 0 也表示不限制,但可能导致容器内 GPU 程序异常。

3.3 MIG 空分

使用 MIG 空分前,集群管理员须在节点上通过 nvidia-smi mig 命令启用 GPU 的 MIG 模式(属硬件配置,需要重置 GPU)。MIG 模式开启后,系统会自动管理实例的创建与回收:Pod 启动时按请求规格创建 MIG 实例,Pod 销毁时自动回收,无需人工干预。

apiVersion: v1
kind: Pod
metadata:
  name: mig-demo
spec:
  schedulerName: lj-runtimekit-scheduler
  runtimeClassName: lj-runtime
  containers:
  - name: app
    image: <your-image>
    resources:
      limits:
        aliyun.com/gpu-slice: "3"     # 算力为 3 份的 MIG 实例
        aliyun.com/gpu-memory: "4"    # 4 GiB 显存

gpu-slice 支持值为 1、2、3、4、7。MIG 当前仅支持 A100 与 H800 卡型号;PPU 的同类能力为 PPU 自有空分技术。PPU 场景建议优先使用 TDM 时分复用。

3.4 多卡同构请求

多卡请求当前仅支持同构配置(每张卡分配相同的算力和显存)。通过 Pod label replica 指定卡数,各卡资源配置由 resources.limits 统一指定:

apiVersion: v1
kind: Pod
metadata:
  name: multi-gpu-demo
  labels:
    replica: "2"                       # 请求 2 张卡
spec:
  schedulerName: lj-runtimekit-scheduler
  runtimeClassName: lj-runtime
  containers:
  - name: app
    image: <your-image>
    resources:
      limits:
        aliyun.com/gpu-core: "50"
        aliyun.com/gpu-memory: "4"

3.5 使用约束

  1. 同一张卡同一时间只能处于 TDM 或 MIG 模式之一,不可混用;

  2. 时分复用(TDM)支持 NVIDIA 全系列 GPU 和 PPU;AMD 仅支持整卡,不支持切分;

  3. 显存支持 GiB 与 MiB 两种单位,MiB 模式最小粒度 128 MiB。

4. 拓扑感知调度(PPU)

拓扑感知调度基于物理拓扑为多卡请求选择通信距离最优的设备组合,当前支持 PPU 810E 与 PPU M890P。拓扑信息由组件自动采集上报,用户无需额外配置,按以下规则声明资源即可。

4.1 节点内多卡拓扑调度

PPU 810E:申请 aliyun.com/gpu 且卡数为 2/4/8 时自动生效,调度器优先选择同一拓扑组内互联最近的卡组合。RDMA 场景下需同时申请 aliyun.com/rdma。

spec:
  schedulerName: lj-runtimekit-scheduler
  runtimeClassName: lj-runtime
  containers:
  - name: train
    image: <your-training-image>
    resources:
      limits:
        aliyun.com/gpu: "4"          # 申请 4 张 PPU 810E 整卡,自动拓扑优选

PPU M890P(GPU↔RDMA 联合亲和):在 resources.limits 中同时申请 aliyun.com/gpu(1~8 任意整数)与 aliyun.com/rdma: "1" 时生效。调度器按 PCIe Switch → NUMA Node → CPU Socket → 跨 Socket 四级就近降级,将 GPU 与同一 PCIe 域下的 RDMA 网卡作为一组联合分配。aliyun.com/rdma 是启用拓扑亲和路径的开关,不代表网卡数量;对应 RDMA 设备由 Device Plugin 自动挂载进容器。RDMA 通信必须开启 hostNetwork: true。

spec:
  schedulerName: lj-runtimekit-scheduler
  runtimeClassName: lj-runtime
  hostNetwork: true
  containers:
  - name: training
    image: <your-training-image>
    resources:
      limits:
        aliyun.com/gpu: "4"
        aliyun.com/rdma: "1"

4.2 跨节点 Gang 拓扑调度

面向多机多卡分布式训练,通过 JobSet 提交作业即可触发:调度器自动识别同一 JobSet 下的 Pod 为同一调度组,按网络拓扑亲和度择优分配节点。关键约定:

  1. Pod template 的 labels 中设置 aliyun.com/min-member: "N",值必须等于 parallelism(组内 Pod 总数);

  2. 典型配置下 parallelism = completions = aliyun.com/min-member;

  3. RDMA 通信必须设置 hostNetwork: true,并添加 IPC_LOCK capability(否则 RDMA 内存注册失败)。

调度器行为:优先将成员聚集到网络距离最近的节点(同节点 > 同超节点 HyperNode > 同接入交换机 Leaf Switch > 同 network-pod);全有或全无——180 秒内组员未全部就绪则整组回滚重试;若 network-pod 域内总资源不足以容纳整组,所有成员将 Pending。

示例(7 Worker 跨节点 Gang 分布式训练,节选关键部分):

apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
  name: gang-nccl-test
spec:
  replicatedJobs:
    - name: worker
      template:
        spec:
          completionMode: Indexed
          parallelism: 7
          completions: 7
          backoffLimit: 2
          template:
            metadata:
              labels:
                app: gang-nccl-test
                aliyun.com/min-member: "7"      # Gang 组成员数,等于 parallelism
            spec:
              schedulerName: lj-runtimekit-scheduler
              runtimeClassName: lj-runtime
              hostNetwork: true
              containers:
              - name: trainer
                image: <your-training-image>
                resources:
                  limits:
                    aliyun.com/gpu: "1"
                    aliyun.com/rdma: "1"
                securityContext:
                  capabilities:
                    add: ["IPC_LOCK"]
              restartPolicy: Never

5. 监控指标消费

Exporter 以 Prometheus 标准格式暴露 GPU 运行指标,指标采用 DCGM_FI_* 前缀,兼容 NVIDIA DCGM 监控生态,便于复用社区 Grafana Dashboard 与告警规则;实际数据由灵骏组件通过底层驱动接口采集,相比原生 DCGM 提供更精细的容器级 GPU 指标。

指标分类:

大类

指标举例

粒度

整卡硬件

SM 利用率、显存利用率、显存带宽、PCIe/NVLink 用量、温度、功率

整卡级

切分实例

实例时间利用率、实例显存占用

Pod 级

健康状态

驱动 hang、ECC 错误、P2P/NVLink 异常

整卡级

指标标签:gpu(序号)、UUID、modelName(型号)、Hostname、NodeName、pod、namespace、container_name。

对接 Prometheus:在 prometheus.yml 中添加采集目标(Exporter 默认端口 9501):

scrape_configs:
  - job_name: 'lj-runtimekit-exporter'
    static_configs:
      - targets: ["<node-ip>:9501"]

参考资料:

  • 完整指标定义(80 项,覆盖整卡/容器/ECC/健康等分类):开源仓 Exporter 组件 docs/metrics-definition.md;

  • Grafana Dashboard 模板:开源仓 Exporter 组件文档,通过 Grafana → Import 导入。

常用告警示例(GPU 整体健康状态,value=0 表示异常):

# 查看指定节点健康状态
DCGM_FI_HEALTH_WATCH_OVERALL{NodeName="gpu-node-01"}

# 筛选存在异常的节点
DCGM_FI_HEALTH_WATCH_OVERALL == 0

常见问题

Q1:容器创建成功,但 GPU 程序长时间无输出,怎么解决?

原因:Allocate 请求中算力被设为 0。处理:整卡使用时不填算力字段;限制算力时填写正整数百分比。

Q2:Pod 一直 Pending,怎么解决?

请确认:Pod 已指定 schedulerName: lj-runtimekit-scheduler;目标节点已打 lj_runtimekit_enable=true 标签且资源已上报;请求的算力/显存/slice 取值合法(slice 仅支持 1/2/3/4/7,且卡型号须为 A100/H800)。部署侧排查详见部署与版本指南-常见问题。

附录:YAML 快速参考

场景

关键声明

整卡分配

nvidia.com/gpu: "1"(NVIDIA 社区兼容名)或 aliyun.com/gpu(厂商无关)

时分切分

aliyun.com/gpu-core: "50" + aliyun.com/gpu-memory: "4"

MIG 空分

aliyun.com/gpu-slice: "3" + aliyun.com/gpu-memory: "4"

多卡同构

Pod label replica: "N" + limits 中声明单卡配置

810E 拓扑

aliyun.com/gpu: "2/4/8"

M890P 拓扑

aliyun.com/gpu: "N" + aliyun.com/rdma: "1"

跨节点 Gang

JobSet + label aliyun.com/min-member: "N"(= parallelism)

通用要求

schedulerName: lj-runtimekit-scheduler + runtimeClassName: lj-runtime