
文档教程人工智能大模型RLHF【免费下载链接】Awesome-ML-SYS-TutorialMy learning notes for ML SYS.项目地址https://gitcode.com/gh_mirrors/aw/Awesome-ML-SYS-Tutorial点击查看免费下载本篇技术指南以 slime与 Miles 社区协作的强化学习框架中的 VLM Multi-Turn Agentic RL 实现为核心系统讲解如何通过一套自定义rollout函数让 VLM 像 LLM 一样无缝开启多轮强化学习训练。你将掌握多轮交互迭代逻辑、环境接口设计、loss mask 与多模态上下文拼接的工程技巧以及 geo3k 数据集上的 GRPO 训练实验证据可直接复用于 Computer Use、具身智能等 Agentic 场景的训练链路搭建。为什么需要统一的 Multi-Turn RL 范式与传统的单次执行Single-turn Inference不同Agentic VLM 的本质是连续交互模型不再是端到端地吐出一个最终答案而是作为决策核心在执行动作Action与感知环境Observation的往复循环中不断演进。每一次模型的输出都会对环境进行一次试探而环境每一轮的反馈又为模型下一次采取行动提供更进一步的信息。这种与环境的多轮交互是 VLM 进化为真正智能体的必经之路。在 Computer Use Agent 或具身智能等场景下模型不是孤立的对话机器人chatbot而是深嵌在环境链路中的思维引擎thinking machine。模型必须具备审时度势的能力输出 Action 引起环境的状态变更UI 状态、物理位移等实时捕获环境以图片等丰富形式返回的 Observation并在长上下文的持续滚动中完成复杂的推理。这正是 slime 协同 Miles 社区在 VLM Agentic Training 中致力攻克的核心场景。得益于 slime 在 LLM Multi-turn Training 阶段就完成的优雅设计用户仅需通过--rollout-function-path参数传入为 VLM Agent 设计的交互逻辑即可无缝衔接自主生成 → 环境交互 → 多模态观测回传 → 迭代推理的完整链路。其设计哲学是一贯的极致解耦Rollout 逻辑不与任何特定数据集格式或交互协议强绑定环境如何解析 Action、如何执行工具、如何反馈 Observation完全由用户自由决定为 Agent 的无限演进保留绝对的自由。核心设计从第一性原理出发的采样与交互逻辑从第一性原理出发任何 multi-turn 训练本质上只需要定义采样与交互逻辑即可。slime 的 LLM Multi-Turn Training例如 Search-R1 类场景的自定义采样通过自定义generate函数让模型在每一轮根据当前上下文生成动作指令实时捕获环境观测并将其增量注入上下文直至模型决定返回结论或超出上下文限制长度。得到完整的 trajectory 后再通过正确的 loss mask 来区分模型输出的动作指令与环境反馈信息。VLM 与 LLM 的多轮采样并无本质区别唯一的差异在于VLM 需要在每一轮交互中额外维护并拼接多模态的上下文信息。slime 将 environment 与 rollout 明确解耦——环境如何解析 Action等设计完全独立于采样与训练之外这提升了整个系统的可复用性与可扩展性。从仓库中关于 slime 架构的代码走读rlhf/slime/code-walk-through/readme.md可以看到slime 的RolloutController通过load_function(self.args.rollout_function_path)动态加载自定义 rollout 函数这就是--rollout-function-path参数的底层机制训练侧则通过loss_masks字段来精确控制哪些 token 参与损失计算。这套机制为 VLM multi-turn 训练提供了统一的接入点。多轮交互迭代逻辑VLM multi-turn 的采样主循环包含五个阶段初始化任务从Sample提取prompt和多模态输入完成首轮编码并初始化sample.tokens、image_data、multimodal_train_inputs_buffer等为后续的多轮循环提供初始化的上下文。模型生成模型产生本回合执行的动作追加到上下文且将 loss mask 对应 position 设置为 1即这些动作 token 参与训练损失。环境接受动作影响把模型输出传递给 envenv 返回 observation可能含多模态内容。追加 observation 到上下文将 observation 编码成下一回合的输入。这里有两处关键细节获取干净的prompt_ids详见下文工程附录追加到上下文且将loss_mask对应的 position 设置为 0环境反馈不作为监督信号在 VLM 场景里observation 可能携带新的多模态内容因此需要同时维护两条链路rollout 侧的image_data每轮把新图片 encode 后 append与训练侧的multimodal_train_inputs每轮 processor 产生的张量需要合并。终止条件由如下各种限制条件共同决定max_turn最多执行max_turns轮交互达到上限后无论任务是否完成都将被迫停止token budget为避免采样长度过长维护一个可用 token 的预算每次模型生成或追加 observation 都会消耗预算一旦预算耗尽就提前停止并标记为截断TRUNCATED确保不会超过最大上下文或最大生成限制env done环境在env.step()中返回doneTrue表示任务已完成或无法继续例如已得到最终判定、进入终止状态等rollout 立即停止不再追加后续轮次。完整的采样-训练闭环如下图所示左侧 Rollout 模块完成准备输入 → SGLang 生成 → 拼接 assistant tokensloss_mask1→ 环境交互 → 编码并拼接 observationloss_mask0、更新多模态状态→ 终止判断的循环终止后 Finalize Sample 拼接多模态张量右侧 Training 模块Megatron / FSDP利用采样结果更新权重再回传给 Rollout 进行下一轮采样。自定义 rollout.generate 伪代码以下伪代码完整展示了一个自定义 multi-turnrollout.generate的骨架它也是开发者接入 VLM multi-turn RL 的核心模板# Pseudocode: custom multi-turn rollout.generate async def generate(args, sample, sampling_params): # 0) Init: load custom variable like environment path and max_turn env load_env_module(args.rollout_interaction_env_path).build_env(samplesample, argsargs) max_turns args.max_turns # injected via --custom-config-path (YAML) # 1) Encode initial prompt and multimodal inputs sample.tokens, image_data, mm_train_buffer init_from_prompt(sample, state) # 2) Turn loop: actor - env - append observation - repeat for _ in range(max_turns): # (a) Actor generation (assistant tokens) response_text, new_tokens, new_logprobs, finish_reason sglang_generate( urlurl, input_idssample.tokens, sampling_paramssampling_params, image_dataimage_data ) append(sample, new_tokens, new_logprobs, loss_mask_val1) # (b) Env step (returns next observation; may include multimodal payload) observation, done, _ env.step(response_text) if done: break # (c) Process and append observation tokens user_msg env.format_observation(observation) obs_ids, obs_image_data, obs_mm_inputs, obs_mm_train encode_observation_delta( user_msg, tokenizerstate.tokenizer, processorstate.processor, toolssample.metadata.get(tools) ) append(sample, obs_ids, [0.0] * len(obs_ids), loss_mask_val0) # (d) Multimodal state update image_data obs_image_data # inference-side image_data if obs_mm_train: mm_train_buffer.append(obs_mm_train) # training-side image_data return sample关键参数与调用点说明--rollout-function-path指向上述generate所在模块slime 的RolloutController在初始化时通过load_function动态加载见 rlhf/slime/code-walk-through/readme.md 中关于RolloutController.__init__的说明。--rollout-interaction-env-path环境模块路径用于加载BaseInteractionEnv的自定义实现。--custom-config-pathYAML注入max_turns等自定义超参数。loss mask 语义assistant 动作 token 置 1参与训练observation token 置 0不参与训练这与 slime 中Sample.loss_mask字段及训练数据转换逻辑_convert_samples_to_train_data中loss_masks的构造保持一致。环境接口BaseInteractionEnvslime 为环境定义了公用接口供用户参考与实现reset()清空环境内部状态step(response_text: str) - (observation: dict, done: bool, info: dict)接收模型输出返回观测与是否结束format_observation(observation: dict) - dict把 observation 转成下一回合要追加的 chat message如果 observation 带multi_modal_data会把图片放进 message content。由于 rollout 与 env 完全解耦用户只需实现自己的环境类并通过--rollout-interaction-env-path注入即可替换任意交互协议工具调用、代码执行、LLM judge 等无需改动 rollout 主循环。实验结果geo3k 数据集上的 Agentic Multi-Turn GRPO基于上述设计作者使用 geo3k 多模态数据集对Qwen3-VL-2B-Instruct进行了 Agentic Multi-Turn GRPO Training以 Megatron-LM 作为训练后端对应训练脚本为 slime 仓库中的examples/geo3k_vlm_multi_turn/run_geo3k_vlm_multi_turn.py。短轮次场景默认配置默认配置下--rollout-max-response-len为 4096max_turns为 3训练指标如下可以看到raw reward持续上升并收敛actor model 实现了有效学习repetition fraction很快下降并未出现无效的语言重复问题模型平均响应长度显著缩短模型逐步学会更高效的推理方式。长轮次、长上下文压力测试为了进一步测试 VLM multi-turn training 的性能和稳定性作者将--rollout-max-response-len从默认脚本中的 4096 逐渐增加到 32000并把max_turns从 3 调大为 20结果显示raw reward仍然稳定上升并收敛其他指标的变化趋势几乎与短上下文、小轮数时无异说明该范式在长轮次下同样稳定性能方面与短上下文长度、小轮数的情况相比训练时间和采样时间均有上升并且采样时间与训练时间的比值明显增大这符合多轮交互的计算预期。需要特别提醒的是如果将上下文长度、轮数设置得过大可能会出现 OOM。需要根据自己的硬件条件和具体场景来合理设置--rollout-max-response-len与max_turns参数。未来计划可扩展性与可诊断性随着 multimodal agentic AI 的训练需求快速增长VLM multi-turn RL 需要更强的可扩展性和可诊断性作者规划了以下方向更稳健的回合控制与重试机制当前 turn loop 采用for turn_idx in range(max_turns)在环境较稳定、交互逻辑较简单时尚可使用但当接入更复杂的交互环境例如 OS 执行时env 可能因超时、动作解析失败、偶发服务错误等原因失败。计划引入 retry 功能将回合推进改为while循环仅在成功完成一次有效交互后才递增 turn同时指定环境交互的失败预算如max_env_retries_per_turn在可恢复场景下通过env.reset()后重试当前 turn同时避免无限循环与不可控的运行时开销。在多轮采样中使用各类 async 训练方法提升性能多轮采样中不同样本的实际轮数与长度存在较大差异由少数超长样本造成的长尾效应可能成为整体吞吐的主要瓶颈。slime 目前已经支持 partial rollout其原理可参考 rlhf/partial-rollout/readme.md 中关于 Partial Rollout 的完整分析但尚未与 VLM 多轮采样进行很好的适配与测试这将是未来的一个工作方向。支持 LLM-as-judge 等更复杂的交互反馈目前 Geo3K 示例环境是 rule-based 的最小实现便于验证链路但很多 multi-turn 场景会引入一个 LLM 来提供每轮的反馈、批改或评价LLM-as-judge。由于 rollout 与 env 已解耦引入 LLM judge 本身并不要求修改 rollout 主循环用户只需实现自己的 env 并通过rollout_interaction_env_path替换即可。但随着交互逻辑变复杂当前的 Base env class 可能偏简单未来可以考虑为环境接口补充更强的能力。更完善的 logging 与 turn-level 指标体系未来需补充更细粒度的指标例如实际执行的轮数分布、截断原因分布、env retry 次数与类型等同时当前日志更多是整条轨迹的粒度而调参和排障可能需要轮粒度的 debug因此计划支持每轮的 logging。工程附录两个关键实现细节Observation Tokens 编码方式dummy messages delta tokens在 multi-turn rollout 里每一轮环境都会返回 observation需要把它编码成prompt_ids追加到sample.tokens让下一轮生成能看到环境反馈。直觉上可以直接对 observation 调用tokenizer.apply_chat_template([message], tools...)进行编码但这样做会引入一个实际问题chat template 往往会自动插入 system prompt 以及 tool 的使用说明若tools非空示例如下|im start]system You are a helpful assistant that can use tools to get information for the user. # Tools You may call one or more functions to assist with the user query.You are provided with function signatures within tools/tools XMLtags: tools ...若每轮都对 observation 直接进行这样的操作这些文本就会被重复追加到上下文导致上下文被重复内容快速撑大浪费 token budget即便这些 observation tokens 在训练里被loss_mask0屏蔽它们仍然占据上下文位置可能影响行为分布与稳定性。为解决这个问题slime 采用了一个通用技巧用固定的DUMMY_MESSAGES作为模板基座计算其对应的 token 数然后只取 observation 带来的增量 tokensdelta tokens。核心思路是先对DUMMY_MESSAGES单独 apply chat template得到dummy_prompt包含 system/tool preamble但不包含本轮 observation再对DUMMY_MESSAGES [message]apply chat template得到formatted_prompt包含相同的 system/tool preamble 本轮 observation用trim_length len(encode(dummy_prompt))得到需要裁剪的前缀长度对formatted_prompt编码后直接切片prompt_ids prompt_ids[trim_length:]从而确保最终追加到上下文的只是一段干净的 observation tokens而不会把 system/tool preamble 每轮重复塞进来。用伪代码概括就是dummy apply_chat_template(DUMMY_MESSAGES, toolstools, add_generation_promptFalse) full apply_chat_template(DUMMY_MESSAGES [obs_msg], toolstools, add_generation_promptTrue) trim len(encode(dummy)) obs_ids encode(full)[trim:] # delta tokens only多轮 multimodal_train_inputs 的处理先 buffer 后一次拼接在 multi-turn rollout 中每一轮把 observation 编码进上下文时如果使用了 VLM 的 processor就会产出一份供训练侧使用的multimodal_train_inputs一个 dictvalue 往往是torch.Tensor例如图片相关的特征信息等。关键问题是这些张量是按轮产生的碎片化 tensor最终训练希望得到拼起来的一整块 tensor。slime 的拼接策略是先 buffer最后按 keytorch.cat一次实现上分两步逐轮收集到 buffer每次_encode_observation_for_generation(...)产出obs_multimodal_train_inputs时不立即拼接而是执行multimodal_train_inputs_buffer.append(obs_multimodal_train_inputs)结束时统一 merge在_finalize_sample(...)里调用_merge_multimodal_train_inputs(multimodal_train_inputs_buffer)先把每一轮的 dict 按 key 聚合成values_by_key[key] [t0, t1, ...]再对每个 key只做一次torch.cat(values, dim0)得到最终 tensor。这样做的好处是每个 key 对应的 tensor 只发生一次大张量分配 一次线性拷贝。相比每轮都 concat 一次可避免反复的大块显存分配与拷贝torch.cat每次都会新分配输出张量并复制旧内容降低碎片化风险同时也避免了每轮cat时短暂同时持有 old new 带来的峰值显存抖动。整体效果是把拷贝/分配开销从O(n²) 降到 O(n)让 peak memory 更稳定、更不易 OOM。小结slime 的 VLM Multi-Turn Agentic RL 从第一性原理出发将采样与交互逻辑作为 multi-turn 训练的唯一必要定义并通过--rollout-function-path、--rollout-interaction-env-path等参数实现 rollout 与环境的极致解耦。开发者只需编写一套自定义rollout函数并实现一个环境类即可像训练 LLM 一样开启 VLM 的多轮强化学习配合 dummy messages delta tokens 的 observation 编码技巧与先 buffer 后拼接的多模态张量合并策略在 geo3k 数据集、Qwen3-VL-2B-Instruct与 Megatron-LM 后端的 GRPO 训练中验证了短轮次与长轮次max_turns达 20、响应长度达 32000下的稳定收敛。这套范式为 Computer Use、具身智能等 Agentic 场景的 VLM 训练提供了可复用的工程底座后续的 retry 机制、async 训练适配、LLM-as-judge 与 turn-level 指标也将进一步补齐其可扩展性与可诊断性。赞分享文档教程人工智能大模型RLHF【免费下载链接】Awesome-ML-SYS-TutorialMy learning notes for ML SYS.项目地址https://gitcode.com/gh_mirrors/aw/Awesome-ML-SYS-Tutorial点击查看免费下载相关推荐slime 中的 SGLang PD Disaggregation为 Agentic RL 与长上下文 Rollout 拆分 Prefill/Decode 服务拓扑slime 中的 SGLang PD Disaggregation为 Agentic RL 与长上下文 Rollout 拆分 Prefill/Decode 服人工智能大模型强化学习RLHF分布式训练slime 外部 Rollout Engine 接入指南--rollout-external-engine-addrs、disk 权重同步与训推解耦实战slime 外部 Rollout Engine 接入指南 rollout external engine addrs 、disk 权重同步与训推解耦实战 本文人工智能大模型强化学习RLHF分布式训练verl 多轮Multi-turnRollout 完全指南SGLang 引擎、工具调用与增量 Tokenization 实战verl 多轮Multi turnRollout 完全指南SGLang 引擎、工具调用与增量 Tokenization 实战 导读 本文是 verlHy人工智能大模型强化学习RLHF分布式训练微调上一篇AI视频字幕去除技术深度解析3大核心算法与高效实现方案下一篇微信聊天记录本地化备份与解析技术实践WeChatExporter深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考