pdsh配置教学

0 阅读2分钟
(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 说明:

  1. SSH 端口未开放
  2. 没有配置免密登录
  3. 主机名 ainode01ainode02ainode3 无法解析

✅ 解决方案

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️⃣ 确保 ainode01ainode02ainode3 可解析

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 可用,再尝试分布式训练