最近在多节点训练时遇到一个诡异的CPU负载不均问题,记录一下踩坑过程。
现象:使用4个节点进行分布式训练,发现节点1和节点2的CPU负载明显高于节点3和节点4,导致整体训练效率下降。
排查过程:
- 首先确认了各节点的硬件配置完全一致
- 检查了PyTorch的分布式初始化代码,发现使用了默认的
torch.distributed.init_process_group() - 使用
nvidia-smi和htop监控发现GPU利用率正常,但CPU负载差异巨大
最终解决方案:问题出在数据加载环节。使用了以下代码修复:
import torch
from torch.utils.data import DataLoader
# 在创建DataLoader时添加参数
train_loader = DataLoader(
dataset,
batch_size=64,
num_workers=4, # 增加worker数量
pin_memory=True,
persistent_workers=True, # 关键:保持worker进程常驻
sampler=DistributedSampler(dataset) # 确保分布式采样正确
)
关键点在于persistent_workers=True,这能有效避免worker进程频繁创建销毁导致的负载不均。另外还调整了num_workers参数从2调到4,效果更佳。
复现步骤:
- 准备4节点环境
- 使用默认DataLoader配置训练
- 监控CPU负载差异
- 应用上述优化后对比
这个坑踩得有点冤,建议在多节点训练时一定要注意数据加载的优化。

讨论