
Ray 私有化部署实战在裸金属与私有云上启动 Ray 集群的两种方式【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray输出文章Ray 私有化部署实战在裸金属与私有云上启动 Ray 集群的两种方式本文面向需要在自有机房、裸金属服务器或私有云环境中运行 Ray 的团队系统讲解两种主流的本地集群搭建方式一是基于ray start的手动逐节点部署二是基于 Ray cluster launcher 的自动化拉起ray up/ray attach/ray down。读完本文你将掌握完整的配置写法、关键参数含义以及常见连接故障的排查方法并能直接在自己的机器上复现一套可运行的本地 Ray 集群。本文内容以仓库中的官方文档 on-premises.md 为主线结合 example-full.yaml 等真实配置与源码进行展开。一、两种启动方式怎么选在裸金属bare metal或私有云环境中搭建 Ray 集群仓库提供了两条路径取舍依据主要是节点数量与对自动扩缩容的需求手动逐节点部署Manual Setup在各台机器上分别安装 Ray 包并手工启动进程适合机器数量少、网络简单、希望完全掌控每个节点行为的场景。集群启动器Ray cluster launcher通过一份 YAML 配置文件统一描述所有节点head 与 worker 的 IP、SSH 用户等由ray up命令自动完成 SSH、初始化、安装与启动流程适合预先知道全部节点、且具备 SSH 访问权限的场景。cluster launcher 内置于ray命令行工具与云端AWS/GCP/Azure的启动方式共用同一套自动扩缩容autoscaler机制。两种方式都需要集群内各节点处于同一网络且每台机器上都已安装 Ray。安装命令如下[default]依赖包含 cluster launcher 所需的全部能力pip install -U ray[default]完整的安装细节可参考仓库的 Ray 安装文档位于 doc/source/cluster 相关章节安装步骤以当前仓库 README 与文档为准。二、手动方式ray start逐节点启动2.1 启动 head 节点在任选的一台机器上执行ray start --head --port6379--port指定 GCSGlobal Control Service监听端口。如果省略该参数Ray 会先尝试 6379若被占用则回退到随机端口。命令执行成功后会在终端打印集群地址形如123.45.67.89:6379该地址需要传给其他节点用于加入集群。若此时收到ConnectionError应优先检查防火墙设置与网络配置。关于 GCS 与端口的细节可结合仓库核心实现进一步了解ray start --head会在本机拉起 GCS、object store、raylet 等核心进程其中 gcs_server.cc 是 GCS 服务端主进程负责全局状态管理端口占用探测逻辑可在 src/ray/common 与ray/_private相关模块中看到。2.2 启动 worker 节点在其余每台机器上执行ray start --addresshead-node-address:port将head-node-address:port替换为 head 节点打印出的地址即可。这里有两点需要特别留意NAT 子网问题如果计算节点位于独立的子网且经过网络地址转换NAThead 节点打印的地址在子网外可能不可达。此时应改用从远端可达的 head 地址例如使用域名compute04.berkeley.edu代替 IP交由 DNS 解析。资源声明Ray 会自动探测各节点可用资源如 CPU 核数也可以手动覆盖。例如声明某台机器提供 10 个 CPU 与 1 个 GPUray start --head --port6379 --num-cpus10 --num-gpus1--num-cpus与--num-gpus会覆盖自动探测结果ray start的完整参数说明参见仓库文档 配置页。2.3 常见故障排查若报错Unable to connect to GCS at ...说明给定--address对应的 head 节点不可达可能原因包括head 节点实际未在运行指定地址上运行的是不同版本的 Ray地址填写错误防火墙规则阻止了访问。官方文档建议用nmap或nc这类工具逐端口验证连通性# 用 nmap 检查端口是否开放 $ nmap -sV --reason -p $PORT $HEAD_ADDRESS Nmap scan report for compute04.berkeley.edu (123.456.78.910) Host is up, received echo-reply ttl 60 (0.00087s latency). rDNS record for 123.456.78.910: compute04.berkeley.edu PORT STATE SERVICE REASON VERSION 6379/tcp open redis? syn-ack Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # 用 nc 快速测试 TCP 端口 $ nc -vv -z $HEAD_ADDRESS $PORT Connection to compute04.berkeley.edu 6379 port [tcp/*] succeeded!当节点无法访问该地址端口时会看到类似下面的输出端口状态为closed且nc报Connection refused$ nmap -sV --reason -p $PORT $HEAD_ADDRESS Nmap scan report for compute04.berkeley.edu (123.456.78.910) Host is up (0.0011s latency). rDNS record for 123.456.78.910: compute04.berkeley.edu PORT STATE SERVICE REASON VERSION 6379/tcp closed redis reset ttl 60 Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . $ nc -vv -z $HEAD_ADDRESS $PORT nc: connect to compute04.berkeley.edu port 6379 (tcp) failed: Connection refused这类输出可以帮助快速定位是网络不通、防火墙拦截还是端口未监听。三、自动化方式Ray cluster launcher 一键拉起3.1 核心命令cluster launcher 是ray命令行工具的一部分提供ray up、ray down、ray attach三条核心命令分别用于创建/更新集群、销毁集群、SSH 进入 head 节点。完整安装命令pip install ray[default]3.2 使用示例配置快速上手仓库在 python/ray/autoscaler/local/example-full.yaml 提供了一份带完整注释的本地集群配置模板。从本地机器按以下流程操作即可拉起一套集群# 获取示例配置内容与本仓库 python/ray/autoscaler/local/example-full.yaml 一致 # 在仓库内可直接以本仓库文件为模板 # 编辑 example-full.yaml填入 head_ip、worker_ips 与 ssh_user # vi example-full.yaml # 创建或更新集群命令结束后会打印 SSH 进入 head 节点的命令 ray up example-full.yaml # 在 head 节点上打开一个远程终端 ray attach example-full.yaml # 在此处尝试运行一个 Ray 程序 # 销毁集群 ray down example-full.yaml使用前必须修改模板中的三个字段文档原链接对应文件中的具体行号本仓库文件位置见 example-full.yamlprovider.head_iphead 节点的 IP 或主机名provider.worker_ipsworker 节点 IP 列表auth.ssh_userSSH 登录用户名。3.3 配置项逐段解读以 example-full.yaml 为准以下为本仓库 example-full.yaml 中的核心配置段集群标识与 Docker 支持cluster_name: default # 可选在 Docker 容器中运行所有命令并开放所需端口 docker: image: rayproject/ray-ml:latest-gpu # 无需 GPU 时可用 latest-cpu 加速启动 # image: rayproject/ray:latest-gpu # 无 ML 依赖时拉取更快 container_name: ray_container pull_before_run: True # True 时总是拉取最新镜像否则仅在本地无缓存时拉取 run_options: # 传给 docker run 的额外参数 - --ulimit nofile65536:65536Docker 段可整体注释掉默认禁用。启用后所有 setup 与启动命令都会在容器内执行镜像内必须包含 Ray。provider 与节点清单provider: type: local head_ip: YOUR_HEAD_NODE_HOSTNAME # 若 ray up 从集群网络外部执行如本地笔记本可能需要提供 head 的公网 IP # external_head_ip: YOUR_HEAD_PUBLIC_IP worker_ips: [WORKER_NODE_1_HOSTNAME, WORKER_NODE_2_HOSTNAME, ... ] # 可选使用 coordinator server 实现自动管理时填写 host:port # coordinator_address: host:porttype: local即使用本地节点提供者local node provider。启用coordinator_address后可以在一组物理机上同时运行多个自动扩缩容集群由 coordinator 按需分配节点——这正是下文中自动管理模式的核心。SSH 认证auth: ssh_user: YOUR_USERNAME # 当以下两类机器无需私钥即可 SSH 时可注释掉 ssh_private_key # (1) 执行 ray up 的机器 # (2) Ray 集群的 head 节点 # ssh_private_key: ~/.ssh/id_rsa内部机制ray up所在机器的 SSH 凭据会被复制到 head 节点——ssh key 会被加入 file mounts 列表并通过 rsync 同步到 head随后 head 再通过 SSH 依次初始化各 worker。因此ssh_private_key可以注释掉的判断依据就是这两类机器是否还需要私钥。worker 数量与扩缩容策略# 除 head 外最少启动的 worker 数应 0 min_workers: TYPICALLY_THE_NUMBER_OF_WORKER_IPS # 最大 worker 数优先级高于 min_workers max_workers: TYPICALLY_THE_NUMBER_OF_WORKER_IPS # 扩缩容速度越大则扩容越快autoscaler 按 # upscaling_speed * 当前运行节点数 的增量分批扩容需 0 upscaling_speed: 1.0 # 空闲节点超过该分钟数后会被回收 idle_timeout_minutes: 5手动管理模式下的默认行为是min_workers max_workers len(worker_ips)即 Ray 启动在全部可用节点上自动管理模式则要求必须显式设置max_workers且min_workers默认为 0。文件分发与同步# 字典形式 REMOTE_PATH: LOCAL_PATH将本地文件/目录复制到所有节点 file_mounts: { # /path1/on/remote/machine: /path1/on/local/machine, } # 从 head 复制到 worker 的路径列表属于 file_mounts 的子集绝大多数场景请用 file_mounts cluster_synced_files: [] # head 上的 file_mounts / cluster_synced_files 变更是否持续同步到 worker file_mounts_sync_continuously: False # rsync up/down 时排除的文件模式 rsync_exclude: - **/.git - **/.git/** # rsync 过滤规则文件如 .gitignore在源目录及子目录中递归查找 rsync_filter: - .gitignore初始化与启动命令# 在 setup_commands 之前运行若启用 docker则在容器外、docker 就绪前执行 initialization_commands: [] # 每个节点上执行的安装/环境准备命令 setup_commands: [] # 典型用法配合 file_mounts 在每台节点创建/更新 conda 环境 # conda env create -q -n my_venv -f /path1/on/local/machine/environment.yaml \ # || conda env update -q -n my_venv -f /path1/on/local/machine/environment.yaml # head 节点公共 setup 之后的自定义命令 head_setup_commands: [] # worker 节点公共 setup 之后的自定义命令 worker_setup_commands: [] # 启动 Ray 的命令通常无需修改 head_start_ray_commands: - ray stop - ulimit -c unlimited ray start --head --port6379 --autoscaling-config~/ray_bootstrap_config.yaml # worker 节点启动命令 worker_start_ray_commands: - ray stop - ray start --address$RAY_HEAD_IP:6379值得注意的是--autoscaling-config~/ray_bootstrap_config.yamlcluster launcher 会把自动扩缩容配置写到该文件ray start --head通过它接入 autoscaler。这与 defaults.yaml 中的默认命令保持一致后者定义了 on-prem 集群的默认启动行为同样的 head/worker 启动命令、upscaling_speed: 1.0、idle_timeout_minutes: 5等。3.4 开发者调试用配置若你需要在裸机上开发 Ray 本身而非仅作为用户部署可参考 development-example.yaml。它通过 file_mounts 把本地 Ray 仓库的某个 commit SHA 挂载到所有节点再由 setup_commands 拉取你的 fork 并git reset --hard到对应版本从而在集群上复现指定 commit 的源码状态file_mounts: /tmp/ray_sha: /YOUR/LOCAL/RAY/REPO/.git/refs/heads/YOUR_BRANCH setup_commands: - source activate ray test -e ray || git clone https://github.com/YOUR_GITHUB/ray.git - source activate ray cd ray git fetch git reset --hard cat /tmp/ray_sha # - source activate ray cd ray/python pip install -e . head_start_ray_commands: - source activate ray ray stop - source activate ray ulimit -c unlimited ray start --head --port6379 --autoscaling-config~/ray_bootstrap_config.yaml worker_start_ray_commands: - source activate ray ray stop - source activate ray ray start --address$RAY_HEAD_IP:6379四、自动管理模式coordinator 与多集群共享节点对于在同一组物理机上运行多个自动扩缩容集群的需求仓库提供了 coordinator server 方案服务端coordinator_server.py 是一个运行在本地/私有集群上的 Web 服务通过 HTTP 接收远端CoordinatorSenderNodeProvider传来的节点提供器调用并在本地以LocalNodeProvider执行客户端每个集群的配置中通过provider.coordinator_address: host:port指向该服务效果coordinator 将节点按需分配给不同集群实现多集群共享一套物理机。启动 coordinator 的命令python coordinator_server.py --ips comma_separated_ips --host HOST --port PORT配套的最小配置模板见 example-minimal-automatic.yaml其核心要点是provider: type: local coordinator_address: COORDINATOR_HOST:COORDINATOR_PORT min_workers: 0 # 自动管理下默认 0 max_workers: 2 # 自动管理下必填 auth: ssh_user: YOUR_USERNAME # ssh_private_key: ~/.ssh/id_rsa自动管理模式下max_workers必填、min_workers默认为 0若节点上尚未安装 Ray也可以通过setup_commands在集群创建时统一安装模板注释中给出了pip install -U ray[default] wheels-url的示例写法。五、从配置到源码local provider 的工作原理cluster launcher 的本地实现位于python/ray/autoscaler/_private/local/其中LocalNodeProvider源码路径 python/ray/autoscaler/_private/local/node_provider.py实现了节点提供器接口它把worker_ips列表视为固定节点池ray up 时依次对这些节点执行 SSH 初始化与worker_start_ray_commands而 coordinator 模式下远端调用通过 HTTP 转发到 coordinator server再由它驱动本地LocalNodeProvider从而把固定的 IP 列表变为可由多个集群按需分配的资源池。这一设计让 on-prem 集群与云集群共用同一套ray up/autoscaler 逻辑只是节点提供器从云 API 换成了本地 SSH 或 coordinator 转发。从源码结构看ray up的大致链路是解析 YAML 配置 → 通过 provider 获取节点列表 → 按initialization_commands → setup_commands → head/worker_setup_commands顺序执行 → 最后执行head/worker_start_ray_commands拉起 Ray 进程。因此理解 example-full.yaml 中每一段命令的时机是自定义裸机集群的关键。六、总结与下一步本文围绕 on-premises.md 给出的两条路径完整梳理了手动方式ray start --head --port6379与ray start --addresshead:port的用法、--num-cpus/--num-gpus资源覆盖以及 GCS 连接失败的 nmap/nc 排查流程自动化方式ray up/ray attach/ray down的命令流example-full.yaml 中 provider、auth、扩缩容、file_mounts、启动命令等全部配置段高级话题coordinator server 多集群共享节点、development-example.yaml 的源码开发用法以及 LocalNodeProvider 的底层机制。若需进一步扩展集群规模或探索更多配置项可继续阅读仓库的 Ray 集群配置参考 以及 cluster launcher 总览。至此你已经可以在自己的裸机或私有云上启动一套可用的本地 Ray 集群。【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考