Ray集群启动失败主因是节点环境不一致:必须统一Python路径(如/opt/anaconda3)和虚拟环境名(ray_env);head节点需显式指定--node-ip-address(禁用localhost/0.0.0.0);worker必须用head输出的动态--address和--redis-password启动;最终须用ray.get()验证跨节点任务执行。

所有节点必须用完全相同的Python路径和虚拟环境名
Ray集群启动失败最常见的原因是节点间环境不一致。不是“差不多一样”,而是/opt/anaconda3必须是所有机器上conda安装的绝对路径,ray_env必须是所有节点上conda activate激活的环境名。
常见错误现象:
-
ray start --head成功,但worker节点报ConnectionRefusedError: [Errno 111] Connection refused - Dashboard能打开,但
ray.nodes()只返回本机节点 - 任务提交后卡住,
ray.get()永不返回
实操建议:
- 统一用
bash Anaconda3-2023.07-2-Linux-x86_64.sh -b -p /opt/anaconda3安装,别改-p参数 - 所有节点执行
conda create -n ray_env python=3.9 -y,不要用python=3.9.18这种带补丁号的写法 - 激活后运行
which python,确认输出是/opt/anaconda3/envs/ray_env/bin/python(不是~/miniconda3/...)
ray start --head必须显式绑定--node-ip-address且禁用localhost
Linux服务器默认可能有多个IP(如127.0.0.1、192.168.x.x、10.x.x.x),Ray若自动选错IP,worker节点就找不到头节点。
正确命令示例:
ray start --head \ --node-ip-address=192.168.1.100 \ --port=6379 \ --dashboard-port=8265 \ --include-dashboard=true
关键点:
- 绝对不要省略
--node-ip-address,哪怕你只有一块网卡 - 不要用
0.0.0.0或localhost——这会让Ray监听在回环地址,外部节点无法连接 -
--port=6379是Redis通信端口,必须和worker节点--address里的端口号一致 - 防火墙要放行
6379(Redis)、8265(Dashboard)、10001-10099(worker间通信端口范围)
worker节点启动时必须用头节点输出的完整--address和--redis-password
头节点启动后终端会输出类似这样的信息:
To connect to this Ray runtime from another node, run ray start --address='192.168.1.100:6379' --redis-password='5241590000000000'
这个--address和--redis-password是动态生成的,每次ray start --head都会变。不能手敲、不能复制错、不能用旧值。
实操建议:
- 直接复制粘贴整行命令,在worker节点shell里执行
- 如果worker报
redis.exceptions.AuthenticationError,说明密码错了,重新看头节点输出 - 不要尝试用
ray.init(address="...")代替ray start——那只是客户端连接,不是注册worker节点 - worker节点也必须先
conda activate ray_env再执行ray start
验证集群是否真正就绪:别只看Dashboard
Dashboard显示“2 nodes”不等于集群可用。很多用户卡在任务分发环节,因为Ray认为节点“在线”,但实际无法执行远程函数。
真正有效的验证方式:
import ray ray.init(address="auto") # 连接本地集群 print(len(ray.nodes())) # 应输出总节点数(含head) <p>@ray.remote def f(): import socket return socket.gethostname()</p><p>print(ray.get([f.remote() for _ in range(4)])) # 应返回4个不同主机名</p>
容易被忽略的点:
-
ray.init(address="auto")依赖/tmp/ray下的元数据,如果worker节点没成功注册,这里会连错地址 - 返回主机名列表里如果有重复(比如全是
head-node),说明worker没生效,问题出在ray start --address参数或网络连通性 - 第一次运行
ray.get可能慢几秒——这是正常冷启动,但超过30秒没返回,基本就是节点没连上
路径一致性、IP绑定、密码同步、实际任务调度验证——这四步缺一不可。少走任何一步,集群都只是看起来在跑。











