← 返回 PaperDaily
大模型与智能体
NVIDIA开源Molt:8.6K行代码驯服700B MoE强化学习
给大模型训练强化学习,框架代码动辄数万行,改个奖励函数得绕三天。NVIDIA最新开源Molt,核心RL代码仅8.6K行,但能流畅训练700B规模的MoE模型,性能还跟Megatron-based框架平起平坐。这框架到底有啥魔力?值不值得你的团队迁移?咱们今天就来扒一扒。
龙哥读论文
发布于 2026-08-14 09:11:28
阅读 3
查看原文
原论文信息如下:
引言:研究基础设施的成本困境
设想一个场景:龙哥想出一个新的强化学习算法改进点,比如修改优势函数估计器。在理想情况下,这应该是一个下午就能搞定的修改。但在主流的大模型训练框架里,这个改动需要遍历训练器、分布式后端、推理引擎胶水代码等好几层抽象,成本让每个研究者都头疼。
这些框架之所以存在这么多层次,有它的历史原因:当工作负载从单步偏好调优进化到智能体强化学习——多轮工具使用、代码执行、视觉语言环境、长程交互时,主流框架是为超大规模训练设计的。它们的多后端结构、独立的推理引擎、分布式训练器、控制器、注册中心、配置层,这些都是超大规模扩展性的代价。对于生产环境来说,这是合理的工程选择。但对于研究来说,这是一个糟糕的默认值:研究者继承了超大规模的复杂性,却不需要它的专业化,理解或修改框架的成本往往超过表达研究假设本身。
NVIDIA最新开源的Molt框架,正是为了解决这个矛盾而生。Molt是一个面向研究的智能体优先强化学习框架,基于PyTorch和NVIDIA AutoModel,核心RL代码仅需约8.6K行,就能在vLLM上驱动1T级大模型的完全异步、多模态、多轮智能体强化学习训练。而且,它的性能与基于Megatron的生产级框架不相上下。
Molt的核心思想是:复杂性不是高性能AI基础设施的必然代价,而是一个从超大规模场景继承来的选择。Molt赌的是,整个算法流程可以保持足够小巧,让研究者和AI编码助手都能完整阅读,而评估表明,这个赌注在吞吐量上没有付出任何代价。
这篇论文的主要贡献包括四个方面:一个可读性优先的框架设计原则、一个token优先的智能体边界、一条快速的异步PyTorch训练路径,以及一个开源实现及其匹配协议的性能评估。
设计原则:可读性优先,单后端精简
Molt的设计建立在五个核心原则之上,每个原则都对应着代码库的具体约束。这些原则不是空谈,而是实实在在指导了框架的每一个实现细节。
研究者必须能读一次函数就理解它的控制和数据流;AI编码助手(比如Claude Code)必须能追溯从命令行参数到执行分支、张量、指标和测试的完整路径,而不需要重构隐藏的控制流。这意味着禁止不必要的间接跳转,任何需要读两遍才能懂的代码都被视为缺陷。这是框架能被AI助手“黑入”修改的关键。
冗余代码被视为缺陷:删除优于添加,除非为了性能调节或可观测性。最重要的是,Molt只支持一个训练后端(AutoModel)和一个推理引擎(vLLM),且都不做fork修改。这意味着上游的每一个改进——新模型、新内核、新服务特性——在上线当天就能直接使用。拒绝多后端抽象,就是直接消除层次化间接的根源。
精简只有在不牺牲吞吐量的前提下才被允许。与基于Megatron的先进框架在匹配协议下性能相当,这是一个设计要求。它禁止了将时间转移到训练路径上的简化操作,并要求通过组合路径后,引擎自身的优化依然可用。
组件一一映射到算法自身的对象:智能体/环境接口、轨迹、优势估计器、损失函数,而不是映射到基础设施层。这禁止了适配层和插件注册中心,一个算法修改只触及一个组件。
生成和训练之间的数值一致性是一等保证,而不是调试后的事后补救。代码库要求训练在完全相同的token上进行生成(token输入/token输出捕获),要求智能体和训练器之间的对数概率保持一致,并要求每一步监控训练-推理残差,任何静默分歧都被视为bug,包括在MoE路由中。
系统实现:四个概念与一个异步循环
Molt有四个承载性的概念,每个都一一映射到代码中:智能体——产生动作和奖励的普通Python代码;生成器——针对推理引擎的token精确捕获;训练器——一个可见的训练循环,包含单个FSDP2策略actor;以及估计器和损失函数——作为奖励、组和token轨迹的纯函数。一个算法修改只触及这四个概念中的一个。
整个运行时就是三个组件和一个循环,足够小到可以完整阅读,并且刻意坚持单后端。Ray提供放置和异步队列,连接智能体池、一组vLLM推理引擎和一个可训练的策略actor(基于NVIDIA AutoModel与FSDP2张量并行/专家并行/上下文并行)。没有混合控制器,没有每个后端的适配层,没有独立的参数服务器。组件之间的契约是token优先的:token ID、每token对数概率、动作范围、奖励和多模态张量从引擎的采样器到损失函数之间保持对齐,没有组件会从文本重新推导token。
流式池让提示组始终保持在飞行状态,并在足够多的组完成时立即发射一个训练批次,这样引擎永远不会在actor训练时耗尽任务。可配置的队列深度将训练吞吐量与生成延迟解耦,后者在智能体工作负载中尾部延迟严重。整个循环进行了端到端的检测:每个优化器步骤都会报告每阶段的时序和轨迹统计,所以算法修改的效果在同一步骤的日志中即可见。
部分轨迹(Partial Rollout)使得权重更新时不必丢弃正在处理中的请求:Molt暂停引擎,广播actor分片,然后恢复保留的请求。恢复的请求可能混合不同的策略版本,因此每个动作token保留它被采样时的对数概率,损失函数应用每token的修正。Molt拒绝在没有启用该修正的情况下运行部分轨迹。
智能体契约是沿着算法自身边界的模块化:它只施加一个义务——一个强化学习运行指定一个Python模块,该模块导出一个AgentRunner,其他一切都是普通代码。奖励可以是任意Python代码,从评分器和沙箱工具到LLM-as-judge调用和完整的视觉语言环境。
Molt提供了两种智能体形式:Env形式和ChatAgent形式。在Env形式中,框架拥有大模型循环,驱动生成、token化、多模态会计和每轮预算,在每次模型动作后调用用户的step()方法。这是一个完整但极简的实现:
from molt.agents import Env, Result, StepEnvRunner
class MathEnv(Env):
async def step(self, state) -> Result:
reward = grade(state["action_text"], state["label"])
return Result(reward=reward, terminated=True)
class AgentRunner(StepEnvRunner):
def __init__(self):
super().__init__(MathEnv)
在ChatAgent形式中,用户拥有循环。如果现有智能体代码运行在标准的OpenAI或Anthropic SDK上,它可以直接训练,无需集成代码。Molt在引擎前面启动一个回环聊天服务器;ctx.base_url携带会话标识符,每个通过它的请求都在服务端解码为一个token精确的累积(token输入/token输出捕获,TITO)。重新token化漂移被消除,因为token空间从未被退出:
from openai import AsyncOpenAI
from molt.agents import ChatAgent, ChatAgentRunner, ChatContext, Result
class MyAgent(ChatAgent):
async def run(self, ctx: ChatContext) -> Result:
client = AsyncOpenAI(base_url=ctx.base_url, api_key=ctx.api_key)
resp = await client.chat.completions.create(
model=ctx.model_name,
messages=[{"role": "user", "content": ctx.prompt}],
max_tokens=ctx.sampling_params.max_tokens,
temperature=ctx.sampling_params.temperature,
)
return Result(reward=grade(resp.choices[0].message.content, ctx.label))
class AgentRunner(ChatAgentRunner):
def __init__(self):
super().__init__(MyAgent)
同一个服务器同时暴露OpenAI和Anthropic两种有线协议,因此外部工具、浏览器自动化、评估框架、OSWorld风格的智能体可以直接驱动策略,无需修改。
对于长程智能体常见的上下文压缩(总结或丢弃早期轮次,重写提示前缀),聊天服务器会检测到重写,密封当前段,并打开一个新的token精确段;组基线仍然看到每个轨迹一个奖励。智能体端不需要任何修改。
传输层是将正确性细节(原则五)与单后端规则(原则二)结合的地方。Molt不携带任何vLLM补丁,因此引擎升级只是容器版本更新,而不是代码重定位;每个传输需求都在客户端侧通过文档化的端点满足。
具体来说,面向训练器的生成使用引擎的token级接口:提示以token ID进入,完成返回为token ID并带有每token对数概率,文本在情节中间从不经过token化器。请求路由器将所有请求(包括渲染调用)保留在拥有其前缀缓存的引擎上,视觉语言提示在服务端渲染并对齐一次,因此图像在传输层只遍历一次,不会被文本端点半路丢弃。
Molt中,可组合的并行性使得1T级别的MoE只需配置就能实现。FSDP2与AutoModel原生的张量并行、专家并行和上下文并行结合,vLLM侧有匹配的旋钮。能够训练稠密4B模型的启动脚本,也能表达DeepSeek-V3级别的配置:将`--fsdp.ep_size 256`作为参数写入,而不是进行后端迁移。这种表达能力经过了实际验证:论文完整运行了700B MoE在专家并行度256下的端到端异步循环,包括轨迹、权重更新和优化器步骤。
对于MoE强化学习,有一个稠密模型所没有的失败模式:轨迹和训练路由器独立选择专家,微小的数值差异可能使两侧评估不同的稀疏计算图。Molt通过轨迹路由重放本地解决这个问题:引擎返回每token的专家选择,actor在训练期间重放它们,而不触及循环的其他部分。
算法层直接应用原则四:估计器是没有策略类或继承层次结构的纯函数。默认是REINFORCE++;REINFORCE with group-mean baseline、RLOO、GRPO、Dr. GRPO、GAE with PPO critic以及on-policy distillation各自通过一个标志选择。
损失函数通过一个全局的整批token均值进行归一化:策略梯度项、KL项和熵项共享一个分母(优化器步骤窗口中未掩码token数量),使更新与数据并行大小和梯度累积深度无关,因此改变集群布局不会静默改变目标函数。
考虑引言中的算法编辑示例:一个新的优势估计器。在Molt中,这就是介绍中说的“一个下午的编辑”:一个关于奖励和组的纯函数,通过`--algo.advantage.estimator`按名称选择,它的调用点位于可见的训练循环中,效果出现在同一步的日志奖励和损失统计中,单元测试就在现有的估计器旁。四个产物:函数、标志、指标、测试,没有跨越任何层次。
实验验证:精简不牺牲性能
实验验证部分回答三个问题:框架自身的RL表面有多大?引擎的服务和内存优化是否在组合路径中通过配置持续可用?精简设计是否能在匹配协议下支持与先进Megatron-based框架相当的吞吐量?
一个新的实验只需三步:编写、启动、观察。编写:在一个Python文件中继承Env或ChatAgent并返回Result(reward=...)。ChatAgent代码示例(上一节展示的)就是一个完整的可训练智能体,将标准的OpenAI SDK指向ctx.base_url,不需要环境DSL或注册中心。启动:一个CLI命令指定模型、提示数据集和智能体模块;内置的单节点和Slurm配方使用相同的CLI和智能体模块。观察:每个优化器步骤将奖励统计、响应长度分布、评估pass@N和每阶段时序分解记录到Weights & Biases和TensorBoard。
在表1的导入图计数方法下,这个工作流背后的完整RL路径大约8.6K Python行,而verl约为62K行,slime约为25K行。精简,但不是靠偷工减料。
由于引擎是组合而非fork的,它们的优化应该在Molt上游发布当天就到达。测量在配有Qwen3.6-35B-A3B配方的多模态MoE策略上进行,使用32K多轮工具使用任务,在2节点(8训练 + 8推理 GPU)上探测了三个精简堆栈可能付出代价的点:多轮重前缀填充、生成和actor内存。
前缀缓存:在自动前缀缓存和会话一致性路由下,增长对话的测量重前缀填充时间为0.05秒(缓存命中时)。这展示了工作路径,而非端到端加速。
投机解码:启用检查点的MTP头后,每步生成时间从329秒下降到64秒:一个配置变化就将配方从生成受限变为训练受限。
优化器CPU卸载:在该配置下,`--fsdp.offload`将actor峰值GPU内存从64.7 GB降至46.4 GB,这是适配8-GPU训练分区与否的区别,而策略训练时间从213秒增加到251秒(增加18%)。
实验结果分析
头对头实验测试原则三:精简设计是否能支持与先进Megatron-based栈相当的吞吐量。Molt(AutoModel + vLLM)与slime(Megatron-Core + SGLang)在Qwen3-30B-A3B上进行比较。协议(表2)固定了两个栈可以共享的每个设置,并允许每个后端使用其推荐的并行布局。两个栈都完全异步运行,采用解耦的8+8 GPU方案:Molt通过其流式异步循环,slime通过其单步异步模式;两边都没有同步运行。Slime不使用`--use-kl-loss`,因此两边都不加载参考模型,每步算法工作相同。
结果是肯定的:两个栈在统计上相当,分别为119.4 ± 2.3秒和109.5 ± 10.3秒每优化器步骤(三次运行的均值±标准差)。Slime的跨运行波动(102-121秒)与Molt的区间重叠,因此不能声称任何方向上的优势;约9%的平均差在跨运行变异范围内。在更长的输出长度下,残留差异应该显著缩小:随着轨迹增长到32K-128K推理和智能体场景,优化器步骤将主要受生成主导,而两个栈都将其委托给推理引擎,而训练后端(这个比较的轴线)的份额将缩小到无关紧要;受控的16K设置是最不利于消除后端差异的场景。训练端布局仍然是一个一阶因素:将针对32K上下文调整的上下文并行度强制到该16K工作负载会将Molt的步骤时间增加约30%。
这里需要明确一点:这个对比是在PaperDaily已收录论文范围内的辅助判断。Molt与Megatron-based栈在性能上并没有绝对的领先优势,而是统计学意义上的相当——两种框架在各自擅长的配置下都能达到类似吞吐量。考虑到两者在代码量和设计哲学上的巨大差异,这个结果本身已经足够说明问题。
相关与未来:定位与扩展
Molt将自身定位于一个专注于可读性和研究效率的精简框架,与已有的强大系统形成对比。verl提供了从FSDP到Megatron的多后端广度;OpenRLHF支持广泛的RLHF变体;slime以Megatron吞吐量为设计中心。这些系统各有其合理的工程目标,但它们的多后端抽象和配置层带来了Molt有意避免的研究成本。
论文指出了一些未来方向:更长的训练上下文、多actor设置、从偏好数据中学习、更精细的时间分析等。目前Molt主要面向单一actor场景,多actor或多任务的扩展还有待验证。此外,虽然单后端的策略降低了复杂性,但也意味着用户被绑定在NVIDIA的AutoModel和vLLM生态上。
总结与开源
Molt是一个面向研究的智能体强化学习训练框架,用约8.6K行Python代码实现了可读性优先、性能不妥协的设计。它通过一个异步循环将Ray、vLLM和NeMo AutoModel组合起来,提供了token精确的轨迹捕获、多种强化学习算法选择,以及从4B稠密模型到700B MoE模型的无缝扩展能力。框架的核心RL代码只有主流框架的几分之一,但在匹配协议下,吞吐量与基于Megatron的先进框架统计相当。
龙迷三问
Molt到底解决了什么问题? Molt解决的是一线研究者在大模型强化学习框架中面临的核心矛盾:主流的Megatron-based框架代码动辄数万行,改个奖励函数需要熟悉好几层抽象,迭代成本极高。Molt通过极简的单后端设计,把核心RL代码压缩到约8.6K行,同时保持性能不降,让研究者能把更多时间花在算法创新上。
"token精确"是什么意思?为什么它这么重要? “token精确”的意思是,在Molt框架中,从推理引擎采样到训练器计算损失的过程中,操作的是完全相同的token ID序列,没有任何转码或重新token化。这消除了强化学习中最隐蔽的错误源之一:生成和训练之间的token不匹配(retokenization drift)。如果生成用了一个token序列,但训练时重新token化得到了不同的序列,模型实际上是在不同的数据上训练。Molt确保这种错误从根本上不会发生。
Molt只能用于NVIDIA的硬件和软件生态吗? 当前设计确实如此。Molt只支持一个训练后端(AutoModel)和一个推理后端(vLLM),二者都是NVIDIA生态的一部分。这是Molt的刻意取舍:用后端选择面的收窄换来代码的极度精简和可读性。如果你正在使用AMD或Intel的硬件,或者依赖其他框架(如PyTorch FSDP原生、DeepSpeed),Molt目前不是直接可用的。不过,它的设计思想和原则对任何框架的实现都有借鉴意义。
如果你还有哪些想要了解的,欢迎在评论区留言或者讨论~
龙哥点评
论文创新性分数: ★★★✰✰
设计原则清晰,但更多是对现有技术的巧妙组合而非全新的理论突破。真正有价值的创新在于将“可读性”和“单后端”提升为设计的一等公民,并验证了这种精简不会牺牲性能。在思路上值得认可。
实验合理度: ★★★★★
实验设计非常扎实。论文公开了匹配协议的所有设置(包括不对称细节),让对比结果具有高度可复现性。三次独立运行的统计报告方式也优于单次运行。跨运行波动的透明报告(slime从102到121秒)进一步增加了可信度。
学术研究价值: ★★★★★
极高。它为被Megatron等巨型框架淹没的研究社区提供了一个反例:高性能AI基础设施不必以复杂性为代价。这种“可读性优先”的设计哲学可能会影响下一代强化学习框架的设计方向。对于学术研究来说,这是一个非常有吸引力的选项。
稳定性: ★★★★✰
基于NVIDIA成熟的AutoModel和vLLM生态,底层组件的稳定性有保障。token精确的保证机制和fail-fast设计也增强了框架自身的鲁棒性。但作为相对较新的框架,在极端工作负载下可能还有未发现的边界情况。四星是因为经过了700B MoE的验证,证明其大模型稳定性是可靠的。
适应性以及泛化能力: ★★★✰✰
受限于单后端设计,适应性被刻意收窄。但框架支持从4B稠密到700B MoE的模型范围,多模态和工具使用场景也都得到支持,因此在这个范围内的泛化能力良好。未来如果验证了多actor、多任务场景,评分可以提升。
硬件需求及成本: ★★★✰✰
训练700B MoE需要的16 GPU(8训练+8推理)已经是相当高的门槛。不过框架本身的设计(如优化器CPU卸载)已经考虑了适配8-GPU场景的努力。而且由于使用了vLLM等成熟引擎,推理开销是可控的。对于有8-16卡的研究团队来说是合理的。
复现难度: ★★★★★
代码已开源,提供配方和容器。框架设计本身就是可读性优先,加上论文对实验设置(包括commit ID)的完整披露,复现难度很低。
产品化成熟度: ★★★✰✰
框架本身设计为研究工具,直接产品化可能还需要更多稳定性测试和监控集成。但底层使用了vLLM和AutoModel等经过生产验证的组件,可以作为生产环境的参考实现或起点。目前定位为“研究框架”,适合研究团队使用,产品化需额外工程。
可能的问题: 单后端(AutoModel + vLLM)的绑定是对NVIDIA生态的深度依赖,AMD/Intel GPU用户无法使用。论文的吞吐量对比仅在16K上下文长度下进行,在更长的上下文(如128K)下性能表现尚未验证。多actor、多任务场景的扩展能力也没有展示。
主要参考文献
[1] Hu, J., Li, H., Zhang, H., et al. Molt: A Scalable PyTorch-Native Training Framework for Agentic Reinforcement Learning. arXiv:2607.21653v1, 2026.
[2] Zhao, Y., et al. PyTorch FSDP: Experiences on Scaling Fully Sharded Data Parallel. Proceedings of VLDB, 2023.
[3] Kwon, W., et al. Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP, 2023.
[4] Shao, Z., et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning with Open Models. arXiv:2402.03300, 2024.
[5] Schulman, J., et al. Proximal Policy Optimization Algorithms. arXiv:1707.06347, 2017.
[6] Moritz, P., et al. Ray: A Distributed Framework for Emerging AI Applications. OSDI, 2018.
*本文仅代表个人理解及观点,不构成任何论文审核或者项目落地推荐意见,具体以相关组织评审结果为准。欢迎就论文内容交流探讨,理性发言哦~ 想了解更多原文细节的小伙伴,可以点击 "阅读原文",