DeepSeek同款GRPO訓(xùn)練大提速!魔搭開源全流程方案,支持多模態(tài)訓(xùn)練、訓(xùn)練加速和評測全鏈路
GRPO訓(xùn)練又有新的工具鏈可以用,這次來自于ModelScope魔搭社區(qū)。
隨著DeepSeek-R1的成功出圈,其使用的GRPO算法受到了業(yè)界的廣泛關(guān)注。GRPO訓(xùn)練是來自于PPO算法的一種改進,旨在利用采樣原理對value model進行簡化,以增大訓(xùn)練的穩(wěn)定性和可維護性。
目前圍繞R1模型的技術(shù)方案,社區(qū)也已經(jīng)有一些開源實現(xiàn),比如來自Hugging Face的Open-R1,以及其他一些RL框架,包括veRL,OpenRLHF等等。然而,在GRPO訓(xùn)練方面,大部分方案仍然面臨著諸多挑戰(zhàn),包括訓(xùn)練速度較低、集群配置復(fù)雜,以及對多模態(tài)擴展能力差、訓(xùn)練后不好評測等等。
為了支持開源社區(qū)在GRPO這個方向上的探索,ModelScope魔搭社區(qū)圍繞MS-SWIFT訓(xùn)練框架以及EvalScope評估框架,推出了相對完整高效的GRPO全鏈路解決方案,和社區(qū)分享。
GRPO訓(xùn)練提速
GRPO訓(xùn)練的耗時主要來自于采樣、訓(xùn)練等幾個方面。其中,采樣本身是PPO算法的重要組成部分。尤其是GRPO在PPO的基礎(chǔ)上,使用采樣代替value model的方案,這使得在GRPO訓(xùn)練中,采樣的耗時的占比,更是大大的增加了。而且GRPO中單query的采樣數(shù)(即group size),一般比較大(DeepSeekMath論文中為64個),高采樣頻率對于推理引擎的挑戰(zhàn)是巨大的。優(yōu)化采樣效率是提升GRPO整體訓(xùn)練速度的核心所在。
基于這些特點,魔搭社區(qū)的SWIFT框架進行了有針對性的優(yōu)化:
多實例數(shù)據(jù)并行采樣
對于GRPO算法,單實例采樣往往無法滿足需求。團隊觀察發(fā)現(xiàn),7B模型在訓(xùn)練期間,單iter的采樣時間占比約為70%,這意味著應(yīng)該允許訓(xùn)練資源根據(jù)實際情況,針對性的傾斜分配給采樣計算。
尤其在采樣量以及batch_size較大時,采樣耗時對訓(xùn)練速度影響會更為顯著。因此,在SWIFT中對vLLM和LMDeploy進行了一定的patch(同時也與相關(guān)框架負(fù)責(zé)同學(xué)進行了討論,將會將相關(guān)實現(xiàn)在vLLM/LMDeploy上原生支持),支持在任意比例的訓(xùn)練卡上拉起采樣實例。例如對于8卡訓(xùn)練中,配置4張卡負(fù)責(zé)模型訓(xùn)練,4張卡負(fù)責(zé)采樣;或者6張卡負(fù)責(zé)訓(xùn)練,2張卡負(fù)責(zé)采樣。
下圖展示了在同樣的8卡訓(xùn)練設(shè)置下,分別使用1卡/2卡部署推理引擎進行采樣,剩余卡負(fù)責(zé)訓(xùn)練,vLLM/LMDeploy的采樣耗時和訓(xùn)練耗時如下:
可以看到,基于LMDeploy分配2卡進行采樣時,訓(xùn)練時長約為1卡采樣的87%。而vLLM2卡采樣時,時長為1卡采樣的78%。在這兩個例子中,通過更合理多卡數(shù)分配,對采樣資源進行一定傾斜,都達到了有效降低訓(xùn)練所需時長都目的。
異步采樣
GRPO訓(xùn)練中,采樣和模型訓(xùn)練需要交替進行,即訓(xùn)練時采樣卡閑置,采樣時訓(xùn)練卡閑置。對于這個問題,不同的框架給出了不同的解決方案。
例如veRL允許將采樣和訓(xùn)練部署在同一GPU上,在不同階段讓不同的權(quán)重offload到CPU中;或者針對LLM的不同Layer、不同Tensor進行異構(gòu)式切分,在加載權(quán)重時不必all_gather(而是部分weights進行g(shù)ather并同步),使訓(xùn)練模型和采樣模型的效率達到最高。然而在中小模型的體量上,這樣的切分未必是最優(yōu)的。
因為隨著模型尺寸和batch_size增大,采樣、訓(xùn)練的耗時占比會有本質(zhì)差別。對此SWIFT采用了不一樣的技術(shù)路線,即異步采樣(replay buffer),其原理是在訓(xùn)練時同時進行采樣,采樣結(jié)果用于下一iter的模型訓(xùn)練。由于采樣使用的是old policy model,因此訓(xùn)練過程需要額外增加對于logits差異的CLIP。由于old policy model和policy model僅相差一個iter,因此其訓(xùn)練穩(wěn)定性幾乎沒有下降。二者唯一需要等待(或者stop the world)的過程是權(quán)重加載。
同樣訓(xùn)練設(shè)置下的實驗測試表明,在單卡部署LMDeploy的情況下,異步采樣的訓(xùn)練時間約為同步采樣的2/3。
模型placement
SWIFT除了支持上述訓(xùn)練和rollout使用兩個資源組進行異步訓(xùn)采流程之外,也支持二者共用同一資源組。即,在actor模型訓(xùn)練時,vLLM將開啟sleep模式以減少顯存占用。
這兩種模式的架構(gòu)圖如下:
并且,SWIFT也支持vLLM的tensor_parallel(MP)模式。
LMDeploy推理框架支持
LMDeploy是來自于上海浦江實驗室的優(yōu)秀推理加速框架。該框架不僅支持了純文本和多模態(tài)模型的推理加速,并且自研了基于FasterTransformer實現(xiàn)的Turbomind推理加速引擎。在推理速度上,LMDeploy相較vLLM在一眾模型上速度有顯著的提升。對Qwen2.5-7B-Instruct模型進行實驗測試,具體配置如下:使用AI-MO/NuminaMath-TIR數(shù)據(jù)集,批量大小設(shè)置為7,每條query采樣24條結(jié)果,訓(xùn)練50個steps。以下是vLLM框架和LMDeploy框架在相同條件下的推理時長對比。
可以看到使用LMDeploy作為采樣的推理引擎,在整體的訓(xùn)練速度上從44分/50steps加速到37分/50steps,加速比大約為16%。
注:最后50steps的訓(xùn)練耗時包括了保存模型權(quán)重,測試集評測
SWIFT框架在TRL框架以及vLLM采樣的基礎(chǔ)上,額外引入了LMDeploy采樣的支持。得益于其推理速度和權(quán)重加載速度,可以做到整體采樣耗時只有基礎(chǔ)實現(xiàn)的70%。
多輪更新
多輪更新的核心思想是:讓一次采樣得到的數(shù)據(jù)可以被多次使用。通過這種方式,可以減少采樣的頻率,從而讓采樣和訓(xùn)練的資源分配更加均衡。
通過設(shè)置參數(shù)num_iterations, 可設(shè)置每輪采樣數(shù)據(jù)的迭代更新輪數(shù),增大該參數(shù)值可以多次利用采樣數(shù)據(jù),緩解采樣過程對訓(xùn)練的速度影響,從而提高訓(xùn)練速度。在該值設(shè)置不太大(例如小于等于4)的情況下,基本不會對模型訓(xùn)練效果有不良影響。這里的更新輪次對應(yīng)論文中的mu值。
多輪更新是TRL庫提供的機制,發(fā)現(xiàn)該機制和團隊提供的其他機制結(jié)合起來有更好的加速效果。
基于1卡部署LMDeploy的設(shè)置下,對比num_iterations從1-4的訓(xùn)練時間,下面給出了完整的實驗結(jié)果:
可以看到,在設(shè)置多輪更新輪次為4時(mu=4),整體訓(xùn)練耗時約為單輪更新的一半。
綜合測試
針對八卡環(huán)境的SWIFT、veRL和trl框架的訓(xùn)練效率進行了對比。在實驗設(shè)置中整合了前文提到的多種訓(xùn)練加速技術(shù),并選用LMDeploy作為推理引擎。
具體配置上,采用雙卡進行推理采樣,結(jié)合異步采樣策略,并將多輪更新輪次設(shè)定為4輪。同時,為了更好模擬真實訓(xùn)練場景,將batch_size調(diào)整為48(每輪6個query,梯度累計步數(shù)為 8),group size設(shè)置為24,基于Qwen2.5-7B-Instruct模型和AI-MO/NuminaMath-TIR數(shù)據(jù)集(1),對多框架的GRPO訓(xùn)練速度進行了對比評測。
SWIFT:
veRL:
trl(mu=4):
trl(mu=1)
實驗結(jié)果表明,SWIFT框架的訓(xùn)練耗時約為120秒/步,而veRL框架訓(xùn)練耗時約為280秒/步,TRL框架在采用多步更新下約為144秒/步,而不采用多步更新則約為320秒/步。通過整合多種訓(xùn)練加速技術(shù),SWIFT框架在GRPO的中小集群訓(xùn)練效率上實現(xiàn)了顯著提升。下圖展示了SWIFT框架下的訓(xùn)練獎勵走勢,可以看出模型成功實現(xiàn)了獎勵值的提升。
多模態(tài)GRPO訓(xùn)練
多模態(tài)GRPO訓(xùn)練目前已經(jīng)有一些開源解決方案,例如R1-V,open-r1-multimodal等,都是基于Open-R1進行了簡單的擴展。
SWIFT框架目前已經(jīng)支持多模態(tài)模型(圖文、視頻、音頻)的GRPO訓(xùn)練,只要在數(shù)據(jù)集中給定’images’/‘videos’/‘a(chǎn)udios’字段,GRPO會將多模態(tài)內(nèi)容輸入多模態(tài)模型中進行強化訓(xùn)練。SWIFT目前在微調(diào)中支持的多模態(tài)模型近兩百個,這些模型均天然支持GRPO訓(xùn)練。參考R1-V的任務(wù)設(shè)置,在多模態(tài)計數(shù)任務(wù)上進行了訓(xùn)練,訓(xùn)練數(shù)據(jù)集為CLEVR-70k-Counting(2)。訓(xùn)練選取的獎勵函數(shù)一共有兩個,一個是 Deepseek-R1 中提到的格式獎勵函數(shù),用于評估模型輸出格式的準(zhǔn)確性;另一是自定義的準(zhǔn)確性獎勵函數(shù),用于計算模型輸出的計數(shù)是否與真值一致,目前兩個獎勵函數(shù)都已經(jīng)定義在SWIFT框架中,通過—reward_funcs external_r1v_acc format參數(shù)指定。
選取Qwen2.5-VL-3B-Instruct 作為基礎(chǔ)模型進行訓(xùn)練,選取 instruct 而不是base模型的主要原因是可以更快地獲取 format reward。整體實驗在8卡 GPU 上完成。當(dāng)前SWIFT GRPO訓(xùn)練已支持多卡部署模型以加速rollout,因此設(shè)置num_infer_workers為2,進程數(shù)為6:即2卡vLLM部署采樣,6卡模型訓(xùn)練。設(shè)置模型的最大輸出為1024,學(xué)習(xí)率設(shè)置為1e-6,其他參數(shù)設(shè)置詳見最佳實踐(3)。
實驗結(jié)果如下圖所示:
模型訓(xùn)練了500個epoch已經(jīng)基本收斂,準(zhǔn)確性獎勵(圖中為ClevrCountORM)和格式獎勵(圖中為Format)在不斷增加,證明模型學(xué)習(xí)到了如何完成這一任務(wù),最終任務(wù)成功率從初始的0.4攀升到1左右;在大概300step左右,reward_std已經(jīng)將到0.1左右,證明模型已經(jīng)基本收斂;completion length最終穩(wěn)定在60-80,模型學(xué)習(xí)到的任務(wù)推理范式是逐個列舉圖中的物體。
訓(xùn)練后的模型輸出樣例如下:
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框架是魔搭社區(qū)上開源的大模型評測工具(4),提供了完整的大模型全面評測框架。
不僅提供O1/R1等推理類模型的推理性能的評測能力,還支持評測結(jié)果的可視化,如下圖所示。
同時,團隊將MATH-500、GPQA-Diamond和AIME-2024三個數(shù)據(jù)集整合為一個數(shù)據(jù)集合,放置于modelscope/R1-Distill-Math-Test數(shù)據(jù)集(5)中,用戶可以直接使用該數(shù)據(jù)集的ID進行評測操作,具體使用流程參考:模型推理能力評測最佳實踐(6)。
除此之外,針對Reasoning模型在推理過程中存在Underthinking(思考不足,指模型在推理時頻繁思路跳轉(zhuǎn),無法專注于正確的思路,導(dǎo)致錯誤答案)和Overthinking(過度思考,指模型簡單問題上生成過長思維鏈,浪費計算資源)的問題。
該框架實現(xiàn)了模型思考效率評測能力,可以評估如DeepSeek-R1-Distill-Qwen-7B(7)等推理模型的思考效率,如下圖所示,從token效率、思考長度、子思維鏈數(shù)量和準(zhǔn)確率四個方面進行衡量,可以用來評測并優(yōu)化模型在短輸出中獲取正確答案的能力,具體使用流程參考教程:模型思考效率評測最佳實踐(8)。
效果
從簡單的數(shù)學(xué)任務(wù)Countdown Game出發(fā),對SWIFT框架的GRPO有效性進行驗證,并給出了完整的實驗流程(9)。
Coundown Game 的任務(wù)目標(biāo)是根據(jù)給定的幾個數(shù)字和加減乘除四種運算,得到目標(biāo)數(shù)字,給出運算公式,因此在模型的輸入中給定了任務(wù)描述、已有數(shù)字和目標(biāo)數(shù)字。訓(xùn)練選取的獎勵函數(shù)一共有兩個,一個是標(biāo)準(zhǔn)的格式獎勵函數(shù),用于評估模型輸出格式的準(zhǔn)確性;另一是自定義的準(zhǔn)確性獎勵函數(shù),用于評估模型輸出運算公式是否能得到目標(biāo)值,目前兩個獎勵函數(shù)都已經(jīng)定義在SWIFT框架中,通過—reward_funcs external_countdown format參數(shù)指定。
選取Qwen2.5-3B-Instruct模型進行全參數(shù)GRPO訓(xùn)練,具體參數(shù)設(shè)置詳見實驗流程。發(fā)現(xiàn)GRPO的訓(xùn)練過程是比較不穩(wěn)定的,一個比較大的學(xué)習(xí)率和beta(KL散度的權(quán)重)雖然會是模型更快收斂,但往往出現(xiàn)梯度過大而訓(xùn)練崩潰的情況。最終選取學(xué)習(xí)率為7e-5,beta為0.001。
實驗結(jié)果如下圖所示:
一共訓(xùn)練了2000個step,各項曲線證明了SWIFT GRPO的有效性,從實驗結(jié)果中也能看到模型的收斂過程。
準(zhǔn)確性獎勵(CoundownORM)和格式獎勵(Format)的穩(wěn)步上升證明模型逐步學(xué)習(xí)到了如何更好地完成這一任務(wù),同時reward_std最終處在0.2-0.3左右也證明了模型仍有繼續(xù)上升的空間。
從completion_length的變化上能明確地看到模型思考方式的轉(zhuǎn)變。從初始的500左右降到200,然后又增長到300-400 tokens,能明確看到各個階段模型的思考方式。初始時,模型會直接從結(jié)果出發(fā),反推需要的數(shù)字;然后,模型逐漸精簡了反推過程,顯著縮減了輸出場地;最后,模型發(fā)現(xiàn)完成任務(wù)最好的方式是列舉已有數(shù)字和運算的組合,并逐步運算,輸出范式基本收斂。最終的輸出樣例如下:
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模式以適配更大體量模型的訓(xùn)練,并希望在已有的優(yōu)秀框架的技術(shù)沉淀上以差異化技術(shù)的方式為開發(fā)者提供簡單快速的中、小集群RL訓(xùn)練方案,給開發(fā)者提供新的技術(shù)選型。目前SWIFT已經(jīng)支持的訓(xùn)練領(lǐng)域有數(shù)學(xué)、ReACT結(jié)構(gòu)的Agent、多模態(tài)VQA等,代碼領(lǐng)域的支持也在陸續(xù)更新中。對于Megatron結(jié)構(gòu)的模型SWIFT在支持中,不僅僅是GRPO訓(xùn)練,SFT和PreTrain也將得到相應(yīng)支持。
評測領(lǐng)域,EvalScope后續(xù)會針對Reasoning models進一步探索模型的“思考效率”問題;另外,從目前的趨勢看,多模態(tài)Reasoning的范式也逐漸引起重視,團隊也會在該領(lǐng)域積極探索最新的評測基準(zhǔn)、指標(biāo)和方法。