Open-R1: 更新 #1
自从 DeepSeek R1 发布以来已经过去了两周,自从我们启动 open-r1 项目来复现缺失的部分(即训练流程和合成数据)以来也仅仅过去了一周。这篇文章总结了:
- Open-R1 在复现 DeepSeek-R1 流程和数据集方面的进展
- 我们从 DeepSeek-R1 中学到的以及围绕它的讨论
- 社区自 DeepSeek-R1 发布以来构建的酷炫项目
它既可以作为项目的更新,也可以作为围绕 DeepSeek-R1 的有趣资源的集合。
一周进展
让我们首先看看我们在 Open-R1 上取得的进展。我们在一周前刚刚启动 Open-R1,各个团队和社区的人们齐心协力投入其中,并且我们有一些进展需要汇报。
评估
复现的第一步是验证我们是否可以匹配评估分数。我们能够复现 DeepSeek 在 MATH-500 Benchmark 上报告的结果:
模型 | MATH-500 (HF lighteval) | MATH-500 (DeepSeek 报告) |
---|---|---|
DeepSeek-R1-Distill-Qwen-1.5B | 81.6 | 83.9 |
DeepSeek-R1-Distill-Qwen-7B | 91.8 | 92.8 |
DeepSeek-R1-Distill-Qwen-14B | 94.2 | 93.9 |
DeepSeek-R1-Distill-Qwen-32B | 95.0 | 94.3 |
DeepSeek-R1-Distill-Llama-8B | 85.8 | 89.1 |
DeepSeek-R1-Distill-Llama-70B | 93.4 | 94.5 |
您可以在 open-r1 代码仓库 中找到运行这些评估的说明。
我们观察到的一个现象是 DeepSeek 模型生成结果的巨大尺寸,这使得评估模型本身都具有挑战性。这里我们展示了 OpenThoughts 数据集中 DeepSeek-R1 响应的长度:
R1 响应的分布显示,它们的平均长度非常长,平均响应长度为 6,000 个 tokens,有些响应包含超过 20,000 个 tokens。值得注意的是,平均页面包含约 500 个单词,而一个 token 平均略少于一个单词,这意味着许多响应超过 10 页。(来源:https://x.com/gui_penedo/status/1884953463051649052)
响应的长度将使 GPRO 训练充满挑战,因为我们将不得不生成长补全,这将需要很大一部分 GPU 内存来存储优化步骤的激活值/梯度。
为了公开分享我们的进展,我们创建了一个 open-r1 评估排行榜,以便社区可以关注我们的复现工作(空间在这里):
训练流程
在 Open R1 发布之后,GRPO(Grouped Relative Policy Optimization,分组相对策略优化)被集成到最新的 TRL 版本中(版本 0.14)。此集成支持使用一个或多个奖励函数或模型来训练任何模型。GRPO 的实现与 DeepSpeed ZeRO 1/2/3 集成,用于可扩展到多个 GPU 的并行化训练,并使用 vLLM 进行快速生成,vLLM 是在线训练方法中的主要瓶颈。
from datasets import load_dataset
from trl import GRPOConfig, GRPOTrainer
dataset = load_dataset("trl-lib/tldr", split="train")
# Dummy reward: rewards completions that are close to 20 characters
def reward_len(completions, **kwargs):
return [-abs(20 - len(completion)) for completion in completions]
training_args = GRPOConfig(output_dir="Qwen2-0.5B-GRPO", logging_steps=10)
trainer = GRPOTrainer(
model="Qwen/Qwen2-0.5B-Instruct",
reward_funcs=reward_len,
args=training_args,
train_dataset=dataset,
)
trainer.train()
仍然存在一些与高内存使用相关的限制,并且正在努力分析和减少这些限制。
合成数据生成
R1 报告中最令人兴奋的发现之一是,可以使用主模型来生成合成推理轨迹,并且在这些数据集上微调较小的模型会看到与主模型类似的性能提升。因此,我们自然也希望重新创建合成推理数据集,以便社区可以在其上微调其他模型。
对于像 R1 这样大的模型,主要的挑战是如何高效快速地扩展生成规模。我们花了一周时间调整各种设置和配置。
该模型可以容纳在两个 8xH100 节点上,因此我们自然而然地开始使用该设置进行实验,并使用 vLLM 作为推理服务器。但是,我们很快注意到,这种配置并不理想:吞吐量不是最优的,并且仅允许 8 个并行请求,因为 GPU KV 缓存填充得太快。当缓存填满时,会发生的情况是,使用大量缓存的请求会被抢占,并且如果配置使用 PreemptionMode.RECOMPUTE
,则这些请求会在稍后当更多 VRAM 可用时重新调度。
然后,我们切换到使用 4x 8xH100 节点的设置,总共 32 个 GPU。这为 32 个并行运行的请求留出了足够的备用 VRAM,几乎没有任何请求因 100% 缓存利用率而被重新调度。
最初,我们开始使用批量请求查询 vLLM 服务器,但很快注意到,批处理中的拖尾会导致 GPU 利用率发生变化,因为只有在前一批的最后一个样本完成后,才会开始处理新批次。将批量推理切换到流式传输有助于显着稳定 GPU 利用率:
这只需要更改向 vLLM 服务器发送请求的代码即可。批量推理的代码:
# send requests in batches of 500
# 以 500 批次发送请求
for batch in batch_generator(dataset, bs=500):
active_tasks = []
for row in batch:
task = asyncio.create_task(send_requests(row))
active_tasks.add(task)
if active_tasks:
await asyncio.gather(*active_tasks)
新的流式请求代码:
active_tasks = []
for row in dataset:
# keep the total active requests under 500
# 将总活动请求数保持在 500 以下
while len(active_tasks) >= 500:
done, active_tasks = await asyncio.wait(
active_tasks,
return_when=asyncio.FIRST_COMPLETED
)
task = asyncio.create_task(send_requests(row))
active_tasks.add(task)
# wait for all remaining tasks to complete
# 等待所有剩余任务完成
if active_tasks:
await asyncio.gather(*active_tasks)
我们正在以相当恒定的速率生成,但可能仍会进一步探索,例如,当长查询被抢占时,切换到 CPU 缓存是否是更好的策略。
当前的推理代码可以在这里找到。
外联
人们对 open-r1 表现出了广泛的兴趣,包括媒体,因此过去一周,多位团队成员出现在新闻中:
- Lewis 在 CNN 上进行了直播(!):https://x.com/_lewtun/status/1884377909038833894?s=46
- Thom 出现在 Bloomberg 上:https://x.com/Thom_Wolf/status/1884353433865777520
- Leandro 在 NPR 的 Money Planet 节目中进行了聊天(约 21 分钟):https://www.npr.org/2024/11/29/1215793948/deepseek-ai-china-us-semiconductors-stock-nvidia
其他提及:Washington Post, Financial Times, Financial Times, Fortune, Fortune, The Verge, Financial Review, Tech Crunch, Die Zeit, Financial Times, New York Times, The Wall Street Journal, EuroNews, Barrons, New York Times, Vox, Nature, SwissInfo, Handelsblatt, Business Insider, IEEE Spectrum, MIT Tech Review, LeMonde.
我们从 DeepSeek-R1 中学到了什么?
在社区仍在消化 DeepSeek-R1 的结果和报告之际,DeepSeek 在发布仅仅两周后就引起了更广泛的公众关注。
对 R1 的回应
在发布后的第一个星期相对平静之后,第二个星期市场反应显着,引发了多家 AI 研究实验室的回应:
- 股市在周一遭受打击,但在随后的几天里趋于稳定或恢复:https://x.com/KobeissiLetter/status/1883831022149927352
- OpenAI 的 CEO Sam Altman 祝贺 DeepSeek,并宣布他们将提前发布一些新内容的时间表:https://x.com/sama/status/1884066337103962416
- OpenAI 的首席研究官 Mark Chen 评论说,DeepSeek 如何发现了与 OpenAI 用于 o1 的想法相似的想法:https://x.com/markchen90/status/1884303237186216272
- Anthropic 的 CEO Dario Amodei 借此机会加倍强调出口管制,描绘了一个两极或单极世界的景象:https://x.com/DarioAmodei/status/1884636410839535967
与此同时,多家公司致力于通过各种平台提供 DeepSeek 模型(非详尽列表):
- Dell:Dell CEO 兼创始人 Michael Dell 与 Hugging Face 合作,宣布推出运行 DeepSeek-R1 的本地解决方案:https://x.com/MichaelDell/status/1884677233014398994
- AWS:Amazon CEO Andy Jassy 宣布 DeepSeek-R1 现在可在 Amazon BedRock 和 SageMaker 上使用:https://x.com/ajassy/status/1885120938813120549
- Hyperbolic AI: https://hyperbolic.xyz/blog/deepseek-r1-now-hosted-on-hyperbolic
- Together AI: https://x.com/togethercompute/status/1882110120274088278
- Fireworks AI: https://fireworks.ai/models/fireworks/deepseek-r1
DeepSeek V3 训练算力
人们对 V3/R1 宣称的训练成本非常感兴趣。虽然确切的数字可能没有那么重要,但人们进行了一些粗略的计算来验证这里数量级是否正确。TL;DR 这些数字通常看起来在正确的数量级上,正如在这些讨论中看到的那样:
- 马里兰大学教授 Tom Goldstein:https://x.com/tomgoldsteincs/status/1884651376854122774
- MatX 创始人 Reiner Pope 将 Llama3 与 DeepSeek V3 进行比较 https://x.com/reinerpope/status/1884056274893168896
- OpenAI 前 Google Brain/DeepMind 员工 Lukas Beyer,讨论了 MFU 的起源:https://x.com/giffmana/status/1884160434846224688
- SemiAnalysis 发布了一份报告,推测 DeepSeek 可用的基础设施:https://x.com/SemiAnalysis_/status/1885192148037112023
由于许多团队正在努力复现训练流程,我们将获得更多关于模型可能训练效率的证据。
训练数据集
上周,一些猜测浮出水面,称 DeepSeek 可能一直在使用 OpenAI 的输出数据来训练其模型。例如,请参阅 Financial Times。但是,目前尚不清楚这些指控会产生什么后果。
社区
开源社区围绕 DeepSeek-R1 非常活跃,许多人开始围绕该模型构建有趣的项目。
项目
许多项目试图在较小的规模上复现基本的学习机制,因此您可以在家中测试基本的学习原理。
- Will Brown 展示了,您可以使用 TRL 中的 GRPO Trainer 来复现 Llama 1B 的最小训练曲线。
- TinyZero 表明,只需不到 30 美元和一个 3B 的基础模型,您就可以亲自体验 “啊哈”时刻!
- Philipp Schmid 还发布了一个关于 Mini-R1 的教程,再次展示了如何复现“啊哈”时刻。
- 在更大的模型规模上,香港科技大学的研究人员发布了一篇博文,展示了使用 7B 数学模型推理的出现。
- Evolving LLM 实验室的人员已经开始研究 R1 的多模态版本:https://github.com/EvolvingLMMs-Lab/open-r1-multimodal
- Stepanov 开始工作,使用 R1 从文本中提取图: https://huggingface.co/blog/Ihor/replicating-deepseek-r1-for-information-extraction
数据集
社区一直忙于与 R1 相关的大量数据集工作,以下是一些亮点:
- bespokelabs/Bespoke-Stratos-17k:是 Berkeley Sky-T1 数据流程的复现,该流程使用 DeepSeek-R1 创建问题、推理轨迹和答案的数据集。此数据随后用于使用类似于 R1 论文的蒸馏方法微调 7B 和 32B Qwen 模型。
- open-thoughts/OpenThoughts-114k:一个“开放的合成推理数据集,包含 114k 个高质量示例,涵盖数学、科学、代码和谜题”。Open Thoughts 工作的一部分。
- cognitivecomputations/dolphin-r1:包含 DeepSeek-R1、Gemini flash 完成的 80 万个样本数据集,以及来自 Dolphin chat 的 20 万个样本,旨在帮助训练 R1 风格的模型。
- ServiceNow-AI/R1-Distill-SFT:目前有 17,000 个样本,ServiceNow Language Models 实验室为支持 Open-R1 工作而做出的努力。
- NovaSky-AI/Sky-T1_data_17k:用于训练 Sky-T1-32B-Preview 的数据集。该数据集是早期复现 o1 风格推理工作的一部分。在此数据集上训练的模型训练成本不到 450 美元。这篇博文 提供了更详细的信息。
- Magpie-Align/Magpie-Reasoning-V2-250K-CoT-Deepseek-R1-Llama-70B:此数据集扩展了 Magpie 和生成指令数据的方法(无需起始提示),以在响应中包含推理。指令由 Llama 3.1 70B Instruct 和 Llama 3.3 70B Instruct 生成,响应由 DeepSeek-R1-Distill-Llama-70B 生成。
此列表仅涵盖 Hub 上与推理和问题解决相关的一小部分数据集。我们很高兴看到社区在未来几周内构建的其他数据集。
下一步是什么?
我们才刚刚开始,并希望完成训练流程,并在较小的模型上尝试它,并使用扩展的推理流程来生成高质量的数据集。如果您想贡献力量,请查看 GitHub 上的 open-r1 代码仓库 或关注 Hugging Face open-r1 组织。