GPU性能指标
准确理解和评估GPU性能是AI基础设施规划的核心。 本文将详细介绍GPU性能评估的关键指标和测试方法。
预计阅读时间:50分钟·难度:中级·更新时间:2024年4月
性能指标概述
GPU性能涉及多个维度,单一指标无法全面反映实际应用性能。 需要综合考虑计算能力、内存性能、互联带宽等多个因素。
GPU性能指标体系
GPU性能指标体系:
├── 计算性能
│ ├── 峰值算力 (TFLOPs)
│ ├── 计算效率 (%)
│ └── Tensor Core利用率
│
├── 内存性能
│ ├── 内存带宽 (GB/s)
│ ├── 内存容量 (GB)
│ ├── 内存延迟
│ └── 带宽利用率
│
├── 互联性能
│ ├── NVLink带宽
│ ├── PCIe带宽
│ ├── 延迟
│ └── 拓扑效率
│
├── 实际性能
│ ├── 训练吞吐量
│ ├── 推理延迟
│ └── 扩展效率
│
└── 效率指标
├── 功耗比 (TFLOPs/W)
├── 成本比 (TFLOPs/$)
└── 空间效率计算性能
峰值算力
峰值算力计算方法
峰值算力计算: ┌──────────────────────────────────────────┐ │ 峰值算力 = CUDA核心数 × 频率 × 每周期运算 │ │ │ │ Tensor Core算力: │ │ = Tensor Core数 × 频率 × 每周期矩阵运算 │ └──────────────────────────────────────────┘ A100峰值算力计算示例: ├── CUDA核心: 6912 ├── 基础频率: 1065 MHz ├── 加速频率: 1410 MHz ├── FP32峰值: 6912 × 1410MHz × 2 = 19.5 TFLOPs │ ├── Tensor Core: 432 (第三代) ├── 每周期运算: 256 FMA (FP16) ├── FP16峰值: 432 × 1410MHz × 256 × 2 │ = 312 TFLOPs 不同精度算力关系: ├── FP64: FP32 × 0.5 (或 ×1 for数据中心) ├── TF32: FP32 × 8 (Tensor Core) ├── FP16: FP32 × 16 (Tensor Core) ├── BF16: FP32 × 16 (Tensor Core) ├── FP8: FP32 × 32 (Tensor Core, H100+) └── INT8: FP32 × 32 (Tensor Core)
计算效率
实际计算效率分析
计算效率定义:
┌──────────────────────────────────────────┐
│ 计算效率 = 实际FLOPs / 峰值FLOPs × 100% │
└──────────────────────────────────────────┘
影响计算效率的因素:
├── 内存带宽限制
│ └── 内存墙问题
│ └── AI算法强度较低
│
├── 并行效率
│ └── 任务分配不均
│ └── 同步开销
│
├── 指令级并行
│ └── 指令依赖
│ └── 分支发散
│
└── 数据局部性
└── Cache命中率
└── 内存访问模式
典型工作负载计算效率:
├── 矩阵乘法 (大矩阵): 80-95%
├── 矩阵乘法 (小矩阵): 40-60%
├── 卷积运算: 60-80%
├── Transformer训练: 40-60%
└── 推理 (解码): 10-30% (内存带宽限制)算术强度与性能
算术强度 (Arithmetic Intensity):
┌──────────────────────────────────────────┐
│ 算术强度 = FLOPs / 字节访问量 │
│ │
│ 高算术强度 → 计算密集型 → 高效利用GPU │
│ 低算术强度 → 内存密集型 → 受带宽限制 │
└──────────────────────────────────────────┘
常见操作的算术强度:
├── 矩阵乘法 (GEMM)
│ └── 算术强度 ≈ O(√(M×N×K)/(M×N+M×K+N×K))
│ └── 大矩阵时计算密集
│
├── Attention
│ └── 算术强度 ≈ O(d/s^2) 或 O(s/d)
│ └── 取决于序列长度和隐藏维度
│
├── LayerNorm
│ └── 算术强度 ≈ O(1)
│ └── 内存密集型
│
└── 激活函数 (ReLU等)
└── 算术强度 ≈ O(1)
└── 内存密集型
Roofline模型:
├── 横轴: 算术强度 (FLOPs/Byte)
├── 纵轴: 性能 (GFLOPs/s)
├── 屋顶线: 受限于计算能力
└── 斜线: 受限于内存带宽内存性能
带宽指标
主流GPU内存带宽对比
| GPU | 内存类型 | 容量 | 带宽 |
|---|---|---|---|
| H100 | HBM3 | 80GB | 3.35 TB/s |
| A100-80GB | HBM2e | 80GB | 2.0 TB/s |
| A100-40GB | HBM2 | 40GB | 1.6 TB/s |
| RTX 4090 | GDDR6X | 24GB | 1.0 TB/s |
| L40S | GDDR6 | 48GB | 864 GB/s |
延迟指标
内存延迟分析
内存延迟层次:
├── L1 Cache
│ ├── 延迟: ~20-40 cycles
│ └── 带宽: ~10+ TB/s
│
├── L2 Cache
│ ├── 延迟: ~100-200 cycles
│ └── 带宽: ~5-10 TB/s
│
├── HBM/GDDR
│ ├── 延迟: ~300-500 cycles
│ └── 带宽: 1-3 TB/s
│
└── 系统内存 (via PCIe)
├── 延迟: ~1000+ cycles
└── 带宽: 64 GB/s (PCIe 4.0)
延迟对性能的影响:
├── 随机访问模式
│ └── 延迟敏感
│ └── 需要Cache优化
│
├── 顺序访问模式
│ └── 带宽敏感
│ └── 预取有效
│
└── 大模型推理
└── KV Cache访问是瓶颈
└── 需要内存带宽优化互联性能
互联技术性能对比
| 互联技术 | 带宽 | 延迟 | 特点 |
|---|---|---|---|
| NVLink 4.0 | 900 GB/s | ~1μs | GPU间直连 |
| NVLink 3.0 | 600 GB/s | ~1.5μs | A100 |
| PCIe 5.0 | 128 GB/s | ~2μs | 标准接口 |
| PCIe 4.0 | 64 GB/s | ~2.5μs | 主流标准 |
| IB NDR | 400 Gb/s | ~0.5μs | 节点间 |
性能测试
常用GPU基准测试
# GPU性能测试工具
# 1. nvidia-smi 基础监控
nvidia-smi # GPU状态
nvidia-smi dmon # 持续监控
nvidia-smi pmon -c 10 # 进程监控
# 2. NVIDIA DCGM 诊断
dcgmi diag -r 3 # 全面诊断
dcgmi dmon -e 100 # 性能监控
# 3. CUDA Bandwidth Test
cd /usr/local/cuda/samples/1_Utilities/bandwidthTest
./bandwidthTest # 内存带宽测试
# 4. NVIDIA Nsight 系统
nsys profile python train.py # 性能分析
nsys-ui # 可视化分析
# 5. 计算吞吐量测试
# 使用标准模型测试实际TFLOPs
python -c "
import torch
import time
# 矩阵乘法吞吐测试
def benchmark_matmul(m, n, k, iterations=100):
a = torch.randn(m, k, device='cuda', dtype=torch.float16)
b = torch.randn(k, n, device='cuda', dtype=torch.float16)
torch.cuda.synchronize()
start = time.time()
for _ in range(iterations):
c = torch.mm(a, b)
torch.cuda.synchronize()
end = time.time()
flops = 2 * m * n * k * iterations
tflops = flops / (end - start) / 1e12
return tflops
print(f'TFLOPs: {benchmark_matmul(8192, 8192, 8192):.2f}')
"性能监控
GPU性能监控指标
关键监控指标:
├── 计算利用率
│ ├── GPU利用率 (%)
│ ├── SM利用率 (%)
│ └── Tensor Core利用率
│
├── 内存使用
│ ├── 显存使用量 (GB)
│ ├── 内存带宽利用率 (%)
│ └── 内存分配/释放频率
│
├── 功耗与温度
│ ├── 功耗 (W)
│ ├── 温度 (°C)
│ └── 风扇转速
│
├── 时钟频率
│ ├── GPU时钟 (MHz)
│ ├── 内存时钟 (MHz)
│ └── 是否降频
│
└── 错误统计
├── ECC错误计数
├── Xid错误日志
└── PCIe错误
监控工具:
├── nvidia-smi: 基础监控
├── DCGM Exporter: Prometheus集成
├── dcgm-exporter: Kubernetes监控
└── 自定义脚本: 特定指标采集