Open-R1:第一次更新

社区文章 发布于 2025 年 2 月 2 日

image/png

DeepSeek R1 发布至今已两周,而我们启动 open-r1 项目以复现其缺失部分(即训练管道和合成数据)也已整整一周。本文总结了

  • Open-R1 复现 DeepSeek-R1 管道和数据集的进展
  • 我们对 DeepSeek-R1 及其相关讨论的了解
  • 自 DeepSeek-R1 发布以来,社区构建的精彩项目

本文既是对项目进度的更新,也是 DeepSeek-R1 相关有趣资源的集合。

1 周后的进展

首先,让我们看看 Open-R1 的进展。我们在一周前启动了 Open-R1,各团队成员以及社区共同投入其中,我们有一些进展要向大家汇报。

评估

复现的第一步是验证我们能否达到相同的评估分数。我们已经能够复现 DeepSeek 在 MATH-500 基准测试中报告的结果。

模型 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 的响应长度。

Distribution of R1’s responses shows that they are on average very long with the average response being 6,000 tokens long and some responses containing more than 20,000 tokens. Worth noting that the average page contains ~500 words and one token is on average slightly less than a word, which means the many reponses are over 10 pages long. (src: [https://x.com/gui_penedo/status/1884953463051649052](https://x.com/gui_penedo/status/1884953463051649052))

R1 响应的分布显示,它们的平均长度非常长,平均响应长度为 6,000 个 token,有些响应甚至超过 20,000 个 token。值得注意的是,平均一页包含约 500 个单词,一个 token 平均略少于一个单词,这意味着许多响应的长度超过 10 页。(来源:https://x.com/gui_penedo/status/1884953463051649052

响应长度将使 GPRO 训练变得具有挑战性,因为我们将不得不生成长篇补全,这需要很大一部分 GPU 内存来存储激活/梯度以进行优化步骤。

为了公开分享我们的进展,我们创建了一个 open-r1 评估排行榜,以便社区可以关注我们的复现工作(空间位于此处

训练管道

Open R1 发布后,GRPO(分组相对策略优化)已集成到最新的 TRL 版本(0.14 版)中。此集成支持使用一个或多个奖励函数或模型训练任何模型。GRPO 实现与 DeepSpeed ZeRO 1/2/3 集成,用于可扩展到多个 GPU 的并行训练,并使用 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 可用时,请求会稍后再次调度。

然后我们切换到了一个包含 4 个 8xH100 节点(总共 32 个 GPU)的设置。这为 32 个并行请求留出了足够的空闲 VRAM,几乎没有请求因为 100% 缓存利用率而被重新调度。

最初我们开始向 vLLM 服务器批量查询请求,但很快发现批处理中的滞后会导致 GPU 利用率波动,因为只有在前一批的最后一个样本处理完成后,新一批才会开始处理。将批量推理切换到流式传输显著稳定了 GPU 利用率。

image/png

这只需要更改向 vLLM 服务器发送请求的代码。批量推理的代码

# send requests in batches of 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
    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 引起了广泛关注,包括媒体的关注,因此在过去一周里,多位团队成员登上了新闻版面。

其他提及:《华盛顿邮报》《金融时报》《金融时报》《财富》《财富》The Verge《金融评论》Tech Crunch《时代》《金融时报》《纽约时报》《华尔街日报》欧洲新闻Barrons《纽约时报》VoxNatureSwissInfo《商报》Business InsiderIEEE Spectrum麻省理工科技评论《世界报》

我们从 DeepSeek-R1 学到了什么?

尽管社区仍在消化 DeepSeek-R1 的结果和报告,但 DeepSeek 在发布仅两周后就引起了更广泛的公众关注。

对 R1 的回应

发布后相对平静的第一周过去后,第二周市场反应强烈,促使多家人工智能研究实验室做出回应。

与此同时,多家公司致力于通过各种平台提供 DeepSeek 模型(非详尽列表)

DeepSeek V3 训练计算

人们对宣称的 V3/R1 训练成本非常感兴趣。虽然确切数字可能不那么重要,但人们进行了一些粗略计算以验证数量级。总而言之,这些数字似乎大致在正确的数量级上,正如这些讨论中所示:

由于许多团队正在努力复现训练管道,我们将获得更多关于模型可能训练效率的证据。

训练数据集

上周,有人猜测 DeepSeek 可能使用了 OpenAI 的输出来训练其模型。例如,请参见《金融时报》。然而,目前尚不清楚这些指控将产生何种后果。

社区

开源社区对 DeepSeek-R1 表现出极大的热情,许多人开始围绕该模型构建有趣的项目。

项目

有许多项目尝试以较小规模复现基本学习机制,这样您就可以在家测试基本学习原理。

TinyZero 的结果显示模型正在扩展其推理能力。
类似地,香港科技大学研究人员的这张图显示了模型如何随着训练的进行生成越来越长的推理轨迹。

数据集

社区在 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 语言模型实验室为支持 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 组织

社区

感谢您的更新。仅供参考,许多数据集链接似乎已损坏。

·
文章作者

已修复,谢谢!

您能将以下模型添加到您的 R1 蒸馏模型排行榜吗?:D 能在一个地方比较所有蒸馏模型会很棒!
https://huggingface.co/open-thoughts/OpenThinker-7B
https://huggingface.co/bespokelabs/Bespoke-Stratos-7B
https://huggingface.co/bespokelabs/Bespoke-Stratos-32B

我们也能在人类对齐方面合作吗?
https://huggingface.co/blog/etemiz/aha-indicator

这是 HF 的一篇有趣文章——融合了纯粹的训练优点、一些推测和一些观点。

我不知道我是喜欢它还是讨厌它——团队干得好!

能分享一下吞吐量吗?

期待你们的好消息 😍

目前对 R1 训练成本 550 万美元的说法有什么见解吗?

感谢分享。我们什么时候开始对模型进行安全测试?

注册登录发表评论