部署大模型时,合理的软硬件选型和配置至关重要。本文总结了GPU选型原则、显存计算方法、多卡配置策略以及常见环境问题。
常见GPU型号对比:
| 型号 | 显存 | FP16峰值算力 | 主要用途 | 参考价格 |
|---|---|---|---|---|
| A100 40G | 40GB | ~312 TFLOPS | 训练/推理7B-70B模型 | ~$10k+ |
| A100 80G | 80GB | ~312 TFLOPS | 训练/推理更大模型 | ~$15k+ |
| H100 80G | 80GB | ~989 TFLOPS | 大规模训练/高吞吐量推理 | ~$30k+ |
| A10 | 24GB | ~312 TFLOPS | 中小模型推理/开发 | ~$1.5k |
| L4 | 24GB | ~302 TFLOPS | 云原生推理 | 云厂商按使用付费 |
| 型号 | 显存 | FP16算力 | 适用场景 |
|---|---|---|---|
| RTX 3090 | 24GB | ~142 TFLOPS | 7B模型int4推理、小模型微调 |
| RTX 4090 | 24GB | ~83 TFLOPS (FP16) / ~166 TFLOPS (BF16) | 7B-13B模型推理,LoRA微调 |
| RTX A6000 | 48GB | ~150 TFLOPS | 13B-34B模型fp16推理,7B全量微调 |
| RTX 4080 | 16GB | ~83 TFLOPS | 7B fp16推理,小模型开发 |
注意事项:
模型权重显存占用 = 参数量 × 每个参数字节数
不同精度下:
| 精度 | 每个参数字节 | n B模型显存占用 |
|---|---|---|
| fp32 | 4 bytes | 4n GB |
| fp16/bf16 | 2 bytes | 2n GB |
| int8 | 1 byte | 1n GB |
| int4 | 0.5 bytes | 0.5n GB |
训练时显存包括三部分:
总显存 = 模型参数 + 梯度 + 优化器参数 + 激活值 + CUDA预留以LLaMA-6B为例计算:
总计(不包括激活值):6 + 6 + 12 + 1.3 = 25.3GB
然后再计算激活值:根据LLaMA架构 hidden_size=4096,每个样本约需要 (4096+11008) × 2048 × 32 × 1byte ≈ 990MB
所以一张A100 (80GB) 在int8精度下,batch_size=50大约可以全参数训练。
| 模型参数量 | fp16推理 | int4推理 | 全量训练(fp16) | LoRA微调(int4) |
|---|---|---|---|---|
| 7B | ~14GB | ~3.5GB | ~112GB+ | ~8-16GB |
| 13B | ~26GB | ~6.5GB | ~208GB+ | ~16-24GB |
| 34B | ~68GB | ~17GB | ~544GB+ | ~24-48GB |
| 65B/70B | ~140GB | ~35GB | ~1120GB+ | ~48-80GB |
问题:能否用4 × V100 32G训练Vicuna 65B?
回答:
数据并行:每个卡存完整模型,处理不同数据分片
张量并行:将每个层的权重拆分到多张卡,计算时卡间通信
流水线并行:将不同层放到不同卡
ZeRO分片:将参数、梯度、优化器状态分片存储到多卡,支持CPU卸载
查看NVLINK拓扑:
1nvidia-smi topo -m查看具体显卡型号信息:
1cd /usr/local/cuda/samples/1_Utilities/deviceQuery
2make
3./deviceQuery错误信息:
OSError: Cannot load native module 'Crypto.Cipher._raw_ecb': ...解决方法:
1pip3 uninstall pycryptodomex
2pip install pycryptodome1ds_report使用PyTorch Profiler可以分析训练中通信开销占比:
1from torch.profiler import profile, record_function, ProfilerActivity
2
3with profile(activities=[ProfilerActivity.CUDA], record_shapes=True) as prof:
4 # 训练一个step
5 model(inputs)
6 loss.backward()
7
8# 导出json可以在TensorBoard查看
9prof.export_chrome_trace("trace.json")实践经验:使用DeepSpeed ZeRO-3时,PCIe版本的卡很大部分时间都在通信,AllGather和ReduceScatter时间可能超过Tensor Core计算时间,FLOPs利用率上不去。
计算公式:
GPU利用率 = 实测FLOPs / GPU理论峰值FLOPs使用DeepSpeed配置flops_profiler可以很方便测试。
举例:A100理论峰值312 TFLOPS,实测100 TFLOPS → 利用率32%。
计算公式:
吞吐量 = 样本数 / 秒 / GPU × max_length
GPU利用率 = 实际吞吐量 / 论文参考吞吐量举例:实测4卡处理速度 3 sample/s,max_length=2048 → 吞吐量 = (3 / 4) × 2048 = 1536 token/s/GPU。Llama论文7B吞吐量约3300 token/s/GPU → 利用率约46.5%。
优点:可以精确看到每个kernel的执行时间、Tensor Core利用率,方便定位瓶颈。
**7B参数模型用fp16推理需要多少显存?int4推理呢?
**能否用4张V100 32GB训练65B模型?
**消费级显卡RTX 4090 (24GB)能跑多大模型?
**ZeRO Offloading是什么?有什么优缺点?
**如何查看GPU利用率和通信开销?
**多卡部署有哪些并行方式?各自优缺点?