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 -AEKS/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 --overwrite2. 限制团队额度#
保存 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、共享边界。