CentOS上PyTorch网络通信设置指南
静态IP是分布式训练的基础,确保节点IP固定。编辑网络配置文件(路径:/etc/sysconfig/network-scripts/ifcfg-<网卡名>,如ifcfg-ens33),设置以下参数:
DEVICE=ens33
BOOTPROTO=static # 静态IP
ONBOOT=yes # 开机自启
IPADDR=192.168.1.100 # 本机IP
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.1.1 # 网关
DNS1=8.8.8.8 # DNS服务器
DNS2=8.8.4.4
保存后重启网络服务(NetworkManager或network服务):
systemctl restart NetworkManager # 或 systemctl restart network
验证配置:ip addr show ens33(查看IP是否生效),ping 8.8.8.8(测试网络连通性)。
防火墙和SELinux可能阻止进程间通信,测试时可临时关闭:
systemctl stop firewalld && systemctl disable firewalld # 关闭防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 永久禁用SELinux
setenforce 0 # 立即生效
生产环境中建议保留防火墙,仅开放必要端口(如分布式训练的MASTER_PORT)。
通过PyTorch官网获取适合CentOS的安装命令(推荐CUDA版本,支持GPU加速):
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
安装NVIDIA Collective Communications Library(NCCL),用于多GPU/多节点的高效集体通信:
yum install nccl nccl-devel # CentOS通过EPEL仓库安装
验证NCCL是否安装成功:ls /usr/lib64/libnccl.so*(应存在动态链接库文件)。
分布式训练需通过环境变量指定集群信息,建议在脚本中设置或通过终端导出:
export MASTER_ADDR=<主节点IP> # 主节点(rank0)的IP地址
export MASTER_PORT=12345 # 主节点监听端口(需未被占用)
export WORLD_SIZE=<总进程数> # 总GPU数量(如4个GPU则为4)
export RANK=<当前进程排名> # 当前GPU的排名(0到WORLD_SIZE-1)
在PyTorch脚本中,使用torch.distributed.init_process_group初始化分布式环境,推荐使用NCCL后端(GPU优化):
import torch.distributed as dist
dist.init_process_group(
backend='nccl', # 后端:nccl(GPU)、gloo(CPU)
init_method='env://', # 通过环境变量初始化
world_size=WORLD_SIZE, # 总进程数
rank=RANK # 当前进程排名
)
使用torch.distributed.launch工具启动脚本,自动管理多进程:
python -m torch.distributed.launch \
--nproc_per_node=<单节点GPU数量> \ # 如4个GPU则为4
--nnodes=<节点总数> \ # 如2个节点则为2
--node_rank=<当前节点排名> \ # 主节点为0,从节点为1
--master_addr=<主节点IP> \ # 主节点IP
--master_port=<主节点端口> \ # 主节点端口
your_training_script.py # 训练脚本
或使用Open MPI(需提前安装):
mpirun -np <总GPU数量> \
-H <节点1IP>:<GPU数量>,<节点2IP>:<GPU数量> \ # 如- H 192.168.1.100:4,192.168.1.101:4
-bind-to none -map-by slot \
-x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH \
python your_training_script.py
调整TCP参数提升网络吞吐量,编辑/etc/sysctl.conf文件:
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf # TCP连接超时时间(秒)
echo "net.ipv4.tcp_max_syn_backlog = 4096" >> /etc/sysctl.conf # SYN队列长度
echo "net.core.rmem_max = 16777216" >> /etc/sysctl.conf # 接收缓冲区最大值
echo "net.core.wmem_max = 16777216" >> /etc/sysctl.conf # 发送缓冲区最大值
sysctl -p # 生效配置
通过AMP(Automatic Mixed Precision)减少通信数据量,提升训练速度:
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for data, target in dataloader:
data, target = data.cuda(rank), target.cuda(rank)
with autocast(): # 自动混合精度前向传播
output = model(data)
loss = criterion(output, target)
scaler.scale(loss).backward() # 梯度缩放
scaler.step(optimizer) # 优化器更新
scaler.update()
使用工具实时监控网络流量和GPU利用率:
nload:查看实时网络流量(yum install nload -y)。iftop:按IP统计流量(yum install iftop -y)。nvidia-smi:查看GPU利用率、显存占用和通信状态(需安装NVIDIA驱动)。ping命令互相访问,防火墙需开放MASTER_PORT和NCCL相关端口(如12345-12355)。DistributedSampler),避免数据倾斜。