共计 1895 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:AI 算力运维的三大难题
最近在部署几个大语言模型训练任务时,我们的 GPU 集群暴露了三个典型问题:

- 资源利用率低下:Prometheus 监控显示,GPU 平均利用率仅 35%,但显存分配却经常爆满。这就像买了辆跑车却只用来买菜。
- 突发任务排队严重:每周五的模型验证任务会导致 20+ 训练任务堆积,最长等待 8 小时——研发同学都快把茶水间坐穿了。
- GPU 碎片化严重:由于缺乏智能调度,经常出现 ” 剩 4 块 GPU 每块只剩 8G 显存 ” 的尴尬局面,导致新任务无法调度。
技术方案选型:为什么选择 K8s+HPA?
我们对比了三种主流方案:
- Kubernetes 原生调度器:
- 优点:开箱即用,社区支持好
-
缺点:缺乏 GPU 感知能力,只能做简单的 Binpack 调度
-
Kube-batch:
- 优点:适合批处理作业
-
缺点:对动态伸缩支持较弱
-
Volcano:
- 优点:支持 Gang Scheduling
- 缺点:学习曲线陡峭
最终选择 Custom Metrics+HPA 方案,因为:
– 能直接读取 NVIDIA DCGM 的 GPU 利用率指标
– 与 K8s 生态无缝集成
– 配置灵活度极高
核心实现:从指标采集到弹性伸缩
第一步:GPU 指标采集
安装 NVIDIA DCGM Exporter:
helm install dcgm-exporter nvidia/dcgm-exporter \
--set "runtimeClassName=nvidia"
第二步:自定义指标适配器
这个 Go 程序会将 DCGM 指标转为 K8s 能识别的格式:
func (c *DCGMCollector) Collect(ch chan<- prometheus.Metric) {gpuUtil := dcgm.GetGPUUtilization()
ch <- prometheus.MustNewConstMetric(
metricDesc,
prometheus.GaugeValue,
gpuUtil,
gpuID,
)
}
第三步:HPA 策略配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: llm-inference
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: llama-7b
minReplicas: 2
maxReplicas: 10
metrics:
- type: External
external:
metric:
name: "dcgm_gpu_utilization"
selector:
matchLabels:
gpu: "a100"
target:
type: AverageValue
averageValue: 70%
性能优化:让 GPU 发挥最大价值
PCIe 带宽优化
通过 Node Affinity 确保高通信负载的 Pod 部署在同一 NUMA 节点:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "gpu-topology"
operator: In
values: ["nvlink"]
动态 Batch Size 调节
这个 PyTorch 代码段会根据可用显存自动调整 batch size:
def auto_batch_size():
free_mem = torch.cuda.mem_get_info()[0]
model_mem = estimate_model_memory()
return int((free_mem * 0.8) / model_mem)
避坑指南:血泪经验总结
Spot 实例回收处理
-
设置 5 分钟优雅终止期:
terminationGracePeriodSeconds: 300 -
在 Pod 中部署中断处理器:
import signal def handle_termination(signum, frame): save_checkpoint() signal.signal(signal.SIGTERM, handle_termination)
多租户显存隔离
关键配置:
– 启用 MIG(Multi-Instance GPU)
– 为每个 namespace 设置 GPU 内存上限
– 定期执行显存碎片整理
效果验证:数据说话
| 指标 | 优化前 | 优化后 |
|---|---|---|
| GPU 利用率 | 35% | 78% |
| 任务等待时间 | 8h | 0.5h |
| 月度成本 | $28k | $19k |
开放性问题
随着模型越来越大,冷启动时间可能长达 10 分钟。如何在快速伸缩和模型预热之间找到平衡点?欢迎大家评论区讨论——我们正在尝试的 pre-warming pool 方案效果还有待验证 …
正文完
发表至: 人工智能运维
四天前
