从云原生走向 AI 原生:一套面向未来的架构方法论 → 阅读《AI 原生基础设施》

性能调优

已发行

性能调优的目标是最大化 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: topology

CPU 管理策略

# 对性能敏感的工作负载使用 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
  • 大规模优化:节点扩展、分区调度

参考资料

创建于 2026/06/04 更新于 2026/06/05 1570 字 阅读约 4 分钟