「DeepSeek-V3 技術(shù)解析」:DeepSeek-V3-Base 預(yù)訓(xùn)練階段解析 原創(chuàng) 精華
編者按: 這篇技術(shù)解析詳細闡述了 DeepSeek-V3-Base 的預(yù)訓(xùn)練階段所采用的關(guān)鍵技術(shù)。
文章重點介紹了三項核心技術(shù):Document Packing 技術(shù)有效解決了輸入序列長度差異導(dǎo)致的資源浪費問題;Fill-in-the-Middle(FIM)采用 PSM 框架和特殊 tokens,使模型具備上下文感知的中間內(nèi)容生成能力;基于 YaRN 的長上下文窗口擴展技術(shù)則通過頻率插值策略解決了位置編碼的擴展挑戰(zhàn)。
隨后,文章詳細描述了 DeepSeek-V3-Base 的預(yù)訓(xùn)練過程,包括數(shù)據(jù)構(gòu)建、訓(xùn)練策略和評估結(jié)果。
評估顯示,這些技術(shù)組合使 DeepSeek-V3 每訓(xùn)練 1T token 僅需 180K NVIDIA H800 GPU 小時數(shù),并在“大海撈針”測試中展現(xiàn)卓越的長文本理解能力,為后續(xù) RL 階段奠定了優(yōu)質(zhì)基座。
作者 | Shirley Li
編譯 | 岳揚
這是 DeepSeek 系列文章的第五篇,也是首篇聚焦 DeepSeek-V3 [1, 2] 訓(xùn)練流程的文章。
如下圖所示,DeepSeek-V3 的訓(xùn)練分為多個階段:
- 產(chǎn)出 DeepSeek-V3-Base 基礎(chǔ)模型的預(yù)訓(xùn)練階段
- 基于 DeepSeek-V3-Base,通過大規(guī)模強化學(xué)習(xí)(RL)分別訓(xùn)練出 DeepSeek-R1-Zero(無需監(jiān)督式微調(diào)冷啟動)和 DeepSeek-R1(含有監(jiān)督式微調(diào))
- 利用 DeepSeek-R1 生成推理數(shù)據(jù),用于 DeepSeek-V3 的監(jiān)督式微調(diào)(SFT),接著是未在圖中展示的 RL 階段。
圖 1. DeepSeek-V3 訓(xùn)練流程示意圖(由原文作者繪制)
本文將重點關(guān)注產(chǎn)出 DeepSeek-V3-Base 的預(yù)訓(xùn)練階段,闡述該階段實現(xiàn)高效預(yù)訓(xùn)練的關(guān)鍵技術(shù)。后續(xù)文章將涵蓋:
- 群組相對策略優(yōu)化(GRPO)[7]
- DeepSeek-R1-Zero 和 DeepSeek-R1 的訓(xùn)練細節(jié)
- DeepSeek-V3 的后訓(xùn)練階段(監(jiān)督式微調(diào)與 RL 階段)
目錄
- 技術(shù)背景:解析 DeepSeek-V3 預(yù)訓(xùn)練階段的相關(guān)技術(shù),包括 Document Packing,F(xiàn)ill-in-Middle 和 long context extension。
- 預(yù)訓(xùn)練階段:詳解如何構(gòu)建預(yù)訓(xùn)練數(shù)據(jù)、強調(diào)一些關(guān)鍵的訓(xùn)練策略,并回顧評估結(jié)果。
- 總結(jié)
- 參考文獻
01 技術(shù)背景
本節(jié)將介紹預(yù)訓(xùn)練 DeepSeek-V3 過程中使用的幾種技術(shù),包括 document packing、Fill-in-the-Middle(FIM)和基于 YaRN 的長上下文窗口擴展技術(shù)。
1.1 Document Packing
要理解為什么需要 document packing,我們首先需要回顧一下 Transformer 模型是如何構(gòu)建輸入序列 tokens 的。
Transformer 模型默認情況下需要固定長度的 token 序列作為輸入,然而同一 batch 的文本輸入往往長度不同。為了適應(yīng)這種情況,文本輸入通常需要經(jīng)過以下預(yù)處理步驟:
- 將所有原始文本輸入分詞為 token 序列
- 將 token 序列截斷或填充到預(yù)定義的固定長度(max_seq_len):若原始序列過長則截斷,否則用特殊 [PAD] token 進行填充
- 生成掩碼 IDs 使模型在訓(xùn)練時能忽略填充的 token
為了更清晰地展示這個過程,以下這個示例我們將使用 GPT-2 [10]的分詞器處理兩個句子:
運行上述腳本后,會得到如下輸出,其中:
- 第一句話被填充了 4 個額外的 padding token,體現(xiàn)在 input_ids 和 mask_ids 中;
- 第二句被截斷,因此無需添加 padding token。
圖 2. 填充操作示例(此圖由作者繪制)
上述截斷和填充方法雖然能讓模型處理不同長度的輸入,但當(dāng)輸入序列長度差異過大時(這在 LLM 訓(xùn)練中非常常見)會引發(fā)一系列問題:
- 對超長序列,截斷可能導(dǎo)致有用信息丟失
- 對較短的序列,填充過多 token 會造成計算資源浪費
因此,LLM 訓(xùn)練通常采用 document packing 技術(shù)來處理輸入序列。
更具體地說,如果給定若干長度不同的文檔,我們首先將其分割為較小的塊(chunk),如下圖所示(用不同顏色代表不同文檔):
圖 3. 文檔分割(圖片改編自文獻[3])
隨后,我們將不同文檔的塊(chunk)進行拼接,以避免對長文檔進行截斷和對短文檔進行填充:
圖 4. 傳統(tǒng)拼接方式(圖片改編自文獻[3])
在上例中:
- 第一個輸入(譯者注:圖 4 第一行)僅包含文檔 1 的 tokens
- 第二個輸入(譯者注:圖 4 第二行)拼接自文檔 1 和文檔 2 的 tokens
- 第三個輸入(譯者注:圖 4 第三行)拼接自文檔 2 和文檔 3 的 tokens
- 第四個輸入(譯者注:圖 4 第四行)拼接自文檔3、4、5 的 tokens
這種方法雖能在一定程度上避免進行填充和截斷,但由于僅按數(shù)據(jù)中的相對順序拼接來自不同文檔的塊(chunks),無法控制最終輸入序列的構(gòu)建方式。 例如:文檔 3(紫色)被不必要地分割為兩部分,盡管其實際長度小于 max_seq_len,可以完整放入。
為了解決這個問題,文獻 [3] 提出了 Best-fit Packing 技術(shù),通過兩個步驟完全消除不必要的分割:
- Step 1:將每個文檔分割為更小的塊。
- Step 2:以一種智能的方式將這些塊(chunks)分組為訓(xùn)練序列,確保在不進一步分割任何塊(chunks)的前提下生成最少量的序列。
圖 5. Best-fit packing技術(shù)(此圖改編自文獻[3])
1.2 Fill-in-the-Middle(FIM)
在傳統(tǒng)的自回歸生成中,只能以從左到右的方式訓(xùn)練模型,即模型只能根據(jù)前面的 tokens 預(yù)測下一個 token。然而在實際應(yīng)用中,模型常需根據(jù)上下文生成中間缺失的內(nèi)容。 尤其在代碼生成場景中 —— 我們常會給定輸入/輸出和部分代碼片段,要求模型填充中間邏輯,如下例所示:
為了適配此類需求,文獻 [4] 提出了一種簡單有效的方法,稱為 “fill-in-the-middle”:即將文檔隨機切分為 prefix、middle 和 suffix 三部分,然后將 middle 部分移至末尾:
由于數(shù)據(jù)組織形式為 "Prefix-Suffix-Middle",該方法常被稱為 PSM 框架。實際實現(xiàn)時通過添加特殊 token 來標(biāo)記各部分的邊界:
其中:
- <|fim_begin|>和<|fim_hole|>標(biāo)記 prefix 部分
- <|fim_hole|>和<|fim_end|>標(biāo)記 suffix 部分
- <|fim_end|>和<|eos_token|>標(biāo)記 middle 部分
以如下輸入為例:
若需模型預(yù)測第二行代碼,可將該行作為 middle 部分,并構(gòu)造 FIM 輸入如下:
圖 6. PSM 框架示意圖(此圖由作者繪制)
此時模型的預(yù)期輸出應(yīng)為:
1.3 基于 YaRN 的長上下文窗口擴展技術(shù)
現(xiàn)代 LLM 常需處理極長的提示詞(如整個代碼倉庫),但直接使用 128K 等長上下文窗口進行預(yù)訓(xùn)練并不現(xiàn)實。多數(shù) LLM 采用分階段漸進式擴展策略:先在較小的上下文窗口進行預(yù)訓(xùn)練,再分多個階段逐步擴展到更長的上下文窗口,從而大大降低訓(xùn)練成本。
例如,在 DeepSeek-V3 中,模型首先使用 4K 的上下文窗口完成預(yù)訓(xùn)練,然后再分兩階段擴展到 128K:
- 第一階段:從 4K 到 32K(1000 steps)
- 第二階段:從 32K 到 128K(再 1000 steps)
需特別指出的是,這種擴展不能通過簡單調(diào)大上下文窗口實現(xiàn),而需借助基于旋轉(zhuǎn)位置編碼(RoPE)改進的 YaRN(Yet another RoPE extensioN)技術(shù)對位置編碼進行修改。
關(guān)于 RoPE 的詳細介紹,請參閱我們之前的文章《「DeepSeek-V3 技術(shù)解析」:多頭潛在注意力機制(MLA)》。
RoPE 是一種相對位置編碼方法,其核心思想是通過使用復(fù)雜的旋轉(zhuǎn)嵌入修改 Query 和 Key,使得二者的內(nèi)積依賴于它們的相對位置:
然而,由于余弦函數(shù)和正弦函數(shù)是周期性的,(pos_i, pos_j) 之間的內(nèi)積可能看起來與 (pos_i, pos_k) 之間的內(nèi)積相似,因此在固定 θ 的情況下,僅使用 1K tokens(即位置索引 1~1000) 進行預(yù)訓(xùn)練的模型在測試時可能會混淆,因為測試時遇到的位置索引(如 5K 或 10K)可能遠遠超出了預(yù)訓(xùn)練時的上下文窗口。
下圖展示了這種現(xiàn)象:當(dāng) 32K 上下文窗口的預(yù)訓(xùn)練模型在超出該窗口的位置測試時,困惑度(Perplexity)急劇上升:
圖 7. 困惑度與上下文窗口的關(guān)系(此圖由作者繪制)
那么,YaRN 是如何應(yīng)對這一挑戰(zhàn)的呢?
既然外推法(extrapolate)效果欠佳,YaRN 轉(zhuǎn)而采用插值頻率(interpolate the frequency)的策略。
假設(shè)我們有一個在 4 個 token 長度的輸入上訓(xùn)練的模型,希望將其擴展到 8 個 token,且基礎(chǔ)頻率 θ=0.5。
對于原始 RoPE,直接使用 cos(θ×pos) 和 sin(θ×pos) 對 Query 和 Key 進行旋轉(zhuǎn)即可。
而對于 YaRN:
- 首先,計算擴展后的上下文長度與原始長度的比值作為縮放因子,本例中為 2。
- 然后,生成新頻率 θ' = θ / 2 = 0.25。
- 再使用新頻率對 Query 和 Key 進行旋轉(zhuǎn),即 cos(θ'×pos) 和 sin(θ'×pos)。
下圖對比了 RoPE 與 YaRN 的 cos 和 sin 值:
圖 8. YaRN 工作原理示意圖(此圖由作者繪制)
通過該圖可觀察到:
- 在 RoPE 中,cos 和 sin 值會隨位置索引的增加而快速振蕩,導(dǎo)致擴展到更長的上下文時出現(xiàn)問題。
- 而在 YaRN 中,原始的余弦和正弦函數(shù)通過頻率縮放被插值到擴展后的上下文長度(如藍色高亮區(qū)域所示),實現(xiàn)了更平滑的過渡,使得模型能夠更有效地處理長序列。
下圖展示了 DeepSeek-V3 在"大海撈針"(Needle In A Haystack,NIAH)測試中的表現(xiàn),表明其在 128K 以下的上下文窗口長度中均表現(xiàn)出色:
圖 9. DeepSeek-V3 的"大海撈針"測試結(jié)果(引自文獻[2])
02 預(yù)訓(xùn)練階段
本節(jié)將介紹 DeepSeek-V3-Base 的訓(xùn)練方法,重點解析數(shù)據(jù)構(gòu)建流程,并強調(diào)預(yù)訓(xùn)練階段中的一些關(guān)鍵策略。
2.1 數(shù)據(jù)構(gòu)建
數(shù)據(jù)規(guī)模與質(zhì)量對 LLM 訓(xùn)練至關(guān)重要。DeepSeek-V3 的預(yù)訓(xùn)練語料庫通過持續(xù)優(yōu)化策略構(gòu)建,具體優(yōu)化路徑如下:
- 在 DeepSeek 67B [8] 中,訓(xùn)練語料采用去重-過濾-再混合策略構(gòu)建。首先對 Common Crawl 語料進行去重,隨后通過嚴(yán)格的文檔質(zhì)量評估標(biāo)準(zhǔn)進行過濾,最后通過數(shù)據(jù)再混合階段解決數(shù)據(jù)不平衡問題。
- 在 DeepSeek-V2 [9] 中,通過以下方式擴展訓(xùn)練語料:1)增加更多中文數(shù)據(jù)及來自不同來源的高質(zhì)量數(shù)據(jù);2)通過優(yōu)化數(shù)據(jù)清洗流程,恢復(fù)大量此前在文獻 [8] 的策略中被刪除的數(shù)據(jù)。同時,通過改進基于質(zhì)量的過濾算法提升數(shù)據(jù)質(zhì)量。
- 在 DeepSeek-V3 [2] 中,預(yù)訓(xùn)練語料進一步擴充,加入更多數(shù)學(xué)與編程樣本,以及除中英文之外的多語言樣本。
收集的預(yù)訓(xùn)練語料會通過前文提出的 Prefix-Suffix-Middle(PSM)框架結(jié)合 FIM(Fill-in-Middle)策略進行預(yù)處理,并應(yīng)用 document-packing 技術(shù)。
2.2 訓(xùn)練策略
原論文[2]對預(yù)訓(xùn)練參數(shù)進行了詳細描述,此處我們僅強調(diào)幾個關(guān)鍵點:
- 長上下文窗口擴展:首先在 14.8T token 上以 4K 上下文窗口進行預(yù)訓(xùn)練,隨后通過 1000 steps 擴展到 32K 上下文,最終再通過 1000 steps 擴展到 128K 上下文。
- 多詞元預(yù)測:如我們本系列前一篇文章《「DeepSeek-V3 技術(shù)解析」:多詞元預(yù)測技術(shù)(Multi-Token Prediction, MTP)》所述,DeepSeek-V3 采用了優(yōu)化版的多詞元預(yù)測機制,允許模型同時解碼多個詞元(tokens),以加速訓(xùn)練中的解碼過程。
- 以 FP8 精度進行訓(xùn)練:DeepSeek-V3 采用混合精度計算提升效率,對部分計算使用低精度格式(如 8-bit 浮點數(shù)),在不過度影響精度的前提下減少內(nèi)存占用并加速計算。
- 學(xué)習(xí)率的調(diào)度:在前 2K steps 中,學(xué)習(xí)率(learning rate)從 0 線性增長至 2.2e–4,并在 10T token 的訓(xùn)練過程中保持恒定;隨后在 4.3T token 的訓(xùn)練過程中按照余弦曲線下降至 2.2e-5;在最后 500B token 的訓(xùn)練過程中,前 333B token 保持恒定的學(xué)習(xí)率,剩余 167B token 進一步降至 7.3e-6。
- Batch size 的調(diào)度:在前 469B token 的訓(xùn)練過程中,Batch size 從 3072 逐步提升至 15360,后續(xù)訓(xùn)練中保持恒定。
2.3 評估結(jié)果
下表對比了 DeepSeek-V3 與其他開源基座模型在不同任務(wù)上的表現(xiàn)。其中 DeepSeek-V3 在多數(shù)數(shù)據(jù)集上都取得了最佳性能,尤其是在數(shù)學(xué)與代碼相關(guān)的任務(wù)中表現(xiàn)突出。
需特別說明,得益于本系列文章中介紹的各項創(chuàng)新技術(shù),DeepSeek-V3 的優(yōu)異性能是在極高的訓(xùn)練效率下實現(xiàn)的。具體而言,DeepSeek-V3 每訓(xùn)練 1T token 僅需 180K H800 GPU hours,遠低于訓(xùn)練 72B 或 405B 稠密模型的成本。
文獻[2]中的表 3
文獻 [2] 還通過全面的消融實驗驗證了無輔助損失函數(shù)的負載均衡、多詞元預(yù)測等關(guān)鍵技術(shù)。由于我們已在前文中討論過相關(guān)內(nèi)容,此處不再贅述。
03 總結(jié)
本文探討了 DeepSeek-V3 預(yù)訓(xùn)練策略中的關(guān)鍵創(chuàng)新,旨在提升效率、可擴展性與性能。由此產(chǎn)生的 DeepSeek-V3-Base 模型成為更高級推理模型(如 DeepSeek-R1-Zero 和 DeepSeek-R1)的基礎(chǔ),而這些模型又通過知識蒸餾反哺優(yōu)化 DeepSeek-V3。
除此前討論的架構(gòu)創(chuàng)新 —— 多頭潛在注意力(Multi-head Latent Attention)、DeepSeekMoE、無輔助損失函數(shù)的負載均衡及多詞元預(yù)測(Multi-token Prediction)外,本文還引入了包括 document packing、Fill-in-the-Middle(FIM)和基于 YaRN 的長上下文窗口擴展在內(nèi)的多項技術(shù)。
這些技術(shù)共同推動了大語言模型效率與可擴展性邊界的突破,為高性能 AI 模型設(shè)立了新標(biāo)桿。
參考文獻
[1] DeepSeek(??https://www.deepseek.com/)??
[2] DeepSeek-V3 Technical Report(??https://github.com/deepseek-ai/DeepSeek-V3/blob/main/DeepSeek_V3.pdf)??
[3] Fewer Truncations Improve Language Modeling(??https://arxiv.org/abs/2404.10830)??
[4] Efficient Training of Language Models to Fill in the Middle(??https://arxiv.org/abs/2207.14255)??
[4] DeepSeek-Coder: When the Large Language Model Meets Programming — The Rise of Code Intelligence(??https://arxiv.org/abs/2401.14196)??
[5] DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence(??https://arxiv.org/abs/2406.11931)??
[6] YaRN: Efficient Context Window Extension of Large Language Models(??https://arxiv.org/abs/2309.00071)??
[7] DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models(??https://arxiv.org/abs/2402.03300)??
[8] DeepSeek LLM: Scaling Open-Source Language Models with Longtermism(??https://arxiv.org/pdf/2401.02954)??
[9] DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model(??https://arxiv.org/abs/2405.04434)??
[10] Language Models are Unsupervised Multitask Learners(??https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf)??
Thanks for reading!
Hope you have enjoyed and learned new things from this blog!
About the author
Shirley Li
I am a Machine Learning Engineer working on building multi-modality models to solve real-world problems.
END
本期互動內(nèi)容 ??
?當(dāng)前位置編碼方案(RoPE/YaRN)已支持 128K 上下文,但人類書籍平均長度約 200K tokens。要實現(xiàn)真正無損的長文檔理解,您認為下一代位置編碼需要突破哪些理論瓶頸?
原文鏈接:
??https://medium.com/data-science-collective/deepseek-explained-5-deepseek-v3-base-86c078ed5504??
