性能调优
已发行
性能调优的目标是最大化 GPU 利用率、最小化调度延迟、确保工作负载稳定运行。
性能指标与目标
| 指标 | 度量方式 | 目标值 |
|---|---|---|
| 调度延迟 | Pod 创建到 Running 的时间 | < 5s |
| GPU 利用率 | 实际计算时间 / 总时间 | > 70% |
| 显存利用率 | 已用显存 / 总显存 | > 60% |
| 调度成功率 | 成功绑定 / 总调度请求 | > 99% |
| 设备分配延迟 | Allocate 调用耗时 | < 500ms |
调度性能优化
策略选择
| 策略 | 调度速度 | 利用率 | 适用场景 |
|---|---|---|---|
| binpack | 快 | 高 | 推理集群、成本优化 |
| spread | 快 | 中 | 高可用场景 |
| topology-aware | 慢 | 高 | 训练集群 |
binpack 策略计算最简单,调度速度最快。拓扑感知需要查询 GPU 拓扑信息,增加调度延迟。
节点缓存优化
HAMi 调度器通过 Informer 缓存节点和 Pod 信息,避免重复查询 API Server:
scheduler:
# 缓存同步间隔(影响缓存新鲜度)
cacheSyncPeriod: 30s
# 节点设备缓存刷新间隔
deviceCacheRefreshPeriod: 30s并发调度
scheduler:
# 并发调度协程数
concurrentSchedules: 10批量处理
对于大量 Pod 同时调度的场景(如 Deployment 扩容),建议:
- 使用优先级确保关键工作负载先调度
- 配置 Pod Disruption Budget 避免批量驱逐
资源配置优化
显存分配策略
原则:显存请求应略大于实际使用量(预留 10-20% 安全余量)
推理场景:
- 模型权重 + KV Cache + 框架开销 = 实际显存需求
- 请求显存 = 实际需求 × 1.1
训练场景:
- 模型权重 + 梯度 + 优化器状态 + 激活值 = 实际需求
- 建议独占 GPU,不共享算力分配比例
# 推理场景:算力共享效果好
resources:
limits:
nvidia.com/gpu: 1 # 使用 1 个 GPU
nvidia.com/cores: 30 # 30% 算力限制
nvidia.com/gpumem: 4000 # 4GB 显存
# 训练场景:不共享算力
resources:
limits:
nvidia.com/gpu: 1 # 独占
nvidia.com/gpumem: 40000 # 40GB 显存超卖配置调优
scheduler:
overcommit:
enabled: true
# 推理场景可以适度超卖
deviceMemoryScaling: 1.2 # 显存超卖 20%
deviceCoreScaling: 1.0 # 算力不超卖
# 注意:超卖会增加资源争用风险
# 建议配合监控观察实际利用率切分数量优化
devicePlugin:
nvidia:
# splitCount 决定每张 GPU 最多分配给几个 Pod
# 值越大,共享密度越高,但每个 Pod 获得的算力越少
splitCount: 10 # 默认值
# 推理场景推荐:5-20(根据模型大小调整)
# 开发场景推荐:10-20(多人共享)
# 训练场景推荐:1(独占)系统级调优
NUMA 亲和性
GPU 和 CPU 的 NUMA 拓扑影响数据传输性能:
# 查看 NUMA 拓扑
lscpu | grep NUMA
nvidia-smi topo -m
# 确保 Pod 调度到 GPU 所在的 NUMA 节点
# HAMi 的拓扑感知调度可以自动处理# 启用拓扑感知
scheduler:
policy:
gpuSchedulerPolicy: topologyCPU 管理策略
# 对性能敏感的工作负载使用 static CPU 管理策略
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cpuManagerPolicy: static内核参数
# 增加 GPU 相关的内存锁定限制
ulimit -l unlimited
# 调整 I/O 调度器(推荐使用 none/mq-deadline)
cat /sys/block/nvme0n1/queue/scheduler
# 禁用 GPU 的自适应电源管理(性能优先)
nvidia-smi -pm 1 # 启用 Persistence Mode
nvidia-smi -pl 300 # 设置功率限制网络优化
多卡训练场景对网络带宽敏感:
# 检查 NCCL 环境变量
export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=eth0 # 指定网络接口
export NCCL_IB_DISABLE=0 # 启用 InfiniBand(如果可用)性能基准测试
调度器基准测试
# 批量创建 Pod 测试调度吞吐
for i in $(seq 1 100); do
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: bench-$i
spec:
containers:
- name: bench
image: busybox
command: ["sleep", "3600"]
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 1000
restartPolicy: Never
EOF
done
# 测量调度延迟
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.startTime}{"\n"}{end}'GPU 利用率基准测试
# 在 Pod 内运行 GPU 压力测试
kubectl exec <pod-name> -- python3 -c "
import torch
# 创建张量占用显存
x = torch.randn(10000, 10000, device='cuda')
# 矩阵运算测试算力
for _ in range(1000):
y = torch.matmul(x, x)
print('Benchmark complete')
"vLLM 推理基准测试
# 使用 vLLM benchmark 工具
python -m vllm.entrypoints.openai.api_server \
--model <model-name> \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.9
# 使用 benchmark_client 测试吞吐
python benchmark_serving.py \
--model <model-name> \
--dataset-name random \
--random-input-len 1024 \
--random-output-len 256 \
--num-prompts 1000大规模集群优化
节点数量扩展
扩展建议:
- 每增加 50 个 GPU 节点,调度器增加 0.5 core CPU
- 监控调度延迟,超过 5s 时考虑扩容调度器
- 使用 topology-aware 策略时,调度延迟会随节点数增加GPU 数量扩展
扩展建议:
- 单节点 8 GPU 是常见配置
- 超过 100 张 GPU 时考虑分区域调度
- 使用 nodeSelector/affinity 限制调度范围调度器性能瓶颈分析
# 启用 pprof
kubectl port-forward -n hami-system deployment/hami-scheduler 6060:6060
# CPU 分析(30 秒采样)
curl -o cpu.prof http://localhost:6060/debug/pprof/profile?seconds=30
go tool pprof cpu.prof
# 内存分析
curl -o mem.prof http://localhost:6060/debug/pprof/heap
go tool pprof mem.prof性能调优清单
- 选择合适的调度策略(推理→binpack,训练→topology)
- 配置合理的 splitCount(推理 5-20,训练 1)
- 显存请求预留 10-20% 安全余量
- 启用 NUMA 亲和性(拓扑感知策略)
- 设置 GPU Persistence Mode
- 监控实际 GPU 利用率,调整超卖系数
- 大规模集群使用分区调度
- 定期运行性能基准测试
小结
本章介绍了 HAMi 的性能调优方法:
- 调度优化:策略选择、缓存、并发
- 资源配置:显存、算力、超卖、切分数量
- 系统级调优:NUMA、CPU、内核、网络
- 基准测试:调度器吞吐、GPU 利用率、vLLM
- 大规模优化:节点扩展、分区调度