Ray 集群容器化部署

本文演示如何用 Docker 启动一个 Ray 集群(1 主 + 多工作节点),并说明关键参数与常见问题。适用于在同一二层网络或使用 host 网络的场景。

前置条件

  • Docker 已安装并可用(rootless/标准均可)
  • 可访问的镜像 model-server:0812(包含 Ray 及你的服务)
  • 所有节点时间同步、网络互通(尤其是 6379、8265、你的服务端口)
  • 资源规划:CPU/内存/共享内存(/dev/shm)

启动主节点(Head)

通过 ray start 启动主节点容器,并开启 Dashboard 与资源限制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 启动主节点(Head)
docker run -d --name ray-head \
-p 5000:5000 \ # 映射自定义 API 服务端口(示例)
-p 6379:6379 \ # Ray 集群内部通信端口(GCS)
-p 8265:8265 \ # Ray Dashboard 端口
-v /mnt/volumes/modelServer:/usr/resource \ # 业务资源挂载
--network=host \ # 与宿主机共享网络(见下方注意事项)
-w /usr/resource \ # 工作目录
--restart=always \ # 异常退出自动重启
--privileged=true \ # (如非必要可移除)
--shm-size=13gb \ # 共享内存,需 > object-store-memory
model-server:0812 bash -c \
"ray start \
--include-dashboard=True \
--head \
--node-ip-address=0.0.0.0 \ # 监听地址
--port=6379 \ # GCS 端口
--dashboard-host=0.0.0.0 \ # Dashboard 绑定地址
--num-cpus=36 \ # 此节点可用 CPU 数
--memory=80000000000 \ # 可用内存(bytes)
--object-store-memory=12000000000 \ # 对象存储内存(bytes)
&& python -m dataProcessing.server" # 启动你的业务服务

# 检查启动日志
docker logs ray-head
  • 端口说明
    • 5000:示例中的业务 API 服务(可按需调整)
    • 6379:Ray Head 的 GCS 端口(Worker 通过此端口加入)
    • 8265:Ray Dashboard(Web UI)
  • 网络模式:示例使用 --network=host,确保所有节点能直连 Head 的 6379/8265。在云环境(如公有云)中,host 网络需谨慎;
  • 共享内存--shm-size 必须大于 --object-store-memory,否则对象存储易 OOM 或报错。
  • privileged:通常不必需,建议移除,除非你的服务确实需要。

启动工作节点(Worker)

每个 Worker 通过 --address='<HEAD_IP>:6379' 加入集群:

1
2
3
4
5
6
7
8
9
10
11
12
# 启动工作节点 1
docker run -d --name ray-worker_1 \
--shm-size=13gb \
--network=host \
-v /mnt/volumes/modelServer:/usr/resource \
model-server:0812 bash -c \
"ray start \
--address='172.31.13.23:6379' \ # 替换为 Head 节点实际 IP:PORT
--num-cpus=36 \ # 分配给该 Worker 的 CPU 数
--memory=80000000000 \ # 该 Worker 可用内存(bytes)
--object-store-memory=12000000000 \ # 该 Worker 对象存储内存
--block" # 前台阻塞,容器保持运行
  • 多个 Worker 可重复上述命令,修改容器名与资源参数。
  • 若非 host 网络,需确保容器能访问到 Head 的 6379 端口(映射端口或内网解析)。

Python 端连接与资源注解

在 Python 中连接已启动的 Ray 集群:

1
2
3
4
5
6
7
8
import ray

# 集群模式:使用已存在的 Head(ray start 启动)
ray.init(address="auto")

@ray.remote(num_cpus=4, memory=12 * 1024**3)
def my_task():
...
  • 重要区别
    • 集群模式下,资源(CPU/内存/对象存储)应主要在 ray start 层面配置。
    • ray.init(_memory=...) 更适用于单机调试(不通过 ray start 手动起节点),在集群中不生效或不建议依赖。

验证与可视化

  • 访问 Dashboard:http://172.31.13.23:8265(替换为 Head IP)
  • 在 Python 中验证:
1
2
3
import ray
print(ray.is_initialized())
print(ray.available_resources())

常见问题与修正建议

  • 注意:--network=host-p 同时使用在大多数 Docker 版本中无效(host 模式会忽略 -p)。
  • 资源单位为字节,容易写错。示例中 --memory=80000000000 = 80 GB ≈ 74.5 GiB,--object-store-memory=12000000000 ≈ 11.2 GiB,请按物理资源调整。
  • --privileged=true 非必要,建议移除以降低安全风险。

Ray 集群容器化部署
http://example.com/2025/09/08/Ray-集群容器化部署/
作者
Lingkai Shi
发布于
2025年9月8日
许可协议