返回首页播客摘要节目时长 · 45:02

5月26日 周二 · 09:00

Cursor如何在Fireworks上训练Composer:高性能强化学习分布式基础设施

Original title · How Cursor Trained Composer on Fireworks: Distributed Infrastructure for High-Performance RL

暂无纯文本版本

播客中文摘要全文翻译
TL;DR
这期讲了什么

本期播客邀请了Cursor的Federico和Fireworks的Dima,讨论Cursor如何训练其Agentic编程模型Composer 2。Federico解释称,Cursor选择自研模型是为了将所有模型权重专门用于编程任务,以更低的成本实现更好的质量。Composer 2采用双轴训练方法:首先在代码token上进行持续预训练,然后在Cursor测试环境上进行大规模强化学习。Dima详细介绍了大规模RL训练的基础设施挑战,包括需要编排异构的Rollout(模拟Agent会话)和训练流程。

本期你会听到
本期你会听到
  • Cursor训练Composer 2是为了将所有模型权重专门用于编程任务,以通用模型一小部分的成本实现更好的质量
  • Composer 2采用双轴训练方法:在代码token上进行持续预训练,然后在Cursor任务上进行大规模强化学习
  • 大规模RL与预训练不同,需要Rollout来模拟整个Agent会话,这些Rollout是异构的且耗时较长
  • Fireworks帮助构建了分布式基础设施,以高效编排Rollout和训练的流水线,避免GPU空闲时间
对话逐字稿
对话逐字稿

中文逐字稿

00:0000:20发言人1

你需要所有基础设施来运行这些环境,这些环境必须尽可能模仿用户使用计算机的样子。而且尽可能接近非常重要,因为有时候模型实际上能够分辨出它是否运行在一个假环境中而非真实环境中,而且在RL期间和在生产环境中的行为是不同的。

00:2000:26发言人2

你是否看到它意识到自己处于一个假环境中并开始表现得不同?

00:2600:34发言人1

是的。是的。有趣。就像,它会说,哦,我在假环境中。我学到了一些技巧,可以在这种环境中获得更好的奖励,让我来试试。

00:3400:37发言人3

模型喜欢作弊。IRL非常擅长鼓励作弊。

00:5301:26发言人2

我很高兴欢迎Cursor的Federerico和Fireworks的Dima参加今天的播客。Federerico,你是Cursor新推出的Agentic编程模型Composer 2的研究负责人。而且,Dima,你在过去几个月里一直在Cursor兼职,以支持完成这项庞大训练任务所需的大量基础设施。所以我今天很高兴与你们两位讨论Composer 2的训练是如何实现的,你们共同解决了哪些难题,以及你们认为这对AI和基础模型公司的未来意味着什么。

01:2601:28发言人3

激动人心。是的。激动人心。谢谢你们邀请我们。

01:2801:47发言人2

谢谢参与。好吧。让我们直接开始。对于那些没有密切关注我们的人,Cursor最近宣布了Composer 2,这是一个用于长期编程任务的Agentic编程模型。Federerico,迄今为止,Cursor主要是在支持其他人的编程Agent。

01:4701:57发言人2

Cursor投入如此多精力开发Composer 2的初衷是什么?对于你们来说,从一家应用公司转型为基础模型公司有多重要?

01:5702:23发言人1

我们开始研究训练自己的模型的原因是这样的:你可以把模型想象成一个存储驱动器。它的权重中能够存储一定数量的比特。而这个想法非常简单,你知道,就像,只关心一个任务。我们甚至不关心编程本身。我们关心的是Cursor内的软件工程,而且是Cursor内部的。

02:2302:51发言人1

那么如果我们把模型权重中能够存储的所有比特都分配给这一个特定任务呢?另外,人们可能已经注意到,composer的成本比opus和其他编程模型低一个数量级,因为我们只需要将所有模型权重专门用于那个特定任务。所以我们可以服务更小的模型或类似的东西。是的。

02:5102:57发言人2

所以这是关于确保我们拥有的每一个比特权重或信息都专用于我们手头的具体问题。

02:5702:57发言人1

完全正确。

02:5703:08发言人2

明白了。这似乎是一个几乎可以推广的问题。Dima,我很好奇你的看法。你认为每个应用公司都应该把Cursor视为未来的先驱吗?他们都应该尝试做同样的事情吗?

03:0803:38发言人3

是的。绝对地。我的意思是,我们实际上通常将其视为Web应用发展模式的一部分。你可能开始原型设计,或者你可能使用现成的模型来运行一些东西,也许做一些提示工程,了解你的测试平台是如何工作的。但你的应用最具杠杆作用的属性实际上是用户数据的使用或应用如何工作的特定方面的使用,也许是测试平台的某些方面,你提供哪些工具,应用如何工作,这对你的应用非常重要的部分。

03:3803:45发言人3

捕获这些的正确方式,你可以通过提示做一点。但真正做到这一点的正确方式是定制你的模型以在你的环境中行动。

03:4504:15发言人1

是的。绝对地。就像,某些工具是Agent调用的,但这些工具的行为非常难以简洁地描述给模型。而通过训练后训练,我们可以将这些工具的最佳使用方式融入其中。就像composer,我们确实为composer提供了一个提示,但我认为我们训练它的方式,即使没有提示也能工作,而且它会知道该怎么做,只是因为,像,我们本质上是在推动模型,像,在整个训练过程中朝着它应该行动的正确方向前进。

04:1504:16发言人1

基本上,有一种,像,上限,提示工程能达到的程度。如果你真的想制作出色的AI产品,你必须通过影响模型行为来实现。这是一个原因。我的意思是第二个原因是推荐的成本权衡或速度权衡。就像,Fireworks的观点是,你知道,尝试做优化。你有这种质量、速度和成本之间的三维权衡。你可以走得很远,我们正在与所有客户一起做。最初,我们可以仅通过优化基础设施就走得很远。但当你开始进行模型训练时,可以真正将这个权衡推得更远,你可以以一小部分成本获得更好的模型,运行得更快。而Composer是一个很好的例子。

04:5705:20发言人2

我能稍微追问一下吗?我想问这种方法是否与苦涩教训相悖。我们实际上在走路时都在讨论Tab Nine。我记得在LLM时代之前,有这些小型专用编程模型。其中一件让很多人感到惊讶的事情是,当你扩大规模时,你知道,你只是在网上进行大规模训练,包括大量英文文本和其他语言。实际上,这些模型本身在编程方面也变得更好。所以我看到的趋势线就是更大的模型在所有事情上表现更好,包括编程。你们说的话是否与苦涩教训背道而驰?

05:3306:02发言人1

我认为不是。但有一件事要指出,就是大实验室训练的大模型也在大量代码上进行训练。就像,代码是实验室感兴趣的主要任务之一,所以他们不仅仅是泛化到它。它们也有点专业化。对于我们的情况,实际上,如果你相信苦涩教训,我们只是在数据维度上非常努力,我们知道模型本质上容量有限。

06:0206:14发言人1

如果我们想饱和所有那个容量,我们需要扩展数据。为了摄入更多数据,我们需要释放权重中模型可能有的干扰。

06:1406:19发言人2

好的。明白了。非常有趣。好吧,让我们深入探讨Composer 2的训练。

06:1906:30发言人2

你们几周前发布后,立即引起了关注。基准数字很强,推理运行成本低得多。Composer 2是如何工作的简短版本是什么?以及你们做了什么让它如此高效?

06:3006:56发言人1

我们从一个非常强大的基础开始,就是Kymi 2.5。那是一个100万参数MOE,实际上是300亿活跃参数。非常稀疏。实际上。我们看了看股票,意识到有两个轴。所以主要 Composer 1 只是推动其中一个轴,就是强化学习,但 composer 2 在两个不同的轴上推进。

06:5607:22发言人1

一个是持续预训练,另一个是强化学习。所以让 composer 2 非常出色的事情是在这两个方向上都推动。所以我们在训练场上首先在代码 token 上做了大量中期训练,几乎是预训练规模。然后从这个中期训练场出来,我们进行了非常大的RL在很多任务上。

07:2307:35发言人2

好的。这个前提是因为 Cursor 坐落在如此多有趣的编程 token 的中间,你实际上相当独特地拥有几乎预训练规模的数据来训练。为什么不直接预训练你自己的模型呢?

07:3508:15发言人1

我们只是从顶向下思考我们的方法,而不是从底向上。就像,我们怎样才能在最短的时间内获得一个对用户有用的模型?如果我们从底部开始,先弄清楚如何做预训练,然后扩展到中期训练,然后,好,现在我们弄清楚了中期训练,我们做强化学习,那将需要很长时间才能把模型交给用户。通过反过来做,我们能够在非常短的时间内把有用的模型交给用户。所以希望,你知道,像,下一个 composer 版本将是 我们自己的模型,而不是基于开源基础。

08:1508:22发言人2

中期训练步骤中模型大致在学习什么?你们在后期训练步骤中学习什么?

08:2208:54发言人1

是的。所以在中期训练中,它基本上是在学习代码库和学习非常常见的特定代码模式,就像世界知识一样。那里也有网络数据。这基本上创造了一个更广泛的分布,然后强化学习可以磨练它。所以在强化学习期间,你知道,模型直接与光标测试平台一起玩,它了解模型将在其一生中生活的世界,对吧,在某种程度上。

08:5409:27发言人1

所以在强化学习期间,它在那里学习如何正确调用工具,如何导航其环境,如何编写正确的代码。因为在中期训练期间,它学习如何编写代码。这并不一定意味着它学习如何编写正确的代码。我们尝试主要在正确的代码上训练,但模型实际上不知道如何区分两者。而在RL中,我们做的一件关键事情是我们正在调整模型的特征,说,嘿,现在你必须每次都编写正确的代码。

09:2709:27发言人1

正是。

09:2709:36发言人2

有趣。中期训练后的模型是否类似于你们在 Tab 自动完成上的模型,还是不同的核心能力?

09:3609:47发言人1

是的。我的意思是,是的。因为,在中期训练期间,我们只是在做下一个token预测,你知道,就像,你预测下一个token的准确程度,然后是下一个token。所以是的。

09:4709:50发言人2

那为什么不直接在 Tab 自动完成模型上进行后期训练呢?为什么使用不同的模型进行中期训练?

09:5010:06发言人1

是的。我的意思是,Tab是一个非常小的模型,因为它就像一个超低延迟模型,因为我们希望它非常快。所以基础模型的两个核心区别是 Tab很小而 composer 相当大。

10:0610:16发言人2

我明白了。我明白了。好的。所以看起来你们为 Composer 2 所做的很多工作都是这次大规模强化学习运行。你能帮我们分解一下吗?

10:1610:20发言人2

像,这里面有什么,以及你们在这个过程中解决了哪些不同的难题?

10:2010:53发言人3

当你做RL时,它与预训练或再训练相当不同,因为你不仅仅是尝试预测下一个token。你实际上是运行整个测试平台,像,整个实验。你让模型在环境中行动,看看它在给定的Rollout中表现如何。这就是所谓的Rollout这个术语,并给它分配奖励它是否正确做某事,可能是使用LM作为评判或也许可验证的东西,比如这段代码是否编译或类似的东西,这实际上意味着与常规训练相比,你需要一堆其他组件。像,你仍然需要大规模训练。

10:5311:11发言人3

你仍然需要编排数万个GPU进行前向和后向传播,做所有你在中期训练和预训练中做的事情。但现在你还需要编排一堆环境。你需要运行模型推理,因为当你做这个Rollout时,你实际上是在运行类似真实的Cursor会话,对吧?所以如果你有你的

11:1111:13发言人2

所以Rollout就像一个前向传播。

11:1311:26发言人3

不,Rollout基本上是你整个来自Cursor的Agent会话,对吧?所以我们基本上意味着它可能需要大约50轮。模型会接受你的初始提示,然后决定调用一些工具。你想执行那些工具。然后模型生成一堆其他代码。是的。

11:2612:00发言人3

整个会话,当你与Cursor中的Agent交互时,对吧?你实际上是在训练过程中模拟这个整个会话。你得到最终奖励,然后用那个信号现在回到训练器并将其纳入模型权重。所以你有这个非常大的更新循环,这是非常异构的,对吧,因为你有很多不同的组件一起工作。现在你试图编排所有这些以高效地工作,并以高吞吐量工作,因为GPU很昂贵,你想以一种经济的方式快速训练你的模型。

12:0012:24发言人3

所以这本身,就像,是算法和基础设施交叉的非常有趣的问题,因为有很多权衡你如何共同优化和共同设计系统。一个方面是人们所谓的流水线并行。想法基本上是,好吧,你试图分步更新这个模型。对吧?所以你有你的当前模型版本,你正在尝试用它做一堆Rollout。

12:2412:38发言人3

当你做这些Rollout时,你的训练器在做什么?正确的方法会说,好吧,现在我要停止我的训练器。我要做一堆会话,那些会话可能运行五、十甚至更长时间如果是更长的任务。我要暂停我的推理。我的意思是,我会回到训练,尝试做更新。从理论上讲,这是非常稳健的,因为你并没有精确地模拟一切。但它在系统上非常低效,因为一半的容量在时间上是闲置的。所以你可以做所有聪明的事情,像,算法技巧,让

12:5612:57发言人2

你需要反过来。

12:5713:06发言人3

你可以像这样流水线所有这些。想象这是一个巨大的,像,工厂。对吧?你有这个,像,训练楼,你有Rollout楼。它们总是在运转,对吧?

13:0613:45发言人3

Rollout总是获取最新模型版本并尝试做新会话并模拟新Agent会话。训练器总是获取新结果并尝试计算更新。所以一切都在不断移动。权衡是我说它在算法上不同的地方,因为现在当你完成一些测试Rollout时,你的 ki…