AI・機械学習
DAPO: ByteDance SeedとTsinghua AIRによるオープンソースRLシステム
DAPO: An Open-Source RL System from ByteDance Seed and Tsinghua Air (github.com)
要約
ByteDance SeedとTsinghua AIRは、大規模LLMの強化学習(RL)のためのオープンソースシステム「DAPO」を発表しました。このシステムは、最先端の性能を達成する「Decoupled Clip and Dynamic Sampling Policy Optimization (DAPO)」アルゴリズム、コードインフラストラクチャ、およびデータセットを含みます。DAPOは、Qwen2.5-32BベースモデルでAIME 2024ベンチマークにおいて50%のスコアを達成し、研究コミュニティにスケーラブルなRLへの実践的なアクセスを提供します。
全文翻訳
DAPO: ByteDance SeedとTsinghua AIRによるオープンソースRLシステム
重要🔥ニュース!!!
[2025/05] DAPO全体のwandbトレーニング記録と、AIME 2024で50%以上を達成したチェックポイントを更新しました。AIME 2024での評価手順も提供しています。
[2025/03] DAPOの初期バージョン(トークンレベルPGロス&ダイナミックサンプリングなし)のトレーニング記録をwandbで公開しました。これはAIME 2024で44%を達成しました。
大規模LLM RLのための完全にオープンソース化されたシステム(アルゴリズム、コードインフラストラクチャ、データセットを含む)をリリースします。このシステムは、最先端の大規模LLM RLパフォーマンスを達成します。
我々は、Decoupled Clip and Dynamic Sampling Policy Optimization (DAPO) アルゴリズムを提案します。オープンソース化を通じて、より広範な研究コミュニティと社会にスケーラブルな強化学習への実践的なアクセスを提供し、誰もがこれらの進歩から恩恵を受けられるようにします。
私たちのシステムは、素晴らしいverlフレームワークに基づいています。彼らの素晴らしい仕事に感謝します!
議論歓迎 🤗
私たちの論文についてご質問があれば、イシューで歓迎します。そこで議論できます。ありがとうございます!
主な結果
AIME 2024 パフォーマンス 🚀
DAPOは、Qwen2.5-32Bベースモデルに基づいてAIME 2024で50ポイントを達成し、以前のSoTAであるDeepSeek-R1-Zero-Qwen-32Bを50%のトレーニングステップで上回りました。
トレーニング中のメトリックスーパービジョン
長さの安定性と成長:応答長の安定した増加は、より大きな探索を可能にし、モデルがより複雑な推論行動を学習する能力を促進し、最終的にトレーニングの安定性とパフォーマンス向上に貢献します。
報酬スコアの安定性:報酬信号の安定した増加は、モデルがトレーニング分布に正常に適合していることを示し、学習プロセスが大きな変動なしに堅牢で一貫したままであることを保証します。
エントロピーと平均確率のトレンド:初期低下後のエントロピーの制御された増加は、探索と活用との間の健全なバランスを確保し、過学習や過度のランダム性などの問題を回避し、持続的なモデルパフォーマンスを促進します。
モデルの使用
Qwen2.5-32Bに基づいてDAPOアルゴリズムを使用してトレーニングされたDAPO-Qwen-32Bのモデルウェイトを提供します。
環境設定
環境設定にはcondaの使用を推奨します:
conda create -n dapo python=3.10
conda activate dapo
pip3 install -r requirements.txt
推論
モデル推論コードをここに提供します:
import torch
from transformers import AutoTokenizer
from vllm import SamplingParams, LLM
examples = [
{
"question": "Solve the following math problem step by step. The last line of your response should be of the form Answer: $Answer (without quotes) where $Answer is the answer to the problem.\n\nFind the largest possible real part of \[(75+117i)z+\frac{96+144i}{z}\]where $z$ is a complex number with $|z|=4$.\n\nRemember to put your answer on its own line after \"Answer:\".",
"answer": "540"
},
{
"question": "Solve the following math problem step by step. The last line of your response should be of the form Answer: $Answer (without quotes) where $Answer is the answer to the problem.\n\nEvery morning Aya goes for a $9$-kilometer-long walk and stops at a coffee shop afterwards. When she walks at a constant speed of $s$ kilometers per hour, the walk takes her 4 hours, including $t$ minutes spent in the coffee shop. When she walks $s+2$ kilometers per hour, the walk takes her 2 hours and 24 minutes, including $t$ minutes spent in the coffee shop. Suppose Aya walks at $s+\frac{1}{2}$ kilometers per hour. Find the number of minutes the walk takes her, including the $t$ minutes spent in the coffee shop.\n\nRemember to put your answer on its own line after \"Answer:\".",
"answer": "204"
},
{
"question": "Solve the following math problem step by step. The last line of your response should be of the form Answer: $Answer (without quotes) where $Answer is the answer to the problem.\n\nLet $\mathcal{B}$ be the set of rectangular boxes with surface area $54$ and volume $23$. Let $r$ be the radius of the smallest sphere that can contain each of the rectangular boxes that are elements of $\mathcal{B}$. The value of $r^2$ can be written as $\frac{p}{q}$, where $p$ and $q$ are relatively prime positive integers. Find $p+q$.\n\nRemember to put your answer on its own line after \"Answer:\".",
"answer": "721"
}
]
def main():
model = "BytedTsinghua-SIA/DAPO-Qwen-32B"
tokenzier = AutoTokenizer.from_pretrained(model)
llm = LLM(
model=model,
dtype=torch.bfloat16,
tensor_parallel_size=8,
gpu_memory_utilization=0.95
)
sampling_params = SamplingParams(
temperature=1.0,
top_p=0.7,
max_tokens=20480
)
for example in examples:
question = example["question"]
answer = example["answer"]
output = llm.generate(
prompts=tokenzier.apply_chat_template(
conversation=[{"content": question, "role": "user"}],
add_generation_prompt=True,
tokenize=False
),
sampling_params=sampling_params
)
print(f"***QUESTION***:\n{question}\n***GROUND TRUTH***:\n{answer}\n***MODEL OUTPUT***:\n{output[0].outputs[0].text}\n")
print("-"*100)
if __name__ == "__main__":
main()