3. AI训练工作负载特征分析
在规划EPYC平台之前,必须先回答一个基础问题:这台机器到底要跑什么?训练与推理虽然共享同一套GPU和CPU硬件,但它们对系统的压力方向几乎相反。训练是"写多读少、计算密集、通信频繁"的长周期任务;推理是"读多写少、延迟敏感、并发密集"的短请求任务。把两者混为一谈,往往会导致CPU核数、内存带宽或PCIe通道配置出现结构性偏差。
训练与推理:两种截然不同的负载画像
训练阶段的前向与反向传播需要保存激活值、梯度与优化器状态。以混合精度训练为例,一个7B参数模型在Adam优化器下,仅优化器状态(一阶矩、二阶矩)就占用约2倍参数量的FP32空间,加上梯度与参数副本,单卡显存需求通常在参数量的16~20倍之间。这意味着训练对显存容量、显存带宽和卡间通信带宽极度敏感,而对单次请求延迟相对宽容——训练可以跑几天,但不能因为通信瓶颈让GPU空转。
推理则相反。权重加载后基本只读,KV Cache随序列长度线性增长,单次请求的显存占用远小于训练,但要求极低的响应延迟和极高的并发吞吐。推理对CPU的需求集中在请求调度、tokenization、采样和KV Cache管理上,属于"高频轻量"型负载。
数据并行、模型并行与通信模式
数据并行(DP)是最常见的扩展方式:每张卡持有完整模型副本,处理不同batch,反向传播后通过AllReduce同步梯度。其通信量与参数量成正比,与卡数成对数关系。当模型大到单卡放不下时,必须引入模型并行。张量并行(TP)把单层矩阵切分到多卡,每层前向和反向都需要AllReduce或AllGather,通信频率极高,因此TP通常限制在单节点内,依赖NVLink或Infinity Fabric等高带宽互联。流水线并行(PP)按层切分,通信量小但存在气泡,适合跨节点扩展。
从CPU视角看,这些并行策略决定了PCIe/NVLink拓扑和NIC placement。TP要求GPU间高带宽低延迟,通常走NVSwitch;DP的AllReduce可以走RDMA网卡,此时CPU需要处理通信库的线程调度与内存注册。如果NIC与GPU不在同一PCIe Root Complex下,跨NUMA的DMA会显著增加延迟。
内存与I/O需求:被低估的瓶颈
训练任务的内存压力来自三个方向:主机内存用于数据加载和checkpoint缓冲,显存用于模型状态,而PCIe/NVLink带宽用于卡间通信。以EPYC 9004系列为例,12通道DDR5-4800提供约460 GB/s的理论带宽,但实际数据加载往往受限于存储I/O而非内存带宽。如果数据集是海量小文件,CPU在文件系统元数据操作上的开销会直接拖慢GPU利用率。
I/O方面,训练需要高吞吐的顺序读(数据集)和突发写(checkpoint)。建议将数据集放在本地NVMe RAID或并行文件系统上,checkpoint写入独立的高速盘,避免与数据读取争抢带宽。推理的I/O压力小得多,但模型加载时的冷启动延迟需要关注,尤其是大模型从存储加载到显存的时间。
检查点与数据加载:CPU的隐形战场
Checkpoint是训练稳定性的保险,但也是CPU和I/O的周期性冲击。一个70B模型的全量checkpoint可能达到数百GB,如果每1000步保存一次,写入时间可能从几十秒到几分钟不等。优化手段包括:异步保存(先写内存再后台落盘)、分片保存(每张卡写自己的分片)、以及增量保存(只存变化的优化器状态)。这些操作都需要CPU参与内存拷贝、压缩和文件系统调用。
数据加载方面,PyTorch DataLoader的num_workers参数直接决定CPU核数需求。经验上,每个worker负责一个batch的预处理,worker数太少会导致GPU等数据,太多则造成CPU上下文切换和内存拷贝开销。对于图像训练,解码和增强是CPU密集型;对于文本训练,tokenization和packing是主要开销。建议用num_workers = 4 × GPU数作为起点,再根据GPU利用率调整。
CPU资源需求画像与EPYC配置建议
综合来看,训练节点的CPU需求可以归纳为:核数要够、主频要高、内存带宽要大、NUMA要可控。具体来说:
- 核数:每GPU配4~8个物理核。8卡训练节点建议64~128核,EPYC 9004系列最高128核,单路即可满足。
- 主频:数据加载和通信调度是延迟敏感型,高主频比多核更重要。优先选择F系列(高主频)或X系列(大缓存)。
- 内存:容量至少为显存总和的2倍,用于数据缓存和checkpoint缓冲。带宽优先,12通道DDR5是标配。
- NUMA:EPYC的CCD/CCX结构导致跨Die延迟差异明显。GPU与NIC应绑定到同一NUMA节点,避免跨Die通信。
- PCIe:8卡GPU需要至少128条PCIe 5.0通道,EPYC 9004提供128条,刚好满足。注意NIC与GPU的Root Complex归属。
numactl --hardware查看NUMA拓扑,用nvidia-smi topo -m确认GPU与NIC的亲和性。如果发现GPU跨NUMA,应在BIOS中调整PCIe bifurcation或使用NUMA绑定脚本。训练启动后,用nvidia-smi dmon观察GPU利用率,若长期低于80%,优先排查数据加载和CPU瓶颈。
最后需要强调:训练与推理的CPU画像不能简单叠加。如果节点同时承担两种任务,建议通过cgroup隔离CPU核,训练任务独占高主频核,推理任务使用剩余核,并限制推理的CPU配额,防止其突发请求抢占训练的数据加载线程。在EPYC平台上,这种隔离可以通过systemd的CPUAffinity和AllowedCPUs实现,配合NUMA绑定,能显著降低训练checkpoint期间的抖动。