第二章 硬件选型与配置:GPU/TPU选型、CPU与内存配置、网络与存储方案
做AI训练,说白了就是跟硬件打交道。你算法写得再漂亮,硬件跟不上,照样白搭。我见过太多团队,模型设计得挺好,结果一跑起来,GPU利用率不到30%,钱花了不少,效率却低得可怜。
这一章,咱们就聊聊怎么选硬件、怎么配硬件。嗯,都是我在项目里踩过的坑,总结出来的经验。
2.1 GPU/TPU选型:别只看算力
选GPU,很多人第一反应就是看算力。其实没那么简单。你想想看,算力再高,显存不够,模型塞不进去,那不等于白搭?
我个人习惯,先看显存,再看算力。为什么?因为显存决定了你能跑多大的模型。比如你训练一个7B的LLM,用FP16精度,光模型参数就要14GB。加上优化器状态、梯度、激活值,没个40GB显存,根本跑不起来。
核心原则:显存优先,算力次之,带宽兜底。
具体怎么选?我列个表,你参考一下:
| 场景 | 推荐GPU | 显存 | 算力(TFLOPS FP16) | 参考价格 |
|---|---|---|---|---|
| 小模型实验(<1B参数) | RTX 4090 | 24GB | 82.6 | 1.3万 |
| 中等模型(1B-7B) | A100 80GB | 80GB | 312 | 8万+ |
| 大模型(7B-70B) | H100 80GB | 80GB | 989 | 25万+ |
| 超大模型(>70B) | H100集群 / TPU v4 | 多卡聚合 | 分布式 | 百万级 |
小提示:如果你预算有限,可以考虑二手A100。我在项目中用过,性价比很高。但要注意,二手卡的水很深,一定要测过显存和散热再付款。
至于TPU,说实话,我接触得不多。但有一点可以确定:TPU更适合Google生态的用户。如果你用TensorFlow或JAX,TPU确实香。但PyTorch用户,还是老老实实用GPU吧。
2.2 CPU与内存配置:别让CPU拖后腿
很多人只关注GPU,忽略了CPU和内存。这是个常见的误区。我遇到过好几次,GPU算力爆表,但CPU处理数据太慢,导致GPU一直在空等。
为什么会这样?因为数据加载、预处理、分布式通信,这些活儿都是CPU干的。CPU跟不上,GPU就得歇着。
我的建议是:
- CPU核心数:至少16核,推荐32核以上。核心数越多,数据加载的并行度越高。
- CPU主频:3.0GHz以上。主频影响单线程性能,尤其是数据预处理环节。
- 内存容量:至少是显存的2倍。比如你用80GB显存的A100,内存至少160GB。我习惯配到256GB,留点余量。
- 内存带宽:DDR5或更高,带宽越大越好。带宽不够,数据搬运就会成为瓶颈。
警告:千万别用消费级CPU(比如i7、i9)跑大规模训练。它们的内存通道数太少,带宽根本不够。我见过有人用i9-13900K配A100,结果内存带宽只有40GB/s,GPU利用率不到20%。
嗯,这里还要提一下NUMA架构。如果你用的是双路服务器,一定要注意CPU和内存的亲和性。我曾经踩过这个坑:数据加载线程跑在CPU0上,但内存分配在CPU1上,结果跨NUMA访问,延迟高得离谱。
解决办法很简单:用numactl绑定CPU和内存节点。
# 绑定到CPU0和内存节点0
numactl --cpunodebind=0 --membind=0 python train.py
2.3 网络与存储方案:分布式训练的命脉
单卡训练,网络和存储的影响不大。但一旦上了多卡、多机,这两样就是命脉。
先说网络。分布式训练的核心是梯度同步。每个GPU算完自己的梯度,得发给别人,然后汇总。这个通信量有多大?你算算看:一个7B模型,用FP32梯度,每个梯度4字节,总共28GB。如果8张卡同步一次,通信量就是28GB × 8 = 224GB。
所以,网络带宽必须够。我的经验是:
- 单机多卡:用NVLink或NVSwitch。带宽至少600GB/s。别用PCIe,带宽差一个数量级。
- 多机多卡:用InfiniBand或RoCE。带宽至少100Gbps,推荐200Gbps或400Gbps。
再说存储。训练数据得从硬盘读到内存,再送到GPU。如果存储太慢,数据加载就会成为瓶颈。
我建议的存储方案:
- 本地NVMe SSD:放热数据,比如当前epoch的数据。读写速度至少3GB/s。
- 分布式文件系统:放冷数据,比如历史数据集。推荐Lustre或GPFS。
- 内存缓存:用
mmap或tmpfs把数据映射到内存。适合小数据集。
小技巧:我习惯在训练前把数据全部加载到内存里。虽然启动慢一点,但训练过程中不会有任何IO延迟。前提是内存够大。
下面这张图,是我总结的硬件选型与配置的核心逻辑。你看一眼,应该能有个整体印象。
2.4 避坑指南:我踩过的那些坑
最后,分享几个我亲身经历过的坑。你遇到了,至少知道怎么绕过去。
坑1:GPU利用率低
我曾经训练一个BERT模型,GPU利用率只有15%。查了半天,发现是数据加载线程数太少,CPU一直在等IO。后来把num_workers从4改成16,利用率直接飙到85%。
坑2:分布式训练通信超时
有一次做8机64卡训练,总是报通信超时。排查后发现是网络交换机配置不对,MTU值设成了1500,导致大包被分片。改成9000后,问题解决。
坑3:显存溢出
训练一个13B模型,显存总是差那么一点点。后来用了梯度检查点(gradient checkpointing),以少量计算换显存,成功塞了进去。嗯,这个技巧后面会详细讲。
好了,硬件选型这块就聊到这儿。记住一句话:没有最好的硬件,只有最合适的配置。下一章,咱们聊聊训练框架的选择,那又是另一番天地。