共计 1585 个字符,预计需要花费 4 分钟才能阅读完成。
理解 A100 算力值的本质
刚接触 A100 时,我常被各种算力单位搞得晕头转向。其实可以把它想象成汽车发动机:
- FP32(单精度):像家用轿车,19.5 TFLOPS 算力适合大多数深度学习训练
- TF32(张量加速):像涡轮增压,156 TFLOPS 算力自动优化矩阵计算
- FP64(双精度):像重型卡车,9.7 TFLOPS 算力专攻科学计算
每个 SM 单元(流式多处理器)就像气缸,A100 的 108 个 SM 单元配合 6912 个 CUDA 核心,加上第三代 Tensor Core 才成就了这样的性能怪兽。
硬件接口的算力影响
去年调试多卡服务器时,发现 PCIe 和 NVLink 的差异比想象中更大:
- PCIe 4.0 x16
- 理论带宽 32GB/s
- 实际多卡通信时带宽减半
-
适合单卡推理场景
-
NVLink 3.0
- 每卡 600GB/ s 双向带宽
- 支持 GPU 直接内存访问
- 多卡训练速度提升 3 倍以上

(示意图:PCIe 需经过 CPU 中转,NVLink 建立 GPU 直连通道)
环境配置实战
这个配置脚本在 Ubuntu 20.04 上验证通过,重点看注释部分:
#!/bin/bash
# 驱动安装(适配 470.82+ 版本)sudo apt install -y nvidia-driver-470
# 验证驱动
if ! nvidia-smi | grep -q "A100"; then
echo "[ERROR] GPU not detected!" >&2
exit 1
fi
# CUDA 11.7 环境
wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda_11.7.0_515.43.04_linux.run
sudo sh cuda_11.7.0_515.43.04_linux.run --silent --toolkit
export PATH=/usr/local/cuda-11.7/bin:$PATH
export NVIDIA_TF32_OVERRIDE=0 # 强制禁用 TF32 做精度对比
性能优化实验
用 PyTorch 测试矩阵乘法时发现个有趣现象:
| 精度模式 | 运算速度 (TFLOPS) | 显存占用 |
|---|---|---|
| FP32 | 18.7 | 12GB |
| TF32 | 142.3 | 12GB |
| FP16+AMP | 312.4 | 6GB |
AMP 配置其实很简单(但容易踩坑):
import torch
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler() # 防止梯度下溢
with autocast(dtype=torch.float16): # 关键在这行
output = model(input)
loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
避坑指南
遇到 CUDA out of memory 别急着杀进程:
- 用
nvidia-smi -l 1监控显存变化 - 检查是否有其他进程占用(常见于 Jupyter Notebook)
- 尝试
torch.cuda.empty_cache() - 调整
batch_size为 2 的倍数(Tensor Core 优化要求) - 考虑梯度累积(gradient accumulation)
多卡并行时建议:
– 使用torch.nn.parallel.DistributedDataParallel
– 通过 MIG 技术划分 GPU 资源(适合云环境)
– 注意 HBM2 显存的均衡分配
开放讨论
最近在微调 LLaMA 时遇到个难题:当 batch_size=32 时算力利用率达 92%,但增大到 64 时会爆显存。大家有什么平衡算力利用率和批处理大小的经验?欢迎在评论区分享你的 benchmark 测试结果!
附我的测试环境:
– 2x A100 80GB PCIe
– PyTorch 2.0.1
– CUDA 11.7
– 数据集:Alpaca-7B
正文完
