跳到正文
原文
Hugging Face Blog·· 2025-02-02精选AI 评分64

Open-R1 项目更新:复现 DeepSeek-R1 评测、训练管线与合成数据

Open-R1: Update #1

AI 导读

Hugging Face 的 Open-R1 项目启动一周后发布首份更新,称已能复现 DeepSeek 在 MATH-500 上报告的评测分数,并公开了评测排行榜。

推荐理由

Open-R1 团队复现 DeepSeek-R1 评测并公开数据生成与 GRPO 训练的工程细节,可供复现者参考。

正文 · AI 翻译

image/png

距离DeepSeek R1发布已经过去两周,而我们从启动open-r1项目尝试复现缺失部分(即训练流程和合成数据)至今仅仅一周。本文总结了:

  • Open-R1在复现DeepSeek-R1训练流程和数据集方面的进展
  • 我们了解到的关于DeepSeek-R1及其相关讨论的内容
  • 自DeepSeek-R1发布以来社区构建的优秀项目

这既可作为项目的更新,也可作为围绕DeepSeek-R1的有趣资源集合。

1周后的进展

让我们从Open-R1的进展开始。我们在仅仅一周前启动了Open-R1,团队成员及社区成员齐心协力,取得了一些进展,现汇报如下。

评估

复现的第一步是验证我们能否匹配评估分数。我们成功在MATH-500基准测试上复现了DeepSeek报告的结果:

模型 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的回复分布显示,平均而言,回复非常长,平均长度为6000个token,有些回复甚至超过20000个token。值得注意的是,普通一页大约包含500个单词,而一个token平均略少于一个单词,这意味着许多回复超过10页长。(来源:https://x.com/gui_penedo/status/1884953463051649052)

回复的长度将使GPRO训练面临挑战,因为我们必须生成长完成文本,这将需要大量GPU内存来存储激活值/梯度以进行优化步骤。

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

训练流程

在Open R1发布后,GRPO(Grouped Relative Policy Optimization)被集成到了最新的TRL版本(version 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。这留下了足够的空闲 VRAM,使 32 个请求可以并行运行,而且几乎没有请求会因为 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 引起了广泛兴趣,包括媒体的关注,因此过去一周有几位团队成员出现在新闻中:

其他提及: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 研究实验室作出回应:

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

DeepSeek V3 训练算力

围绕 V3/R1 所宣称的训练成本,人们兴趣浓厚。虽然确切数字可能并不那么重要,但人们做了一些粗略估算来验证这里的数量级。TL;DR 这些数字总体上似乎处于正确的数量级,正如这些讨论所示:

随着许多团队致力于复现训练流程,我们将获得更多关于该模型可能训练效率的证据。

训练数据集

上周出现了一些猜测,认为 DeepSeek 可能一直在使用 OpenAI 的输出来训练其模型。例如参见 Financial Times。然而,目前尚不清楚这些指控会带来什么后果。

社区

开源社区围绕 DeepSeek-R1 非常活跃,许多人开始围绕该模型构建有趣的项目。

项目

有许多项目试图在较小规模上复现基本学习机制,因此你可以在家中测试基本学习原理。

数据集

社区一直在忙于与R1相关的多项数据集工作,其中一些亮点包括:

  • bespokelabs/Bespoke-Stratos-17k:是对Berkeley Sky-T1数据管线的复现,该管线使用DeepSeek-R1创建了包含问题、推理轨迹和答案的数据集。这些数据随后被用于通过类似R1论文中的蒸馏方法对7B和32B Qwen模型进行微调。
  • open-thoughts/OpenThoughts-114k:一个“包含114k高质量样本的开放合成推理数据集,涵盖数学、科学、代码和谜题”。是Open Thoughts工作的一部分。
  • cognitivecomputations/dolphin-r1:包含80万样本的数据集,其中包含来自DeepSeek-R1、Gemini flash的补全结果,以及来自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组织。

来源:Hugging Face Blog · hf-mirror.com