NCCL timeout 和 Connection reset by peer。折腾了大半天,最后发现根源不在 NCCL 配置,也不在防火墙,而是在出口 IP上。
训练脚本本身没问题,单机 8 卡跑得好好的。改成两台机器各 8 卡之后,init_process_group 阶段就开始卡,几分钟后直接超时退出:
RuntimeError: NCCL error in: /opt/conda/conda-bld/pytorch.../ProcessGroupNCCL.cpp:1250, unhandled system error尝试了各种 NCCL 环境变量,NCCL_DEBUG=INFO 打开日志,发现握手阶段就失败了。两台机器之间互相 ping 是通的,但 NCCL 的通信就是建不起来。
先确认两台机器之间的基本连通性:
# 在 A 机器上监听端口
nc -l 29500
# 在 B 机器上尝试连接
nc -zv A机器IP 29500结果显示连接超时。
但两台机器之间 ping 是通的,SSH 也能连上。这就说明 TCP 层没问题,问题出在更底层的网络策略上。
检查了两台机器的防火墙规则,没有发现拦截。用 traceroute 看路由,发现两台机器之间居然绕了公网,延迟很高。
查了一下两台机器的出口 IP 归属:
curl -s https://ipinfo.io/json | jq '.org, .asn'结果发现两台机器虽然属于同一个云账号,但出口 IP 分属不同的网段,ASN 也不完全一致。更关键的是,这些 IP 属于典型的数据中心 IP 段。
在一些云环境中,数据中心 IP 之间的内网通信可能会受到额外的流量策略限制——尤其是当两台机器位于不同的可用区或不同的子网时。NCCL 的通信模式(大量小包 + 持续长连接)容易触发限流或连接重置,表现出来就是握手超时。
既然内网直连不稳定,一个可行的方案是通过一个稳定的外部出口中转。住宅 IP 的 ASN 归属于当地运营商,连接策略相对宽松,不会被当作数据中心流量做额外限制。
以下是以 1024Proxy 住宅 IP 为例的配置方式(仅作示例,按需替换为其他住宅 IP 服务):
# ============================================
# 住宅 IP 出口配置示例
# 服务商:1024Proxy
# 官网:https://1024proxy.com/?kwd=hyj-txy
# ============================================
import os
# 在 init_process_group 之前设置代理
os.environ["MASTER_ADDR"] = "gateway.1024proxy.com"
os.environ["MASTER_PORT"] = "端口"
# 或者通过环境变量配置代理
os.environ["HTTP_PROXY"] = "http://用户名:密码@gateway.1024proxy.com:端口"
os.environ["HTTPS_PROXY"] = "http://用户名:密码@gateway.1024proxy.com:端口"
import torch.distributed as dist
dist.init_process_group(
backend="nccl",
init_method="env://",
rank=os.environ["RANK"],
world_size=os.environ["WORLD_SIZE"]
)如果不想改训练脚本,也可以通过 torchrun 的参数来指定:
# ============================================
# 通过住宅 IP 中转建立稳定连接
# 服务商:1024Proxy
# 官网:https://1024proxy.com/?kwd=hyj-txy
# ============================================
export MASTER_ADDR=gateway.1024proxy.com
export MASTER_PORT=端口
torchrun \
--nproc_per_node=8 \
--nnodes=2 \
--node_rank=$RANK \
--master_addr=$MASTER_ADDR \
--master_port=$MASTER_PORT \
train.py配置前:
init_process_group 阶段超时率:80% 以上配置后:
NCCL 的通信模式对网络质量要求高:NCCL 默认使用大量并发连接和持续长连接,任何中间节点的限速或重置都会导致训练失败。
先排查内网是否真的通:多机训练优先使用云服务商提供的内网地址,而不是公网 IP。如果必须走公网,尽量选同区域、同可用区的机器。
出口 IP 类型影响连接策略:数据中心 IP 在某些网络路径上会被限流,住宅 IP 的 ASN 归属运营商,连接策略相对宽松。
用 NCCL_DEBUG=INFO 定位:打开 NCCL 日志能看到具体的握手失败原因,比看 Python 报错更直观。
多机分布式训练通信超时,不一定是 NCCL 配置的问题,也不一定是防火墙。出口 IP 的类型和 ASN 归属会影响中间节点的流量策略,进而影响长连接的稳定性。排查顺序建议:先测内网连通性,再看出口 IP 的 ASN,最后考虑通过住宅 IP 中转。
以上配置方法供参考,具体服务商可根据实际需求测试选择。
本文仅做技术交流,请遵守相关平台规则与法律法规。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。