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.py与train_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_size和local_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_MASTER | Mooncake master 或 HA 端点地址 |
local_hostname | MOONCAKE_LOCAL_HOSTNAME,回退 Ray 节点 IP | 客户端对外通告的数据网地址 |
protocol | MOONCAKE_PROTOCOL,回退rdma | 传输协议,通常为tcp或rdma |
device_name | MOONCAKE_DEVICE | 本机 RDMA 设备(节点间设备名不同时优先用环境变量) |
global_segment_size | 回退8gb | 该客户端贡献的 Store 容量 |
local_buffer_size | 回退32gb | 本地传输与暂存容量 |
chunk_bytes | Mooncake 默认 | 结构化对象 PUT 分块大小 |
⚠️容量规划要点:rollout manager 从不贡献 segment,训练 actor 是每节点 1 个贡献 segment——global_segment_size应按"每节点贡献"而非"客户端总数"来配置。
需要数据冗余时,追加一个参数即可:
--mooncake-replica-num 2六、避坑指南:Mooncake 数据传递的 4 个常见坑
- CUDA 12 镜像报导入错误:
mooncake.structured_object_store仅在 CUDA 13 路径提供,请确认使用 CUDA 13 镜像(见 docker/Dockerfile); - RDMA 设备名各节点不同:务必在每个节点启动 Ray之前设置
MOONCAKE_DEVICE,让 Ray 工作进程继承本机设备; - 回环地址只适用于单机:多节点作业必须使用各客户端都能路由到的数据网地址;
- 容量配置过小的 OOM:
global_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),仅供参考