記事一覧に戻る

image/png

DeepSeek R1のリリースから2週間、不足している部分(トレーニングパイプラインと合成データ)を再現するopen-r1プロジェクトを始めてから1週間が経ちました。この投稿では以下をまとめます:

  • DeepSeek-R1のパイプラインとデータセットを再現するためのOpen-R1の進捗
  • DeepSeek-R1について学んだことと、それに関する議論
  • DeepSeek-R1のリリース以降にコミュニティが構築したクールなプロジェクト

本投稿はプロジェクトのアップデートとして、またDeepSeek-R1に関する興味深いリソース集としてもお役立てください。

1週間後の進捗

まずはOpen-R1の進捗を見てみましょう。Open-R1を始めたのはわずか1週間前ですが、チーム内外やコミュニティの皆さんが協力して取り組み、いくつかの進展を報告できます。

評価

再現の第一歩は、評価スコアを一致させられるかを検証することです。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の応答の分布は、平均応答長が6,000トークンで、一部の応答は20,000トークンを超えるほど非常に長いことを示しています。平均的なページには約500語が含まれ、1トークンは平均して1語よりやや少ないことに留意してください。つまり、多くの応答は10ページを超える長さになります。(出典: https://x.com/gui_penedo/status/1884953463051649052

応答の長さはGPROトレーニングを難しくします。長い完了を生成する必要があり、最適化ステップで活性化/勾配を保存するためにGPUメモリの大部分を必要とするためです。

進捗を公開するために、open-r1評価リーダーボードを作成しました。コミュニティの皆さんは再現の取り組みを追跡できます(スペースはこちら):

トレーニングパイプライン

Open R1のリリースに続き、GRPO(Grouped Relative Policy Optimization)が最新のTRLリリース(バージョン0.14)に統合されました。この統合により、1つまたは複数の報酬関数やモデルを使って任意のモデルをトレーニングできます。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のような大規模モデルでは、主な課題は生成を効率的かつ高速にスケールアップすることです。1週間かけてさまざまなセットアップと構成を試行錯誤しました。

モデルは2台の8xH100ノードに収まるため、当然そのセットアップで実験を開始し、推論サーバーとしてvLLMを使用しました。しかし、この構成は理想的ではないことがすぐにわかりました。スループットが最適ではなく、GPU KVキャッシュがすぐにいっぱいになるため、並列リクエストは8件しか処理できません。キャッシュが満杯になると、大量のキャッシュを使用するリクエストはプリエンプトされ、設定でPreemptionMode.RECOMPUTEを使用している場合、より多くのVRAMが利用可能になったときにリクエストが後で再スケジュールされます。

次に、合計32GPUとなる4x 8xH100ノードのセットアップに切り替えました。これにより、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には幅広い関心が寄せられており、メディアからも注目されているため、過去1週間で複数のチームメンバーがニュースに登場しました:

その他の言及: Washington PostFinancial TimesFinancial TimesFortuneFortuneThe VergeFinancial ReviewTech CrunchDie ZeitFinancial TimesNew York TimesThe Wall Street JournalEuroNewsBarronsNew York TimesVoxNatureSwissInfoHandelsblattBusiness InsiderIEEE SpectrumMIT Tech ReviewLeMonde

DeepSeek-R1について学んだこと

コミュニティはDeepSeek-R1の結果とレポートの消化を続けていますが、リリースからわずか2週間でDeepSeekはより広い世間の注目を集めています。

R1への反応

リリース後の比較的平穏な1週間後、2週目には市場の大きな反応があり、複数のAI研究ラボからの対応を促しました:

並行して、いくつかの企業がさまざまなプラットフォームを通じてDeepSeekモデルを提供する取り組みを行いました(一部):

DeepSeek V3のトレーニング計算量

V3/R1のトレーニングコストに関する主張に大きな関心が寄せられています。正確な数字はそれほど重要ではないかもしれませんが、人々は概算計算を行ってその桁数を検証してきました。要するに、以下の議論で見られるように、数字は概ね正しい桁数を示しているようです:

多くのグループがトレーニングパイプラインの再現に取り組んでいるため、モデルのトレーニング効率に関するさらなる証拠が得られるでしょう。

トレーニングデータセット

先週、DeepSeekがモデルのトレーニングにOpenAIの出力を利用していた可能性があるという憶測が浮上しました。例えばFinancial Timesを参照してください。ただし、これらの主張の結果がどうなるかは現時点では不明です。

コミュニティ

オープンソースコミュニティはDeepSeek-R1に対して非常に活発に活動しており、多くの人々がモデルに関連する興味深いプロジェクトを構築し始めています。

プロジェクト

より小規模で基本的な学習メカニズムを再現しようとするプロジェクトがいくつかあり、自宅で基本的な学習原理をテストできます。

データセット

コミュニティはR1に関連する多くのデータセット作成に忙しく取り組んでおり、主なハイライトは以下の通りです:

  • bespokelabs/Bespoke-Stratos-17k:DeepSeek-R1を使って質問、推論トレース、回答のデータセットを作成するBerkeley Sky-T1データパイプラインの再現です。このデータはその後、R1論文と同様の蒸留アプローチを用いて7Bおよび32BのQwenモデルをファインチューニングするために使用されました。
  • open-thoughts/OpenThoughts-114k:「数学、科学、コード、パズルをカバーする114kの高品質な例を含むオープンな合成推論データセット」。Open Thoughtsの取り組みの一環です。
  • cognitivecomputations/dolphin-r1:DeepSeek-R1、Gemini flashからの完了と、R1スタイルモデルのトレーニングを支援することを目的としたDolphin chatからの200kサンプルを含む80万サンプルのデータセット。
  • 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組織をフォローしてください。