(deepSpeed) root@ainode3:/home/xie/distribute_test/DistilBERT# pdsh -w ainode01,ainode02,ainode3 "hostname"
pdsh@ainode3: ainode3: connect: Connection refused
pdsh@ainode3: ainode01: connect: Connection refused
pdsh@ainode3: ainode02: connect: Connection refused
🔥 pdsh
连接被拒绝 (Connection refused
) 的原因
pdsh
需要通过 SSH 连接其他服务器 执行命令,Connection refused
说明:
- SSH 端口未开放
- 没有配置免密登录
- 主机名
ainode01
、ainode02
、ainode3
无法解析
✅ 解决方案
1️⃣ 确保 SSH 端口 22 开放
首先确保pdsh使用ssh通信:
export PDSH_RCMD_TYPE=ssh
在 所有服务器上 运行:
sudo systemctl status ssh
如果 SSH 没启动,执行:
sudo systemctl start ssh
sudo systemctl enable ssh
然后测试 SSH 是否能正常连接:
ssh ainode01
ssh ainode02
ssh ainode3
如果提示 Permission denied
,说明免密登录未配置,继续下一步。
2️⃣ 配置 SSH 免密登录
在 ainode3
(当前执行 pdsh
的服务器)上 运行:
ssh-keygen -t rsa # 生成 SSH 密钥,一路回车
ssh-copy-id ainode01 # 复制公钥到 ainode01
ssh-copy-id ainode02 # 复制公钥到 ainode02
ssh-copy-id ainode3 # 复制公钥到 ainode3(本机)
然后测试:
ssh ainode01 "echo SSH 连接成功"
ssh ainode02 "echo SSH 连接成功"
ssh ainode3 "echo SSH 连接成功"
如果不需要输入密码,说明免密登录配置成功。
3️⃣ 确保 ainode01
、ainode02
、ainode3
可解析
在 ainode3
上运行:
ping ainode01
ping ainode02
ping ainode3
如果 ping
不通,尝试直接用 IP 地址:
pdsh -w 192.168.2.186,192.168.2.187,192.168.2.188 "hostname"
如果这样可以执行,说明主机名解析有问题,可以手动修改 /etc/hosts
:
sudo nano /etc/hosts
添加:
192.168.2.186 ainode01
192.168.2.187 ainode02
192.168.2.188 ainode3
然后保存并退出,重新 ping
试试。
4️⃣ 测试 pdsh
免密登录配置好后,运行:
pdsh -w ainode01,ainode02,ainode3 "echo 分布式训练启动"
如果所有服务器都返回 分布式训练启动
,说明 pdsh
已经能正常工作了。
最后,重新尝试 分布式训练启动:
pdsh -w ainode01,ainode02,ainode3 "cd /home/xie/distribute_test && torchrun --nnodes=3 --nproc_per_node=2 --node_rank=\$NODE_RANK --master_addr=192.168.2.186 --master_port=29500 train.py"
🔍 总结
1️⃣ 确保 SSH 端口开放,并能手动 ssh
连接到其他服务器
2️⃣ 配置免密登录,避免 pdsh
运行时需要输入密码
3️⃣ 确保 服务器之间可以互相 ping
通,如果 ping
不通,修改 /etc/hosts
4️⃣ 先用 pdsh
运行简单命令测试,确保 pdsh
可用,再尝试分布式训练