Miles Mooncake数据传输实战:用Mooncake Store替代Ray对象存储传递Rollout数据
2026/9/18 7:15:56 网站建设 项目流程

Miles Mooncake数据传输实战:用Mooncake Store替代Ray对象存储传递Rollout数据

【免费下载链接】milesMiles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime.项目地址: https://gitcode.com/GitHub_Trending/miles1/miles

Miles 是一个面向企业级场景的大模型强化学习(RL)后训练框架,用于 LLM 和 VLM 的 Post-Training。在 Miles 中,Rollout 数据默认通过 Ray 对象存储在推理引擎与训练进程之间传递;当集群规模增大、数据量上升时,你可以用Mooncake Store替换 Ray 作为 Rollout 数据的传输后端——只需一个参数--object-store-backend mooncake即可切换,train.pytrain_async.py均受支持。

上图是 Miles 的整体数据流:数据经 custom rollout generation(sglang 引擎)产出后,汇入训练端。Rollout 数据与训练器之间的"交接棒",正是本文的主角——由对象存储(Ray 或 Mooncake)负责传递。

一、为什么需要 Mooncake 数据传递?

在默认的 Ray 对象存储方案下,Rollout 数据要在多机 GPU 之间频繁搬运:

  • 跨节点传输依赖 TCP 网络,大 batch 下容易成为吞吐瓶颈;
  • Ray 对象存储的内存受调度器管理,无法充分利用各节点的空闲内存作为分布式缓存。

Mooncake Store 是一个分布式内存对象存储,Miles 通过抽象层 miles/utils/object_store.py 屏蔽了后端差异:

  • RayObjectStore:调用ray.put()/ray.get()
  • MooncakeObjectStore:通过MooncakeDistributedStore+ 结构化对象接口(MooncakeBundleTransfer)进行分块 PUT/GET。

切换后端后,上层代码(如 miles/ray/rollout/rollout_executor.py 中的object_store.get_instance().put(...)完全无感知,训练器收到的仍是同一个 rollout 字典。

二、环境准备:Mooncake 数据传递的 3 个前提

在启动 Miles 作业前,请确认:

前提说明
版本一致所有 Ray 节点运行相同 Miles 版本与 Mooncake 版本
Master 可用启动mooncake_master(或提供 HA 端点),Miles 作为客户端连接,不负责管理其生命周期
网络可达Ray 与 Mooncake 客户端均使用数据网地址(非回环地址)
显存/内存预算global_segment_sizelocal_buffer_size预留足够的宿主机内存

💡注意:Mooncake 结构化对象 wheel 只随 CUDA 13 镜像发布,在 CUDA 12 镜像上会导入失败。Miles 官方 CUDA 13 镜像(见 docker/Dockerfile)已内置所需 API。

三、快速切换:Mooncake 对象存储后端的 3 步配置

第 1 步:设置传输协议与 Master 地址

export MOONCAKE_PROTOCOL="<tcp或rdma>" export MOONCAKE_MASTER_ADDR="<mooncake-master-host>:50051" # RDMA 专用:每个节点启动 Ray 前设置本机 RDMA 设备名 # export MOONCAKE_DEVICE="<local-rdma-device>"

第 2 步:启动 mooncake_master

mooncake_master --rpc_port 50051 --metrics_port 50052 \ > mooncake_master.log 2>&1 &

第 3 步:在 Miles 训练命令中追加两个参数

--object-store-backend mooncake \ --mooncake-store-init-kwargs \ "{\"protocol\":\"${MOONCAKE_PROTOCOL}\",\"master_server_address\":\"${MOONCAKE_MASTER_ADDR}\"}"

参数定义见 miles/utils/arguments.py。启动脚本与端到端测试统一使用 miles/utils/external_utils/command_utils.py 中的start_mooncake_master()get_mooncake_object_store_args()组装上述配置。

四、双节点实战:8 卡 Rollout + 8 卡训练的完整走查

官方文档给出了一台 8 卡节点跑 Rollout、另一台 8 卡节点跑训练(FSDP 后端)的最小示例,共 3 个同步迭代。核心提交命令如下:

ray job submit --address="${RAY_DASHBOARD_ADDR}" \ -- python3 "${MILES_HOME}/train.py" \ --train-backend fsdp \ --hf-checkpoint "${MODEL_PATH}" \ --prompt-data "${DATASET_PATH}" \ --num-rollout 3 \ --rollout-batch-size 8 \ --rollout-num-gpus 8 \ --update-weight-transfer-mode broadcast \ --object-store-backend mooncake \ --mooncake-store-init-kwargs "${MOONCAKE_STORE_INIT_KWARGS}"

其中 Store 容量配置(小示例用 2 GiB,生产环境请按实际 rollout 数据量调整):

export MOONCAKE_STORE_INIT_KWARGS="{\"protocol\":\"${MOONCAKE_PROTOCOL}\",\"master_server_address\":\"${MOONCAKE_MASTER_ADDR}\",\"global_segment_size\":\"2gb\",\"local_buffer_size\":\"2gb\",\"chunk_bytes\":67108864}"

✅ 全异步训练只需把入口换成train_async.py并加--fully-async,Mooncake 参数保持不变。完整的两节点逐步操作(含 Ray head/worker 启动顺序)请阅读官方文档 docs/advanced/mooncake-rollout-transfer.md。

五、关键参数速查表

--mooncake-store-init-kwargs支持的字段及其默认值来源:

字段默认来源说明
master_server_address环境变量MOONCAKE_MASTERMooncake master 或 HA 端点地址
local_hostnameMOONCAKE_LOCAL_HOSTNAME,回退 Ray 节点 IP客户端对外通告的数据网地址
protocolMOONCAKE_PROTOCOL,回退rdma传输协议,通常为tcprdma
device_nameMOONCAKE_DEVICE本机 RDMA 设备(节点间设备名不同时优先用环境变量)
global_segment_size回退8gb该客户端贡献的 Store 容量
local_buffer_size回退32gb本地传输与暂存容量
chunk_bytesMooncake 默认结构化对象 PUT 分块大小

⚠️容量规划要点:rollout manager 从不贡献 segment,训练 actor 是每节点 1 个贡献 segment——global_segment_size应按"每节点贡献"而非"客户端总数"来配置。

需要数据冗余时,追加一个参数即可:

--mooncake-replica-num 2

六、避坑指南:Mooncake 数据传递的 4 个常见坑

  1. CUDA 12 镜像报导入错误mooncake.structured_object_store仅在 CUDA 13 路径提供,请确认使用 CUDA 13 镜像(见 docker/Dockerfile);
  2. RDMA 设备名各节点不同:务必在每个节点启动 Ray之前设置MOONCAKE_DEVICE,让 Ray 工作进程继承本机设备;
  3. 回环地址只适用于单机:多节点作业必须使用各客户端都能路由到的数据网地址;
  4. 容量配置过小的 OOMglobal_segment_size+local_buffer_size需覆盖在途 rollout 数据量、副本数与并发传输。

七、划重点:Rollout 数据传递 ≠ 模型权重传递 📌

Miles 中这两条链路是相互独立的开关

  • --object-store-backend→ 控制Rollout 数据(本文主题,本文示例使用 Mooncake);
  • --update-weight-transfer-mode→ 控制模型权重更新路径(P2P / broadcast 等)。

下图展示了大模型 RL 训练中权重传递的扩展性对比——P2P(RDMA)在多节点下相比 NCCL Broadcast 最高可获得 7.4× 加速:

也就是说:你可以"Rollout 数据走 Mooncake + 权重走 P2P"自由组合,两条链路独立调优、互不干扰。权重传递细节可参考 docs/advanced/p2p-weight-transfer.md。

八、总结:如何评估是否值得切换?

场景建议
单机、小 batch 实验保持默认 Ray 对象存储即可
多节点、rollout batch 大、异步训练切换 Mooncake,TCP 协议即可见效
有 RDMA 网络的企业集群Mooncake +protocol=rdma,最大化带宽利用率

Miles 的对象存储抽象让这次切换成本极低:不改任何业务代码,只改启动参数,就能让 Rollout 数据传输摆脱 Ray 对象存储的瓶颈,支撑更大规模的 RL 后训练。

【免费下载链接】milesMiles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime.项目地址: https://gitcode.com/GitHub_Trending/miles1/miles

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询