3. Ray集群配置与启动
任务目标
配置并启动一个包含1个Head节点和2个Worker节点的Ray集群,验证节点间通信正常,并确认集群资源(CPU)被正确聚合与调度。
环境与依赖
- 3台Linux服务器(或1台宿主机上的3个容器),内网互通,均可访问同一Redis端口(本案例使用Ray内置GCS,无需外部Redis)
- Python 3.8+,每台节点已安装
ray[default]==2.9.0 - 所有节点使用相同的
--ray-deployer端口(默认6379)与--gcs-server-port(默认6379)不冲突
集群配置与启动
Head节点执行以下命令启动集群主节点,并指定Dashboard端口供监控:
ray start --head --port=6379 --dashboard-host=0.0.0.0 --dashboard-port=8265 --num-cpus=4
启动成功后,终端会输出 --address=192.168.1.10:6379 的连接地址。两个Worker节点分别执行:
ray start --address=192.168.1.10:6379 --num-cpus=4
若需关闭集群,各节点执行 ray stop。
验证节点通信与资源管理
在Head节点执行以下Python脚本,验证集群状态与跨节点任务调度:
import ray
ray.init(address="auto")
# 1. 验证集群资源总量
cluster_resources = ray.cluster_resources()
print("总CPU数:", cluster_resources["CPU"])
assert cluster_resources["CPU"] == 12, "CPU总数应为3节点×4核=12"
# 2. 验证节点间通信:在Worker节点上执行远程任务
@ray.remote
def get_node_ip():
import socket
return socket.gethostbyname(socket.gethostname())
# 调度3个任务,观察是否分布到不同节点
futures = [get_node_ip.remote() for _ in range(6)]
node_ips = set(ray.get(futures))
print("任务所在节点IP集合:", node_ips)
assert len(node_ips) >= 2, "任务应分布到至少2个不同节点"
# 3. 验证资源调度:提交一个占用2CPU的任务,确认可正常运行
@ray.remote(num_cpus=2)
def heavy_task():
return "2CPU任务执行成功"
result = ray.get(heavy_task.remote())
print(result)
ray.shutdown()
print("集群验证通过")
运行与判定标准
- 在Head节点运行
python verify_cluster.py(将上述代码保存为该文件) - 观察输出:
总CPU数: 12,且节点IP集合包含至少2个不同IP - 脚本无异常断言错误,最终打印
集群验证通过,即判定集群配置正确、通信正常、资源管理有效 - 可选:浏览器访问
http://192.168.1.10:8265,在Dashboard的Cluster页面应看到3个节点均处于ACTIVE状态
常见问题
- 若
ray.init(address="auto")失败,检查Head节点防火墙是否放行6379端口,并确认Worker节点能ping通Head节点IP - 若CPU总数小于12,检查是否有节点意外退出,用
ray status查看各节点资源上报情况 - 跨节点任务分布不均时,可增加任务数量(如改为10个)以更大概率覆盖所有节点