GPU 节点与可恢复批任务 Hands-on

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
CSI Container Storage Interface 容器存储接口
CUDA Compute Unified Device Architecture NVIDIA 并行计算平台
ECC Error-Correcting Code 纠错码
EKS Elastic Kubernetes Service AWS 托管 Kubernetes 服务
GKE Google Kubernetes Engine Google 托管 Kubernetes 服务
GPU Graphics Processing Unit 图形处理器
MIG Multi-Instance GPU NVIDIA 多实例 GPU,将 GPU 划分为隔离实例
NFD Node Feature Discovery Kubernetes 节点特征发现组件
OS Operating System 操作系统
PVC Persistent Volume Claim 持久卷申领
RWO ReadWriteOnce 卷访问模式:由一个节点以读写方式挂载
RWX ReadWriteMany 卷访问模式:由多个节点以读写方式挂载
SDK Software Development Kit 软件开发工具包
SIGTERM Termination Signal 请求进程正常终止的信号

场景:真实模型批处理/训练任务,带 checkpoint 和结果校验;CUDA vector-add 只能验证驱动,不能代替业务验收。前置:GPU 专用节点池、受支持 OS/内核/GPU 型号、NVIDIA 驱动兼容矩阵、共享 checkpoint PVC 或业务对象存储、固定训练镜像。

1. 确认驱动所有者#

kubectl get nodes -L accelerator,pool
kubectl get ds -A

EKS/GKE 的 GPU 节点镜像/托管安装器可能已管理驱动和 device plugin;先查平台文档,禁止再安装第二套。下面路径用于新建自管 GPU 节点,企业 OS 基线已安装兼容 NVIDIA driver 和 Container Toolkit,并验证 containerd 的 nvidia runtime;GPU Operator 不重复装二者。

nvidia-smi
export GPU_OPERATOR_VERSION='REPLACE_CHART_VERSION'
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm upgrade --install gpu-operator nvidia/gpu-operator --version "$GPU_OPERATOR_VERSION" -n gpu-operator --create-namespace --set driver.enabled=false --set toolkit.enabled=false --wait --timeout 20m
kubectl get nodes -o json | jq '.items[]|{name:.metadata.name,gpu:.status.allocatable["nvidia.com/gpu"]}'

先审查 chart 和主机级权限。若所选平台同时带 NFD/device plugin,明确保留一个所有者;相关组件需容忍 GPU taint。选择实际 GPU 节点并打标签/污点;确认 GPU Operator 各组件容忍该污点后执行,其他业务不给此 toleration:

export GPU_NODE='REPLACE_GPU_NODE'
kubectl label node "$GPU_NODE" pool=gpu --overwrite
kubectl taint node "$GPU_NODE" dedicated=gpu:NoSchedule --overwrite

2. 限制团队额度#

保存 gpu-quota.yaml:

apiVersion: v1
kind: Namespace
metadata: {name: ml-batch}
---
apiVersion: v1
kind: ResourceQuota
metadata: {name: gpu-budget, namespace: ml-batch}
spec:
  hard:
    requests.nvidia.com/gpu: '2'
    requests.cpu: '16'
    requests.memory: 64Gi
    limits.cpu: '32'
    limits.memory: 128Gi
    pods: '10'
kubectl apply -f gpu-quota.yaml

准备本 namespace 的 training-checkpoints PVC,必须支持任务调度位置和所需并发访问;跨节点共享用合适 RWX/对象存储,不能假设普通 RWO 云盘能多节点并发。

保存 checkpoints.yaml,选择已有企业文件服务 CSI 的 RWX StorageClass:

apiVersion: v1
kind: PersistentVolumeClaim
metadata: {name: training-checkpoints, namespace: ml-batch}
spec:
  accessModes: [ReadWriteMany]
  storageClassName: REPLACE_RWX_STORAGECLASS
  resources:
    requests: {storage: 100Gi}
kubectl apply -f checkpoints.yaml
kubectl -n ml-batch get pvc training-checkpoints

使用对象存储时,以业务 SDK 和独立云身份替换 PVC 路径;不能使用 emptyDir 伪造可恢复 checkpoint。

3. 提交真实训练任务#

镜像必须提供 /app/train --resume --checkpoint-dir=/checkpoints/run-001,数据集路径/身份由团队业务配置提供;保存 training-job.yaml:

apiVersion: batch/v1
kind: Job
metadata: {name: training-run-001, namespace: ml-batch}
spec:
  backoffLimit: 2
  activeDeadlineSeconds: 14400
  ttlSecondsAfterFinished: 86400
  template:
    spec:
      restartPolicy: Never
      automountServiceAccountToken: false
      nodeSelector: {pool: gpu}
      tolerations:
        - {key: dedicated, operator: Equal, value: gpu, effect: NoSchedule}
      runtimeClassName: nvidia
      terminationGracePeriodSeconds: 120
      securityContext: {runAsNonRoot: true, seccompProfile: {type: RuntimeDefault}, fsGroup: 1000}
      containers:
        - name: trainer
          image: REPLACE_TRAINING_IMAGE_AT_DIGEST
          command: [/app/train, --resume, --checkpoint-dir=/checkpoints/run-001]
          resources:
            requests: {cpu: '4', memory: 16Gi, nvidia.com/gpu: '1'}
            limits: {cpu: '8', memory: 32Gi, nvidia.com/gpu: '1'}
          securityContext:
            allowPrivilegeEscalation: false
            capabilities: {drop: [ALL]}
          volumeMounts:
            - {name: checkpoints, mountPath: /checkpoints}
            - {name: shm, mountPath: /dev/shm}
      volumes:
        - name: checkpoints
          persistentVolumeClaim: {claimName: training-checkpoints}
        - name: shm
          emptyDir: {medium: Memory, sizeLimit: 2Gi}
kubectl get runtimeclass nvidia
kubectl apply --dry-run=server -f training-job.yaml
kubectl apply -f training-job.yaml
kubectl -n ml-batch get pods -o wide
kubectl -n ml-batch logs -f job/training-run-001

确认 RuntimeClass 已由所选集成提供;若平台不使用此 runtimeClass,按其文档调整而非创建一个不存在的 runtime handler。GPU extended resource 通常按整数不可超卖;MIG/time-slicing 是另一个容量/隔离模型,time-slicing 不保证显存隔离。

4. 抢占与断点恢复验收#

在训练已写完整 checkpoint 后,受控删除一个测试 Pod(Job 会创建新 Pod),检查从最后成功 checkpoint 恢复,结果仅提交一次。再验证节点 drain/Spot 中断窗口,120 秒退出时间不保证云平台一定给足;定期 checkpoint 比只在 SIGTERM 保存更可靠。

检查 GPU 利用率/显存、Xid/ECC、温度/功耗、队列等待、训练吞吐与成本;GPU 配额 Pending 与驱动故障分开排查。多机训练需要 gang scheduling/队列准入,不能用多个独立 Job 保证同时获得 GPU。

完成后确认 Job Complete、模型指标与产物校验和合格、checkpoint 可恢复,再释放 GPU/清理临时任务;生产产物转入有版本和保留策略的仓库。

参考:GPU 调度、GPU Operator、共享边界。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭