全參數(shù)微調(diào)DeepSeek滿血版工程開源!
近日,由中國科學(xué)院自動化研究所與中科聞歌聯(lián)合推出的 DeepSeek-V3/R1 671B 全參數(shù)微調(diào)開源方案正式發(fā)布!這個方案完整開放了從模型訓(xùn)練到推理部署的全鏈路工程代碼,同步公開實踐驗證過的技術(shù)經(jīng)驗與調(diào)優(yōu)策略,為開發(fā)者提供可直接部署的工業(yè)化級大模型訓(xùn)練框架。
01 項目核心特點
1、完整訓(xùn)練邏輯代碼:基于DeepSeek-V3論文,并結(jié)合DeepSeek-V2代碼,該項目實現(xiàn)了包含訓(xùn)練核心邏輯的modeling_deepseek.py文件,確保與官方架構(gòu)兼容。
2、高效并行訓(xùn)練策略:支持?jǐn)?shù)據(jù)并行(DeepSpeed ZeRO)與序列并行(SP),在32臺H100服務(wù)器集群上完成671B模型的滿血版模型全參數(shù)微調(diào)。
3、訓(xùn)練實戰(zhàn)經(jīng)驗總結(jié):提供多組實驗配置對比(如不同超參數(shù)、并行策略選擇下的顯存占用),推薦最優(yōu)訓(xùn)練參數(shù),助開發(fā)者少走彎路。
02 技術(shù)價值解析
技術(shù)角度:通過全參數(shù)微調(diào),DeepSeek 模型能更好地訓(xùn)練并擬合目標(biāo)任務(wù)模式和數(shù)據(jù)分布,整體訓(xùn)練效果優(yōu)于 LoRA 等低資源微調(diào)方案。
應(yīng)用角度:針對模型在預(yù)訓(xùn)練階段已具備基礎(chǔ)知識的領(lǐng)域,全參數(shù)微調(diào)能夠挖掘模型在特定垂直領(lǐng)域(如社會計算、媒體領(lǐng)域等)各種下游任務(wù)的性能潛力。
03 快速上手指南
1. 硬件配置
北京超級云計算中心基于H100 GPU集群為該項目構(gòu)建了高性能計算底座,其技術(shù)服務(wù)團(tuán)隊通過深度調(diào)優(yōu)實現(xiàn)了計算環(huán)境的適配性優(yōu)化。單臺服務(wù)器配置如下表,集群共有 32 臺相同配置的機(jī)器,共享 100TB 存儲空間,掛載路徑為 /nfs。機(jī)器操作系統(tǒng)為 Ubuntu 22.04,機(jī)器之間使用 IB 網(wǎng)絡(luò)進(jìn)行通信,GPU 之間通過 NVLink 通信,CUDA 版本為 12.6。
2. 環(huán)境配置
本項目基于 xtuner 框架進(jìn)行擴(kuò)展和改進(jìn),使其支持 Deepseek V3/R1(即 DeepseekV3ForCausalLM 模型架構(gòu))的全參數(shù)微調(diào),支持?jǐn)?shù)據(jù)并行(DeepSpeed ZeRO based DP)和序列并行(Sequence Parallel, SP)。安裝 Python 環(huán)境,可根據(jù)項目中 requirements.txt 安裝依賴包,并將 ./code/xtuner 與 DeepseekV3ForCausalLM 訓(xùn)練相關(guān)的核心代碼覆蓋原始 xtuner package 的對應(yīng)代碼即可。
3 .數(shù)據(jù)準(zhǔn)備
該項目基于 OpenAI 標(biāo)準(zhǔn)數(shù)據(jù)格式進(jìn)行擴(kuò)展以兼容 reasoning 數(shù)據(jù),每條原始訓(xùn)練數(shù)據(jù)格式如下。如果有思考過程,則 assistant 角色的 reasoning_content 字段非空。
為了簡化處理邏輯,該項目將 reasoning_content 和 content 按照 Deepseek 的訓(xùn)練格式合并到 content 字段中。此外,為了兼容多輪對話的訓(xùn)練邏輯,還為 assistant 角色的每輪添加了 loss 字段,僅對值為 true 的 content 內(nèi)容計算 loss。
為了更清晰地展示數(shù)據(jù)存儲格式,該項目提供了一份轉(zhuǎn)換后的數(shù)據(jù)樣例件 ./data/train_example.json 以供參考。在實際訓(xùn)練時,程序會根據(jù) Deepseek V3/R1 的訓(xùn)練模版自動轉(zhuǎn)換為如下格式,這里僅供展示:
4 .啟動訓(xùn)練
該項目提供了訓(xùn)練代碼和訓(xùn)練啟動腳本,其中:
./code/scripts/sft_deepseek.py:sft訓(xùn)練所需的配置文件,包括超參數(shù)設(shè)置、model和tokenizer配置、訓(xùn)練策略等,模型訓(xùn)練相關(guān)的配置均在此文件修改。
./code/scripts/sft_deepseek.sh:sft訓(xùn)練啟動腳本,該腳本為單個節(jié)點的執(zhí)行文件,因此需要通過 slurm 或 pdsh 在每臺機(jī)器執(zhí)行。對于每臺機(jī)器,訓(xùn)練啟動命令的唯一不同為 NODE_RANK 值,如果共 32 臺機(jī)器,則該編號分別從 0 到 31。
以下是該項目提供的幾組實驗的結(jié)論,包括在不同并行策略等配置下模型訓(xùn)練的可行性。訓(xùn)練數(shù)據(jù) ~100k,訓(xùn)練上下文長度為 32k。表中報告了每次實驗使用的機(jī)器數(shù)量(nodes)、序列并行度(sp)、數(shù)據(jù)并行方式(dp)、單卡 batch size(bs)、迭代輪次(epoch)、學(xué)習(xí)率(lr)、單卡顯存(mem)、實驗記錄和備注(notes)。
以下是訓(xùn)練過程中的一個截圖,從 DeepSeek V3 對該項目使用的 reasoning 數(shù)據(jù)進(jìn)行全參數(shù)微調(diào)時,起始 loss 通常在 3.5 左右,經(jīng)過 1 epoch 訓(xùn)練后,loss 收斂到 1.2 左右。
5 .模型權(quán)重轉(zhuǎn)換
訓(xùn)練過程中建議使用至少 100TB 的 SSD 大容量存儲,因為單個 pth 中間結(jié)果大約占 7.4TB 硬盤空間。訓(xùn)練完成后,需要將 pth 轉(zhuǎn)換為主流推理框架(如vllm等)較好兼容的 huggingface 格式。在單臺機(jī)器節(jié)點執(zhí)行 bash ./code/scripts/convert_pth_to_hf.sh 即可完成模型權(quán)重格式轉(zhuǎn)換,可根據(jù)實際情況修改腳本中的 pth 路徑和權(quán)重保存路徑。
需要注意的是,由于本過程對 CPU 內(nèi)存有較大需求,因此可以通過虛擬內(nèi)存進(jìn)行擴(kuò)展,防止 Out-of-memory。Swap(交換分區(qū)) 是 Linux 的虛擬內(nèi)存,作用是當(dāng)物理內(nèi)存(RAM)不夠用時,把部分?jǐn)?shù)據(jù)存入磁盤,釋放 RAM。
6 .模型推理部署
該項目使用 vLLM 對全參數(shù)微調(diào)后的模型進(jìn)行簡單部署測試。如果使用 slurm 集群,可參考該項目提供的腳本并執(zhí)行 sbatch 命令 sbatch ./code/scripts/vllm_deploy_slurm.sh 即可提交作業(yè)。半精度(bf16/fp16)模型建議使用4臺機(jī)器32卡進(jìn)行部署,如需配置 ray 或 api server 的端口號,可自行修改 sh 文件。如果需要通過 pdsh 啟動部署(假設(shè)使用 node0~node3 四臺機(jī)器),可參考以下步驟:
1、設(shè)置環(huán)境變量(node0~node3)。
2、啟動 Ray Head(node0)。
3、啟動 Ray Worker(node1~node3)。
4、啟動 vLLM(node0)。
啟動完成后,可通過 curl 命令測試接口是否正常啟動:
稍等片刻后,如果終端輸出符合預(yù)期的響應(yīng)結(jié)果,則說明從訓(xùn)練到部署到整個過程順利完成!??
Github開源地址:
https://github.com/ScienceOne-AI/DeepSeek-671B-SFT-Guide