DeepSeek同款GRPO訓練大提速!魔搭開源全流程方案,支援多模態訓練、訓練加速和評測全鏈路

魔搭社群 投稿

量子位 | 公眾號 QbitAI
GRPO訓練又有新的工具鏈可以用,這次來自於ModelScope魔搭社群。
隨著DeepSeek-R1的成功出圈,其使用的GRPO演算法受到了業界的廣泛關注。GRPO訓練是來自於PPO演算法的一種改進,旨在利用取樣原理對value model進行簡化,以增大訓練的穩定性和可維護性。
目前圍繞R1模型的技術方案,社群也已經有一些開源實現,比如來自Hugging Face的Open-R1,以及其他一些RL框架,包括veRL,OpenRLHF等等。然而,在GRPO訓練方面,大部分方案仍然面臨著諸多挑戰,包括訓練速度較低、叢集配置複雜,以及對多模態擴充套件能力差、訓練後不好評測等等。
為了支援開源社群在GRPO這個方向上的探索,ModelScope魔搭社群圍繞MS-SWIFT訓練框架以及EvalScope評估框架,推出了相對完整高效的GRPO全鏈路解決方案,和社群分享。

GRPO訓練提速

GRPO訓練的耗時主要來自於取樣、訓練等幾個方面。其中,取樣本身是PPO演算法的重要組成部分。尤其是GRPO在PPO的基礎上,使用取樣代替value model的方案,這使得在GRPO訓練中,取樣的耗時的佔比,更是大大的增加了。而且GRPO中單query的取樣數(即group size),一般比較大(DeepSeekMath論文中為64個),高取樣頻率對於推理引擎的挑戰是巨大的。最佳化取樣效率是提升GRPO整體訓練速度的核心所在。
基於這些特點,魔搭社群的SWIFT框架進行了有針對性的最佳化:
多例項資料並行取樣
對於GRPO演算法,單例項取樣往往無法滿足需求。團隊觀察發現,7B模型在訓練期間,單iter的取樣時間佔比約為70%,這意味著應該允許訓練資源根據實際情況,針對性的傾斜分配給取樣計算
尤其在取樣量以及batch_size較大時,取樣耗時對訓練速度影響會更為顯著。因此,在SWIFT中對vLLM和LMDeploy進行了一定的patch(同時也與相關框架負責同學進行了討論,將會將相關實現在vLLM/LMDeploy上原生支援),支援在任意比例的訓練卡上拉起取樣例項。例如對於8卡訓練中,配置4張卡負責模型訓練,4張卡負責取樣;或者6張卡負責訓練,2張卡負責取樣。
下圖展示了在同樣的8卡訓練設定下,分別使用1卡/2卡部署推理引擎進行取樣,剩餘卡負責訓練,vLLM/LMDeploy的取樣耗時和訓練耗時如下:

可以看到,基於LMDeploy分配2卡進行取樣時,訓練時長約為1卡取樣的87%。而vLLM2卡取樣時,時長為1卡取樣的78%。在這兩個例子中,透過更合理多卡數分配,對取樣資源進行一定傾斜,都達到了有效降低訓練所需時長都目的。
非同步取樣
GRPO訓練中,取樣和模型訓練需要交替進行,即訓練時取樣卡閒置,取樣時訓練卡閒置。對於這個問題,不同的框架給出了不同的解決方案。
例如veRL允許將取樣和訓練部署在同一GPU上,在不同階段讓不同的權重offload到CPU中;或者針對LLM的不同Layer、不同Tensor進行異構式切分,在載入權重時不必all_gather(而是部分weights進行gather並同步),使訓練模型和取樣模型的效率達到最高。然而在中小模型的體量上,這樣的切分未必是最優的。
因為隨著模型尺寸和batch_size增大,取樣、訓練的耗時佔比會有本質差別。對此SWIFT採用了不一樣的技術路線,即非同步取樣(replay buffer),其原理是在訓練時同時進行取樣,取樣結果用於下一iter的模型訓練。由於取樣使用的是old policy model,因此訓練過程需要額外增加對於logits差異的CLIP。由於old policy model和policy model僅相差一個iter,因此其訓練穩定性幾乎沒有下降。二者唯一需要等待(或者stop the world)的過程是權重載入。
同樣訓練設定下的實驗測試表明,在單卡部署LMDeploy的情況下,非同步取樣的訓練時間約為同步取樣的2/3。
模型placement
SWIFT除了支援上述訓練和rollout使用兩個資源組進行非同步訓採流程之外,也支援二者共用同一資源組。即,在actor模型訓練時,vLLM將開啟sleep模式以減少視訊記憶體佔用。
這兩種模式的架構圖如下:

並且,SWIFT也支援vLLM的tensor_parallel(MP)模式。
LMDeploy推理框架支援
LMDeploy是來自於上海浦江實驗室的優秀推理加速框架。該框架不僅支援了純文字和多模態模型的推理加速,並且自研了基於FasterTransformer實現的Turbomind推理加速引擎。在推理速度上,LMDeploy相較vLLM在一眾模型上速度有顯著的提升。對Qwen2.5-7B-Instruct模型進行實驗測試,具體配置如下:使用AI-MO/NuminaMath-TIR資料集,批次大小設定為7,每條query取樣24條結果,訓練50個steps。以下是vLLM框架和LMDeploy框架在相同條件下的推理時長對比。

可以看到使用LMDeploy作為取樣的推理引擎,在整體的訓練速度上從44分/50steps加速到37分/50steps,加速比大約為16%。
注:最後50steps的訓練耗時包括了儲存模型權重,測試集評測
SWIFT框架在TRL框架以及vLLM取樣的基礎上,額外引入了LMDeploy取樣的支援。得益於其推理速度和權重載入速度,可以做到整體取樣耗時只有基礎實現的70%。
多輪更新
多輪更新的核心思想是:讓一次取樣得到的資料可以被多次使用。透過這種方式,可以減少採樣的頻率,從而讓取樣和訓練的資源分配更加均衡。
透過設定引數num_iterations, 可設定每輪取樣資料的迭代更新輪數,增大該引數值可以多次利用取樣資料,緩解取樣過程對訓練的速度影響,從而提高訓練速度。在該值設定不太大(例如小於等於4)的情況下,基本不會對模型訓練效果有不良影響。這裡的更新輪次對應論文中的mu值。
多輪更新是TRL庫提供的機制,發現該機制和團隊提供的其他機制結合起來有更好的加速效果。
基於1卡部署LMDeploy的設定下,對比num_iterations從1-4的訓練時間,下面給出了完整的實驗結果:
可以看到,在設定多輪更新輪次為4時(mu=4),整體訓練耗時約為單輪更新的一半。
綜合測試
針對八卡環境的SWIFT、veRL和trl框架的訓練效率進行了對比。在實驗設定中整合了前文提到的多種訓練加速技術,並選用LMDeploy作為推理引擎。
具體配置上,採用雙卡進行推理取樣,結合非同步取樣策略,並將多輪更新輪次設定為4輪。同時,為了更好模擬真實訓練場景,將batch_size調整為48(每輪6個query,梯度累計步數為 8),group size設定為24,基於Qwen2.5-7B-Instruct模型和AI-MO/NuminaMath-TIR資料集(1),對多框架的GRPO訓練速度進行了對比評測。
SWIFT:

veRL:

trl(mu=4):

trl(mu=1)

實驗結果表明,SWIFT框架的訓練耗時約為120秒/步,而veRL框架訓練耗時約為280秒/步,TRL框架在採用多步更新下約為144秒/步,而不採用多步更新則約為320秒/步。透過整合多種訓練加速技術,SWIFT框架在GRPO的中小叢集訓練效率上實現了顯著提升。下圖展示了SWIFT框架下的訓練獎勵走勢,可以看出模型成功實現了獎勵值的提升。

多模態GRPO訓練

多模態GRPO訓練目前已經有一些開源解決方案,例如R1-V,open-r1-multimodal等,都是基於Open-R1進行了簡單的擴充套件。
SWIFT框架目前已經支援多模態模型(圖文、影片、音訊)的GRPO訓練,只要在資料集中給定’images’/‘videos’/‘audios’欄位,GRPO會將多模態內容輸入多模態模型中進行強化訓練。SWIFT目前在微調中支援的多模態模型近兩百個,這些模型均天然支援GRPO訓練。參考R1-V的任務設定,在多模態計數任務上進行了訓練,訓練資料集為CLEVR-70k-Counting

(2)

。訓練選取的獎勵函式一共有兩個,一個是 Deepseek-R1 中提到的格式獎勵函式,用於評估模型輸出格式的準確性;另一是自定義的準確性獎勵函式,用於計算模型輸出的計數是否與真值一致,目前兩個獎勵函式都已經定義在SWIFT框架中,透過—reward_funcs external_r1v_acc format引數指定。

選取Qwen2.5-VL-3B-Instruct 作為基礎模型進行訓練,選取 instruct 而不是base模型的主要原因是可以更快地獲取 format reward。整體實驗在8卡 GPU 上完成。當前SWIFT GRPO訓練已支援多卡部署模型以加速rollout,因此設定num_infer_workers為2,程序數為6:即2卡vLLM部署取樣,6卡模型訓練。設定模型的最大輸出為1024,學習率設定為1e-6,其他引數設定詳見最佳實踐

(3)

實驗結果如下圖所示:

模型訓練了500個epoch已經基本收斂,準確性獎勵(圖中為ClevrCountORM)和格式獎勵(圖中為Format)在不斷增加,證明模型學習到了如何完成這一任務,最終任務成功率從初始的0.4攀升到1左右;在大概300step左右,reward_std已經將到0.1左右,證明模型已經基本收斂;completion length最終穩定在60-80,模型學習到的任務推理正規化是逐個列舉圖中的物體。

訓練後的模型輸出樣例如下:
user:How many items are there in the image?assistant:<think> Counting the number of items in the image:\n1. Green matte sphere\n2. Large metallic yellow sphere\n3. Small metallic brown cube\n\nThere are three distinct objects in total.\n</think>\n<answer>3</answer>

Reasoning模型評測

EvalScope框架是魔搭社群上開源的大模型評測工具(4),提供了完整的大模型全面評測框架。
不僅提供O1/R1等推理類模型的推理效能的評測能力,還支援評測結果的視覺化,如下圖所示。
同時,團隊將MATH-500、GPQA-Diamond和AIME-2024三個資料集整合為一個數據集合,放置於modelscope/R1-Distill-Math-Test資料集(5)中,使用者可以直接使用該資料集的ID進行評測操作,具體使用流程參考:模型推理能力評測最佳實踐(6)

除此之外,針對Reasoning模型在推理過程中存在Underthinking(思考不足,指模型在推理時頻繁思路跳轉,無法專注於正確的思路,導致錯誤答案)和Overthinking(過度思考,指模型簡單問題上生成過長思維鏈,浪費計算資源)的問題。
該框架實現了模型思考效率評測能力,可以評估如DeepSeek-R1-Distill-Qwen-7B(7)等推理模型的思考效率,如下圖所示,從token效率、思考長度、子思維鏈數量和準確率四個方面進行衡量,可以用來評測並最佳化模型在短輸出中獲取正確答案的能力,具體使用流程參考教程:模型思考效率評測最佳實踐(8)

效果

從簡單的數學任務Countdown Game出發,對SWIFT框架的GRPO有效性進行驗證,並給出了完整的實驗流程(9)
Coundown Game 的任務目標是根據給定的幾個數字和加減乘除四種運算,得到目標數字,給出運算公式,因此在模型的輸入中給定了任務描述、已有數字和目標數字。訓練選取的獎勵函式一共有兩個,一個是標準的格式獎勵函式,用於評估模型輸出格式的準確性;另一是自定義的準確性獎勵函式,用於評估模型輸出運算公式是否能得到目標值,目前兩個獎勵函式都已經定義在SWIFT框架中,透過—reward_funcs external_countdown format引數指定。
選取Qwen2.5-3B-Instruct模型進行全引數GRPO訓練,具體引數設定詳見實驗流程。發現GRPO的訓練過程是比較不穩定的,一個比較大的學習率和beta(KL散度的權重)雖然會是模型更快收斂,但往往出現梯度過大而訓練崩潰的情況。最終選取學習率為7e-5,beta為0.001。

實驗結果如下圖所示:
一共訓練了2000個step,各項曲線證明了SWIFT GRPO的有效性,從實驗結果中也能看到模型的收斂過程。
準確性獎勵(CoundownORM)和格式獎勵(Format)的穩步上升證明模型逐步學習到了如何更好地完成這一任務,同時reward_std最終處在0.2-0.3左右也證明了模型仍有繼續上升的空間。
從completion_length的變化上能明確地看到模型思考方式的轉變。從初始的500左右降到200,然後又增長到300-400 tokens,能明確看到各個階段模型的思考方式。初始時,模型會直接從結果出發,反推需要的數字;然後,模型逐漸精簡了反推過程,顯著縮減了輸出場地;最後,模型發現完成任務最好的方式是列舉已有數字和運算的組合,並逐步運算,輸出正規化基本收斂。最終的輸出樣例如下:
user:"Using the numbers [71, 92, 80], create an equation that equals 59. You can use basic arithmetic operations (+, -, *, /) and each number can only be used once. Show your work in <think> </think> tags. And return the final equation and answer in <answer> </answer> tags, for example <answer> (1 + 2) / 3 = 1 </answer>."assistant:"<think>\nWe need to form an expression using the numbers 71, 92, and 80 which results in 59. Let's try some combinations:\n(92 - 80) + 71 = 83 + 71 = 154 (too high)\n(92 - 71) + 80 = 21 + 80 = 101 (too high)\n(92 - 80) + 71 = 12 + 71 = 83 (too high)\n(92 - 71) + 80 = 21 + 80 = 101 (too high)\n(92 + 80) - 71 = 172 - 71 = 101 (too high)\n(92 + 71) - 80 = 163 - 80 = 83 (too high)\n(80 + 71) - 92 = 151 - 92 = 59\n\nSo our solution is: (80 + 71) - 92 = 59</think>\n\n<answer>(80 + 71) - 92 = 59</answer>"

寫在最後

SWIFT正在新增vLLM的MP模式以適配更大體量模型的訓練,並希望在已有的優秀框架的技術沉澱上以差異化技術的方式為開發者提供簡單快速的中、小叢集RL訓練方案,給開發者提供新的技術選型。目前SWIFT已經支援的訓練領域有數學、ReACT結構的Agent、多模態VQA等,程式碼領域的支援也在陸續更新中。對於Megatron結構的模型SWIFT在支援中,不僅僅是GRPO訓練,SFT和PreTrain也將得到相應支援。
評測領域,EvalScope後續會針對Reasoning models進一步探索模型的“思考效率”問題;另外,從目前的趨勢看,多模態Reasoning的正規化也逐漸引起重視,團隊也會在該領域積極探索最新的評測基準、指標和方法。
[1] AI-MO/NuminaMath-TIR資料集:https://www.modelscope.cn/models/AI-ModelScope/NuminaMath-7B-TIR
[2] CLEVR-70k-Counting:https://www.modelscope.cn/datasets/okwinds/clevr_cogen_a_train
[3] 多模態GRPO最佳實踐:https://github.com/modelscope/ms-swift/blob/main/docs/source/BestPractices/GRPO%E5%A4%9A%E6%A8%A1%E6%80%81%E8%AE%AD%E7%BB%83.md
[4] 大模型評估框架EvalScope:https://github.com/modelscope/evalscope
[5] modelscope/R1-Distill-Math-Test資料集:https://modelscope.cn/datasets/modelscope/R1-Distill-Math-Test
[6] EvalScope模型推理能力評測最佳實踐:https://evalscope.readthedocs.io/zh-cn/latest/best_practice/deepseek_r1_distill.html
[7] DeepSeek-R1-Distill-Qwen-7B :https://modelscope.cn/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
[8] 模型思考效率評測最佳實踐:https://evalscope.readthedocs.io/zh-cn/latest/best_practice/think_eval.html
[9] GRPO完整實驗流程:https://github.com/modelscope/ms-swift/blob/main/docs/source/BestPractices/GRPO%E5%AE%8C%E6%95%B4%E6%B5%81%E7%A8%8B.md 
—  —
學術投稿請於工作日發郵件到:
標題註明【投稿】,告訴我們:
你是誰,從哪來,投稿內容
附上論文/專案主頁連結,以及聯絡方式哦
我們會(儘量)及時回覆你
一鍵關注 👇 點亮星標
科技前沿進展每日見
一鍵三連「點贊」「轉發」「小心心」
歡迎在評論區留下你的想法!

相關文章