剛剛!微調DeepSeek滿血版正式開源…

MLNLP社群是國內外知名的機器學習與自然語言處理社群,受眾覆蓋國內外NLP碩博生、高校老師以及企業研究人員。
社群的願景是促進國內外自然語言處理,機器學習學術界、產業界和廣大愛好者之間的交流和進步,特別是初學者同學們的進步。
來源 | AI有道
近期,由中國科學院自動化研究所中科聞歌聯合推出的 DeepSeek-V3/R1 671B 全引數微調開源方案正式釋出!該專案完整公開了從模型訓練到推理的全流程程式碼與指令碼,並附帶了實際訓練中的經驗總結與最佳化建議,為大模型開發者提供了一套可直接落地實戰的解決方案。

一、專案亮點

1、完整訓練邏輯程式碼:基於DeepSeek-V3論文,並結合DeepSeek-V2程式碼,該專案實現了包含訓練核心邏輯的modeling_deepseek.py檔案,確保與官方架構相容。
2、高效並行訓練策略:支援資料並行(DeepSpeed ZeRO)序列並行(SP),在32臺H100伺服器叢集上完成671B模型的滿血版模型全引數微調。
3、訓練實戰經驗總結:提供多組實驗配置對比(如不同超引數、並行策略選擇下的視訊記憶體佔用),推薦最優訓練引數,助開發者少走彎路。

二、專案意義

技術角度:透過全引數微調,DeepSeek 模型能更好地訓練並擬合目標任務模式和資料分佈,整體訓練效果優於 LoRA 等低資源微調方案。
應用角度:針對模型在預訓練階段已具備基礎知識的領域,全引數微調能夠挖掘模型在特定垂直領域(如社會計算、媒體領域等)各種下游任務的效能潛力。

三、硬體配置

單臺伺服器配置如下表,叢集共有 32 臺相同配置的機器,共享 100TB 儲存空間,掛載路徑為 /nfs。機器作業系統為 Ubuntu 22.04,機器之間使用 IB 網路進行通訊,GPU 之間透過 NVLink 通訊,CUDA 版本為 12.6。

四、環境配置

本專案基於 xtuner 框架進行擴充套件和改進,使其支援 Deepseek V3/R1(即 DeepseekV3ForCausalLM 模型架構)的全引數微調,支援資料並行(DeepSpeed ZeRO based DP)和序列並行(Sequence Parallel, SP)。安裝 Python 環境,可根據專案中 requirements.txt 安裝依賴包,並將 ./code/xtuner 與 DeepseekV3ForCausalLM 訓練相關的核心程式碼覆蓋原始 xtuner package 的對應程式碼即可。

conda create -n ds_env python=3.10conda activate ds_envpip install -r requirements.txt# 覆蓋核心程式碼 這裡修改為你的環境路徑YOUR_ENV_PATH='/nfs/miniconda3/envs/ds_env/lib/python3.10/site-packages'cp -r ./code/xtuner $YOUR_ENV_PATH

五、資料準備

該專案基於 OpenAI 標準資料格式進行擴充套件以相容 reasoning 資料,每條原始訓練資料格式如下。如果有思考過程,則 assistant 角色的 reasoning_content 欄位非空。

{"messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"使用者問題"},{"role":"assistant","content":"最終回答","reasoning_content":"思考過程"}]}

為了簡化處理邏輯,該專案將 reasoning_content 和 content 按照 Deepseek 的訓練格式合併到 content 欄位中。此外,為了相容多輪對話的訓練邏輯,還為 assistant 角色的每輪添加了 loss 欄位,僅對值為 true 的 content 內容計算 loss。

{"messages": [    {"role""system""content""You are a helpful assistant."},    {"role""user""content""使用者問題"},    {"role""assistant""content""<think>\n思考過程\n</think>\n\n最終回答""loss"true}  ]}

為了更清晰地展示資料儲存格式,該專案提供了一份轉換後的資料樣例檔案 ./data/train_example.json 以供參考。在實際訓練時,程式會根據 Deepseek V3/R1 的訓練模版自動轉換為如下格式,這裡僅供展示:

<beginof▁sentence|>You are a helpful assistant.<User>使用者問題<|Assistant|><think>\n思考過程\n</think>\n\n最終回答<endof▁sentence|>

六、啟動訓練

該專案提供了訓練程式碼和訓練啟動指令碼,其中:
./code/scripts/sft_deepseek.py:sft訓練所需的配置檔案,包括超引數設定、model和tokenizer配置、訓練策略等,模型訓練相關的配置均在此檔案修改。
./code/scripts/sft_deepseek.sh:sft訓練啟動指令碼,該指令碼為單個節點的執行檔案,因此需要透過 slurm 或 pdsh 在每臺機器執行。對於每臺機器,訓練啟動命令的唯一不同為 NODE_RANK 值,如果共 32 臺機器,則該編號分別從 0 到 31。
以下是該專案提供的幾組實驗的結論,包括在不同並行策略等配置下模型訓練的可行性。訓練資料 ~100k,訓練上下文長度為 32k。表中報告了每次實驗使用的機器數量(nodes)、序列並行度(sp)、資料並行方式(dp)、單卡 batch size(bs)、迭代輪次(epoch)、學習率(lr)、單卡視訊記憶體(mem)、實驗記錄和備註(notes)。

以下是訓練過程中的一個截圖,從 DeepSeek V3 對該專案使用的 reasoning 資料進行全引數微調時,起始 loss 通常在 3.5 左右,經過 1 epoch 訓練後,loss 收斂到 1.2 左右。

七、模型權重轉換

訓練過程中建議使用至少 100TB 的 SSD 大容量儲存,因為單個 pth 中間結果大約佔 7.4TB 硬碟空間。訓練完成後,需要將 pth 轉換為主流推理框架(如vllm等)較好相容的 huggingface 格式。在單臺機器節點執行 bash ./code/scripts/convert_pth_to_hf.sh 即可完成模型權重格式轉換,可根據實際情況修改指令碼中的 pth 路徑和權重儲存路徑。
需要注意的是,由於本過程對 CPU 記憶體有較大需求,因此可以透過虛擬記憶體進行擴充套件,防止 Out-of-memory。Swap(交換分割槽) 是 Linux 的虛擬記憶體,作用是當物理記憶體(RAM)不夠用時,把部分資料存入磁碟,釋放 RAM。
sudo fallocate -l 8192G /tmp/swapfile  # 建立 8T 交換檔案sudo chmod 600 /tmp/swapfilesudo mkswap /tmp/swapfilesudo swapon /tmp/swapfilefree -h  # 檢查 swap 是否增加

八、模型推理部署

該專案使用 vLLM 對全引數微調後的模型進行簡單部署測試。如果使用 slurm 叢集,可參考該專案提供的指令碼並執行 sbatch 命令 sbatch ./code/scripts/vllm_deploy_slurm.sh 即可提交作業。半精度(bf16/fp16)模型建議使用4臺機器32卡進行部署,如需配置 ray 或 api server 的埠號,可自行修改 sh 檔案。如果需要透過 pdsh 啟動部署(假設使用 node0~node3 四臺機器),可參考以下步驟:  
1、設定環境變數(node0~node3)。
export HEAD_ADDR="node0"export DASHBOARD_PORT=8265export HEAD_PORT=6379export RAY_TMPDIR=/tmp/ray_tmp/export RAY_ADDRESS=$HEAD_ADDR:$HEAD_PORT
2、啟動 Ray Head(node0)。
pdsh -R ssh -w node0 "source /nfs/miniconda3/etc/profile.d/conda.sh && conda activate vllm && \ray start --block --head --port=$HEAD_PORT --dashboard-port=$DASHBOARD_PORT --temp-dir=$RAY_TMPDIR"

3、啟動 Ray Worker(node1~node3)。

pdsh -R ssh -w node1,node2,node3 "source /nfs/miniconda3/etc/profile.d/conda.sh && conda activate vllm && \ray start --block --address=$HEAD_ADDR:$HEAD_PORT"

4、啟動 vLLM(node0)。

pdsh -R ssh -w node0 "source /nfs/miniconda3/etc/profile.d/conda.sh && conda activate vllm && \vllm serve /path/of/your/deepseek_sft_ckpt \--tensor-parallel-size8 \--pipeline-parallel-size4 \--served-model-name deepseek-r1-sft \--max-model-len32768 \--trust-remote-code \--enable-reasoning \--reasoning-parser deepseek_r1"

啟動完成後,可透過 curl 命令測試介面是否正常啟動:

curl -X POST http://node0:8000/v1/chat/completions -d '{"model""deepseek-r1-sft""messages":[{"role":"user""content""hello"}]}' -H "Content-Type: application/json"
稍等片刻後,如果終端輸出符合預期的響應結果,則說明從訓練到部署到整個過程順利完成!🎉
Github開源地址:
https://github.com/ScienceOne-AI/DeepSeek-671B-SFT-Guide

技術交流群邀請函

△長按新增小助手
掃描二維碼新增小助手微信
請備註:姓名-學校/公司-研究方向
(如:小張-哈工大-對話系統)
即可申請加入自然語言處理/Pytorch等技術交流群

關於我們

MLNLP 社群是由國內外機器學習與自然語言處理學者聯合構建的民間學術社群,目前已經發展為國內外知名的機器學習與自然語言處理社群,旨在促進機器學習,自然語言處理學術界、產業界和廣大愛好者之間的進步。
社群可以為相關從業者的深造、就業及研究等方面提供開放交流平臺。歡迎大家關注和加入我們。


相關文章