3. Ray集群配置与启动

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("集群验证通过")

运行与判定标准

  1. 在Head节点运行 python verify_cluster.py(将上述代码保存为该文件)
  2. 观察输出:总CPU数: 12,且节点IP集合包含至少2个不同IP
  3. 脚本无异常断言错误,最终打印 集群验证通过,即判定集群配置正确、通信正常、资源管理有效
  4. 可选:浏览器访问 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个)以更大概率覆盖所有节点