據(jù)工程到模型部署的實戰(zhàn)指南)
1. 從零開始大模型訓練的整體流程圖景大模型訓練是過去幾年我對深度學習認知被顛覆最徹底的一件事。早些年做 CV 或者傳統(tǒng) NLP 模型訓練流程大體是收集數(shù)據(jù) - 清洗 - 打標簽 - 訓練 - 調(diào)參 - 評估一個小的團隊甚至一個人就能搞定。但到了大模型時代事情完全變了數(shù)據(jù)規(guī)模從 GB 級跳到 TB 級模型參數(shù)從百萬級跳到千億級分布式訓練從加分項變成了必選項甚至訓練本身也從一個單純的技術(shù)問題變成了一個涉及工程、算法、數(shù)據(jù)、算力管理的復合問題。我見過不少第一次接觸大模型訓練的人一上來就盯著某個 Loss 曲線或者某篇論文的模型架構(gòu)結(jié)果折騰了很久模型就是不收斂或者收斂了但效果遠不如預期。根本原因往往不是某個環(huán)節(jié)做錯了而是對整個訓練流程缺乏全局認知。大模型訓練本質(zhì)是一條完整流水線任何一個環(huán)節(jié)掉鏈子后續(xù)所有工作都白費。這篇文章我想從一個踩過不少坑的從業(yè)者的角度把大模型訓練的完整流程拆開講清楚。從業(yè)務目標定義、數(shù)據(jù)工程到預訓練、后訓練、對齊再到評估和部署盡量把每個環(huán)節(jié)中為什么要這樣做、常見坑在哪里、我自己會怎么操作都講明白。無論你是正準備入行大模型方向的學生、剛接手大模型訓練任務的工程師還是需要在團隊中統(tǒng)籌訓練項目的技術(shù)負責人這篇文章應該都能給你一個相對完整的參考框架。先給一個整體視圖。大模型訓練流程通常分為以下幾個大的階段需求與可行性分析搞清楚要訓練什么樣的模型、解決什么問題、有多少資源預算。數(shù)據(jù)工程包括數(shù)據(jù)采集、清洗、去重、配比、格式化這一階段往往被低估但影響巨大。預訓練Pre-training在大規(guī)模無標注數(shù)據(jù)上進行自監(jiān)督學習讓模型獲得語言理解和生成的基礎(chǔ)能力。后訓練 / 繼續(xù)訓練Continual Pre-training 或者領(lǐng)域適配在通用預訓練基礎(chǔ)上用領(lǐng)域數(shù)據(jù)或者特定任務數(shù)據(jù)繼續(xù)訓練。對齊Alignment通過 SFT監(jiān)督微調(diào)、RLHF基于人類反饋的強化學習/ DPO直接偏好優(yōu)化等方式讓模型符合人類的指令和偏好。評估與迭代從自動指標到人工評估再到實際場景測試發(fā)現(xiàn)短板并決定下一輪迭代方向。部署與運維模型壓縮、推理優(yōu)化、服務化、監(jiān)控和持續(xù)更新。這個流程每個階段之間都不是孤立的。比如預訓練階段數(shù)據(jù)配比如果做得不好后面對齊階段再怎么調(diào)也難以彌補對齊階段如果只刷榜單指標部署上線后大概率會被用戶吐槽腦子有坑。所以我把這整條流水線當成一個系統(tǒng)工程來講而不是只講某個單點技術(shù)。2. 起始階段目標定義與資源評估2.1 先搞清楚一個核心問題很多團隊一上來就想訓練一個大模型但真正應該先回答的問題是這個模型到底用來干什么這不是廢話。同樣的訓練流程目標不同方案差別巨大。舉個例子。如果目標是一個通用對話助手那么預訓練階段要盡可能多地獲取多樣化的公開語料對齊階段重點是有用、誠實、無害三原則如果目標是一個垂直領(lǐng)域模型比如法律或者醫(yī)療問答那么預訓練階段的高質(zhì)量領(lǐng)域語料配比就要大幅提高甚至在預訓練之后還得做領(lǐng)域繼續(xù)訓練如果目標只是讓一個開源模型具備某個特定任務的解決能力比如信息抽取或者文本分類那么根本不需要從零預訓練直接基于成熟底座做 SFT 或者參數(shù)高效微調(diào)LoRA、QLoRA就夠了。我把這個大模型訓練流程拆成三個層級方便不同場景對號入座從零預訓練需要 TB 級數(shù)據(jù)、數(shù)百甚至上千張 GPU、以月為單位的訓練時間適用于通用底座或者某些需要徹底掌控數(shù)據(jù)分布的場景。基于現(xiàn)有底座繼續(xù)預訓練需要百 GB 級領(lǐng)域數(shù)據(jù)、數(shù)十張 GPU適用于領(lǐng)域適配成本相對可控?;诂F(xiàn)有底座做對齊/微調(diào)需要 MB 到 GB 級標注數(shù)據(jù)、單機多卡甚至單卡就能跑適用于具體任務適配這也是絕大多數(shù)團隊的實際選擇。做這個判斷的另一個關(guān)鍵因素是算力預算。從零預訓練一個 7B 參數(shù)的模型在消費級 GPU 上基本是遙不可及的即便是 A100/H100 集群也需要認真估算訓練時間和成本。如果用 8 張 A10080G訓練一個 7B 模型大約需要 1-2 周左右取決于數(shù)據(jù)量、序列長度和優(yōu)化器配置但如果想把模型規(guī)模推到 70B同樣數(shù)據(jù)量下訓練時間可能要翻 5-10 倍。這些數(shù)字在我實際項目中都是反復核算過的算力評估做不準后面整個項目節(jié)奏都會被打亂。2.2 數(shù)據(jù)規(guī)模與模型規(guī)模的匹配這里有一個被我反復驗證過的經(jīng)驗模型規(guī)模和訓練數(shù)據(jù)規(guī)模需要同步增長不能只漲參數(shù)不漲數(shù)據(jù)。早期的 GPT-2 大約 1.5B 參數(shù)用的訓練數(shù)據(jù)只有 40GB 左右到了 GPT-3 是 175B 參數(shù)訓練數(shù)據(jù)到了 570GB 左右。后來業(yè)界普遍采用 Chinchilla 法則也叫 Hoffman 法則來估算對于給定的算力預算模型參數(shù)量與訓練 token 數(shù)應該等比增長。簡單說模型越大每個參數(shù)需要看到的訓練數(shù)據(jù)越多不能指望小數(shù)據(jù)量強行壓出大模型。我自己在項目里做數(shù)據(jù)規(guī)模評估時會先確定目標參數(shù)量再按大約每 1B 參數(shù)需要 10B-20B token 的數(shù)據(jù)量來粗估。當然這個數(shù)字不是絕對的數(shù)據(jù)質(zhì)量越高、領(lǐng)域越聚焦所需要的 token 數(shù)可以適當下調(diào)。但如果你發(fā)現(xiàn)某個大模型訓練項目只準備了幾個 GB 的數(shù)據(jù)就要開始訓 7B 模型那基本可以斷定這個項目的數(shù)據(jù)規(guī)模是不健康的訓練出來的模型大概率會欠擬合。2.3 確定訓練策略的四張表在動手寫訓練代碼之前我會先列四張表幫助團隊對齊目標和資源表名關(guān)鍵內(nèi)容作用目標能力表模型要具備哪些能力、在哪些場景使用、效果如何度量決定數(shù)據(jù)配比和評估方案資源預算表GPU 型號和數(shù)量、可用內(nèi)存、訓練時長上限、預算金額決定模型規(guī)模、優(yōu)化器和并行策略數(shù)據(jù)清單表數(shù)據(jù)來源、格式、體量、質(zhì)量等級、去重狀態(tài)決定訓練 pipeline 設(shè)計風險登記表數(shù)據(jù)合規(guī)風險、訓練不穩(wěn)定風險、評估指標與目標偏差風險決定何時需要人工干預這四張表看起來簡單但實際做的時候往往能提前暴露很多問題。比如我經(jīng)歷過一個項目最初團隊想在 2 周內(nèi)跑完一個 7B 模型的從零預訓練但資源預算表列出來后發(fā)現(xiàn)只有 4 張 4090這根本不可能完成于是及時調(diào)整策略改為基于現(xiàn)有底座做領(lǐng)域繼續(xù)預訓練最后用 1 周左右就達到了可用狀態(tài)。如果沒有提前做資源評估項目很可能在訓練跑到一半時才被迫中止損失慘重。3. 數(shù)據(jù)工程大模型訓練的隱形基石3.1 數(shù)據(jù)采集源頭數(shù)據(jù)是大模型訓練的燃料這話我已經(jīng)說過無數(shù)遍但還是要再強調(diào)一次很多訓練項目的失敗不是模型不行而是數(shù)據(jù)不行。數(shù)據(jù)工程在大模型整個訓練流程中占的工作量通常超過 50%但也是最容易被壓縮、被輕視的環(huán)節(jié)。數(shù)據(jù)采集有幾個主要來源公開爬蟲數(shù)據(jù)Common Crawl、網(wǎng)頁快照等規(guī)模大但噪聲高。開源數(shù)據(jù)集如 OSCAR、RedPajama、The Pile 等已經(jīng)被清洗過一輪但仍然需要自己的進一步處理。領(lǐng)域?qū)S袛?shù)據(jù)比如法律文書、醫(yī)學論文、代碼倉庫、企業(yè)內(nèi)部知識庫質(zhì)量高但往往體量有限。用戶生成數(shù)據(jù)產(chǎn)品中的用戶行為日志、反饋數(shù)據(jù)等需要格外注意隱私合規(guī)。我在具體項目中會把數(shù)據(jù)來源按體量-質(zhì)量四象限來評估爬蟲類數(shù)據(jù)體量大但質(zhì)量低適合作為預訓練的基礎(chǔ)語料開源數(shù)據(jù)集質(zhì)量中等可以混入一定比例領(lǐng)域數(shù)據(jù)和人工標注數(shù)據(jù)質(zhì)量高適合在對齊和領(lǐng)域適配階段重點使用。這個配比策略在后面數(shù)據(jù)混合階段會詳細講。3.2 清洗與過濾你偷懶模型就會變笨原始數(shù)據(jù)永遠不可能是干凈的。網(wǎng)頁爬蟲數(shù)據(jù)里充斥著 HTML 標簽、導航欄文本、廣告、亂碼、重復段落如果直接用這些數(shù)據(jù)去訓練模型會學到大量無意義的模式。我在實操中有一套固定的清洗流程解碼與編碼修復處理編碼錯誤、亂碼、無效字符。標簽與噪音去除去掉 HTML、CSS、JavaScript 等網(wǎng)頁元素保留正文文本。語言識別與過濾用語言識別工具判斷語種過濾不需要的語言。低質(zhì)量文本過濾通過長度分布、重復度、符號占比、困惑度等特征過濾掉質(zhì)量過低的文本。個人信息脫敏識別并移除郵箱、電話、身份證號等敏感信息。毒性內(nèi)容過濾用違規(guī)詞表分類模型過濾涉政、涉黃、暴力等違規(guī)內(nèi)容。其中毒性內(nèi)容過濾這一環(huán)節(jié)在實際工程里必須嚴格把關(guān)。作為從業(yè)者這是內(nèi)容安全和合規(guī)的底線要求沒有任何商量余地。我建議團隊在數(shù)據(jù)管線中把這類過濾模塊當成一等公民而不是事后補救。清洗過程中還要注意一個細節(jié)過濾規(guī)則不能太激進。如果過濾閾值設(shè)得過高會把大量包含方言、口語、代碼片段、混合語言、特殊格式的高價值數(shù)據(jù)也一并刪掉。比如一些技術(shù)論壇的帖子本身包含 HTML 標簽但正文可能有極高質(zhì)量的排錯經(jīng)驗。所以我的經(jīng)驗是采用多級過濾策略先用規(guī)則粗過濾掉明顯的垃圾再用分類模型做細粒度質(zhì)量打分最后根據(jù)下游任務的需要做人工抽檢。每一步過濾都要保留過濾日志方便后面回溯數(shù)據(jù)分布變化。3.3 去重一個經(jīng)常被忽略的隱形指標很多人對數(shù)據(jù)去重的理解就是去掉完全重復的文本但在大模型訓練中去重不僅是去掉完全重復更重要的是去掉近似重復Near-duplicate。比如同一篇新聞稿被不同網(wǎng)站轉(zhuǎn)載內(nèi)容幾乎一致但可能被加了一兩句評論同一個維基詞條在不同時間被保存了多個版本。如果不做近似去重模型會反復見到同樣的內(nèi)容造成記憶過擬合——它可能把某些語料背下來而不是理解。實操中我用過兩類去重方法精確去重對文本做哈希如 MD5、SHA1先存哈希表再去重適合完全重復的文本。近似去重用 MinHash 或 SimHash 做近似重復檢測配合 LSH局部敏感哈希在百萬級/億級數(shù)據(jù)中快速找到近似重復文本。這類方法對長文本和短文本都很有效。近似去重這塊我實際踩過坑。有一次訓練領(lǐng)域模型線上語料庫看起來很大但做 MinHash 去重后發(fā)現(xiàn)真正獨一無二的高質(zhì)量語料只占不到 60%。剩下的 40% 都是各種轉(zhuǎn)載、重復、拼接內(nèi)容。如果不做這一步模型在領(lǐng)域任務上會出現(xiàn)明顯的重復生成問題——這其實就是訓練數(shù)據(jù)中近似重復比例過高導致的。所以我現(xiàn)在把去重環(huán)節(jié)放在數(shù)據(jù) pipeline 的固定流程里絕不在這一步省算力。3.4 數(shù)據(jù)配比決定模型偏好的關(guān)鍵設(shè)計數(shù)據(jù)配比是指在預訓練語料中不同類型數(shù)據(jù)的比例如何設(shè)置。常用的基礎(chǔ)配比方案是按類別分開網(wǎng)頁文本、百科、書籍、代碼、論文、對話等。為什么要特別重視配比因為模型的能力結(jié)構(gòu)很大程度上是數(shù)據(jù)分布塑造的。如果代碼數(shù)據(jù)占比過低模型幾乎不會有代碼能力如果對話數(shù)據(jù)占比過高預訓練階段可能過早產(chǎn)生對話化傾向但通用知識不足后面對齊很難補。數(shù)據(jù)配比要做的是既讓模型在通用知識上有一個寬廣的基礎(chǔ)又在關(guān)鍵的領(lǐng)域能力上給予足夠多的示例。我在實操中的配置思路大致是網(wǎng)頁文本 50%-60%書籍和百科 15%-20%代碼 10%-15%論文/技術(shù)文檔 5%-10%對話/指令類數(shù)據(jù) 5% 以下。同時為了控制不同類別數(shù)據(jù)的采樣頻率我通常會在每個 epoch 中做數(shù)據(jù)加權(quán)采樣而不是簡單的拼接。具體做法是給每個數(shù)據(jù)源設(shè)計一個采樣權(quán)重權(quán)重越大這個數(shù)據(jù)源在每輪訓練中被抽中的概率越高。這樣可以讓高質(zhì)量的數(shù)據(jù)被更充分地利用同時控制整體 token 數(shù)。數(shù)據(jù)配比不是一次性定死的它需要根據(jù)模型的評估結(jié)果進行反向調(diào)整。比如你發(fā)現(xiàn)模型代碼能力嚴重不合格可以增大代碼數(shù)據(jù)的采樣權(quán)重重新訓練一個 checkpoint發(fā)現(xiàn)模型在某個領(lǐng)域知識上表現(xiàn)太弱可能是領(lǐng)域數(shù)據(jù)量不足或者權(quán)重過低。在實際項目中我會在預訓練階段同時保留多份 checkpoint方便在調(diào)數(shù)據(jù)配比時快速回退。3.5 數(shù)據(jù) Tokenization 與打包數(shù)據(jù)清洗做完之后還需要把文本轉(zhuǎn)成模型能處理的 token 序列。這一步最常見的工具是 Hugging Face Tokenizers 庫和 SentencePiece。需要自己訓練 tokenizer 的場景不多絕大多數(shù)情況下直接用底座模型的詞表即可。但如果你要訓練一個垂直領(lǐng)域模型且領(lǐng)域中有大量術(shù)語、特殊符號、代碼結(jié)構(gòu)那么擴展詞表或者訓練一個領(lǐng)域適配的 tokenizer 是值得考慮的。序列打包方面有一個常被忽略的細節(jié)在預訓練時一般不會按句子切分而是按固定長度如 2048、4096 或 8192 token從語料中連續(xù)切分。切分時要保證一個語義單元比如一篇文章盡量不被切斷。通常做法是先將文檔按長度排序然后貪心打包到序列中文檔之間放入一個特殊分隔符如 EOS 或特殊段落符。這樣既避免短文檔造成大量 padding 浪費又盡量保持了文檔的結(jié)構(gòu)完整性。我見過有的新手直接按 token 數(shù)硬切結(jié)果一篇文檔被切成兩半前一半出現(xiàn)在序列 A 的末尾后一半出現(xiàn)在序列 B 的開頭這種割裂的數(shù)據(jù)會影響模型的長期依賴建模能力。4. 預訓練大規(guī)模自監(jiān)督學習的關(guān)鍵環(huán)節(jié)4.1 從零預訓練 vs 繼續(xù)預訓練預訓練是整個大模型訓練流程中算力消耗最大、耗時最長、工程復雜度最高的階段。如果你是從零開始預訓練模型權(quán)重完全隨機初始化然后在大規(guī)模無標注語料上進行自監(jiān)督學習。這里的自監(jiān)督目標通常有兩種主要形式自回歸語言建模Causal LM給定前文預測下一個 token。這是 GPT 系列的做法也是當前大多數(shù)大模型底座的基礎(chǔ)。掩碼語言建模Masked LM隨機掩蓋一部分 token讓模型根據(jù)上下文預測被掩蓋的內(nèi)容。這是 BERT 系列的做法更適合理解類任務。對于大多數(shù)實際項目我更推薦的是繼續(xù)預訓練也就是在現(xiàn)有開源底座基礎(chǔ)上用領(lǐng)域語料繼續(xù)訓練。這有幾個明顯優(yōu)勢不需要投入天量數(shù)據(jù)和算力去做通用能力奠基能保留底座已有的語言理解能力、推理能力、世界知識領(lǐng)域語料不足時仍然可以做出效果不錯的垂直模型訓練時長通常只有從零預訓練的 1/10 甚至更少。繼續(xù)預訓練雖然省力但要注意一個風險如果領(lǐng)域語料和通用語料差異過大或者訓練超參設(shè)置不當可能導致災難性遺忘模型原有的通用能力反而下降。我在做繼續(xù)預訓練時會在訓練數(shù)據(jù)里混入一定比例的通用語料比如 20%-30%同時用小學習率并且在評估時同時監(jiān)測通用任務和領(lǐng)域任務指標確保只有漲沒有跌。4.2 訓練超參選擇背后的邏輯預訓練階段最核心的幾個超參是學習率、batch size、序列長度、訓練步數(shù)、warmup 步數(shù)。這些參數(shù)之間不是獨立的它們共同決定了訓練的穩(wěn)定性、收斂速度和最終效果。學習率在預訓練中通常采用的策略是先做一段 warmup把學習率從接近 0 線性升到峰值然后按照余弦退火調(diào)度逐漸降到最小。warmup 的作用是讓模型在訓練初期避免因為過大的更新步長導致 Loss 震蕩甚至發(fā)散。峰值學習率我一般根據(jù)模型規(guī)模和 batch size 來定經(jīng)驗范圍在 1e-4 到 3e-4 之間。7B 級模型我用過 2e-4 配 4M tokens 的 batch size效果不錯13B 級模型會降到 1.5e-4 左右。Batch size 在預訓練中通常會設(shè)得很大這和大模型訓練的同步方式有關(guān)系。現(xiàn)在主流做法是用梯度累積把多個 micro-batch 的梯度累加后統(tǒng)一更新等效 batch size 經(jīng)常是 512 甚至 1024 以上。大 batch 的好處是訓練效率高梯度估計更穩(wěn)定。但 batch size 太大也可能導致收斂變慢需要在學習率上做出相應調(diào)整——這就是所謂的學習率與 batch size 聯(lián)動原則。簡單說batch size 換成 2 倍學習率通常也要相應調(diào)大一點前提是 loss 還能保持穩(wěn)定。序列長度對訓練的影響也很直接序列越長模型能建模的上下文越長但顯存占用呈線性甚至平方增長訓練速度也會明顯下降。我見過有人在 8 卡環(huán)境下直接把序列長度拉到 8192結(jié)果 OOM 不斷步進極慢。正確的做法一般是先用短序列如 2048啟動訓練穩(wěn)定后在訓練中段再切換到長序列?,F(xiàn)在很多框架已經(jīng)支持動態(tài)序列長度可以在 training 過程中逐步加長。訓練步數(shù)則取決于數(shù)據(jù)量和 batch size。一個 epoch 定義成模型完整看過一遍全部數(shù)據(jù)但實際中很少真的訓滿一個 epoch因為預訓練數(shù)據(jù)量通常巨大訓一個 epoch 的成本太高。常見做法是設(shè)置一個目標 token 數(shù)比如總共看 200B token 就停下然后根據(jù) batch size 和序列長度反推步數(shù)。步數(shù) 目標 token 數(shù) ÷batch size × 序列長度。4.3 并行策略從單卡到千卡大模型訓練幾乎一定會遇到顯存裝不下整個模型的情況。以 7B 模型為例僅模型權(quán)重 FP16 就有 14GB加上優(yōu)化器狀態(tài)Adam 優(yōu)化器需要額外保存一階動量、二階動量、梯度總顯存需求往往接近 100GB一張 A100 80G 都裝不下。所以必須用分布式并行策略。常用的并行方式有四種我按自己實際項目中的應用頻率排序數(shù)據(jù)并行DP每張卡持有一份完整模型副本喂不同的數(shù)據(jù)通過 all-reduce 同步梯度。這是最先考慮的方案實現(xiàn)簡單適合模型能裝進單卡的場景。張量并行TP把單個 transformer 層的參數(shù)切分到多張卡每張卡只算一部分。比如把自注意力頭的矩陣切開分給多卡計算。7B 模型在單卡裝不下時通常用 TP2 或 TP4。流水線并行PP把模型的不同層切分到不同設(shè)備數(shù)據(jù)按層順序流動。比如 32 層 transformer 分成 4 段每段 8 層放在一張卡上。缺點是存在流水線氣泡bubble設(shè)備利用率會受影響。上下文并行 / 序列并行SP在序列維度上切分常用于超長序列訓練。在小型集群上8-32 卡我通常的組合是數(shù)據(jù)并行 張量并行必要時加流水線并行。在真實項目里7B 模型用 8 卡 A100 配 TP2、DP4 能跑得比較舒服13B 模型用 16 卡配 TP4、DP4 比較穩(wěn)70B 模型需要 64 卡以上TP8、PP4 的組合比較常見。這些數(shù)字不是死的需要根據(jù)模型結(jié)構(gòu)和顯存實測來調(diào)整。現(xiàn)在很多框架已經(jīng)幫我們封裝好了這些并行策略。我常用的包括 DeepSpeedZeRO 系列優(yōu)化、Megatron-LM、PyTorch FSDP以及 Hugging Face 生態(tài)的 Accelerate。如果你沒有特殊理由建議先基于這些成熟框架搭建而不是自己造輪子。自己造分布式訓練框架的坑太多了——通信瓶頸、死鎖、顯存碎片、checkpoint 不一致每一個都夠你折騰一星期。4.4 混合精度與 Loss Scale大模型訓練如果不做混合精度Mixed Precision基本沒法在合理成本內(nèi)完成。混合精度指的是在訓練過程中用 FP16 或 BF16 來表示部分張量以降低顯存占用和計算開銷。目前主流偏好是 BF16因為它比 FP16 有更大的指數(shù)范圍和更少的下溢問題在梯度更新時更穩(wěn)。用 FP16 訓練時需要注意 Loss Scaling——因為 FP16 的表示范圍有限如果梯度太小可能會直接下溢為 0導致模型不更新。通常做法是動態(tài)調(diào)整 loss scale當梯度溢出時減小 loss scale當連續(xù)若干步?jīng)]有溢出時增大 loss scale。BF16 則基本不需要這個機制省心不少。不過即使是 BF16訓練久了也會出現(xiàn)loss spike或者loss 突刺的現(xiàn)象——某個 step 的 loss 突然飆到正常值的幾十倍甚至上百倍然后逐漸恢復。這種情況我遇到過好幾次最常見的原因是出現(xiàn)了 NAN 或者 Inf 梯度通常和數(shù)據(jù)中的異常 token、嵌入層溢出有關(guān)。處理辦法是設(shè)置梯度裁剪gradient clipping一般把梯度的 L2 范數(shù)裁剪到 1.0 或 0.5。此外在 PyTorch 中打開 detect anomaly 來定位問題源也是有效的排查手段但這種模式下訓練會慢很多只能作為臨時排查手段。4.5 Checkpoint 策略與中途故障恢復預訓練動輒幾周甚至幾個月中途宕機幾乎是必然事件。所以 checkpoint 策略必須從一開始就想清楚而不是等出事后再補救。我的做法是每訓練固定步數(shù)比如 500 或 1000 步保存一次 checkpoint同時維護最好和最新兩份。最好的一份是在評估集上 loss 最低的那版最新的一份用于故障恢復。保存的內(nèi)容包括模型權(quán)重、優(yōu)化器狀態(tài)、學習率調(diào)度器狀態(tài)、數(shù)據(jù)加載器狀態(tài)隨機種子和索引這樣才能保證從斷點無縫恢復訓練。如果只保存模型權(quán)重而不保存優(yōu)化器狀態(tài)恢復后學習率調(diào)度會亂掉訓練曲線也會出現(xiàn)明顯的斷層。此外我強烈建議在訓練啟動時先在少量數(shù)據(jù)上做 smoke test冒煙測試確認從本輪 epoch 的起始狀態(tài)到訓練循環(huán)、再到 checkpoint 保存和恢復的整條鏈路是通的再正式投入長訓練。這個習慣幫我避免過很多次跑了 3 天發(fā)現(xiàn)代碼里有個 bug 導致全部白跑的慘劇。5. 后訓練與對齊從會續(xù)寫到聽人話5.1 SFT——教模型學會指令跟隨預訓練完成后的模型本質(zhì)上是一個文本續(xù)寫器。你給它一句給我寫一封郵件它可能會繼續(xù)寫給我寫一封郵件的內(nèi)容如下而不是真的給你寫一封郵件。要讓模型學會按照人類的指令行事就需要 SFTSupervised Fine-Tuning即用指令-回答這樣的監(jiān)督數(shù)據(jù)對模型進行有監(jiān)督微調(diào)。SFT 的數(shù)據(jù)質(zhì)量是重中之重。我之前在項目中反復體會到一個道理SFT 的成敗 80% 取決于數(shù)據(jù)而不是模型結(jié)構(gòu)和訓練技巧。那些公開的 SFT 數(shù)據(jù)集比如一些開源 instruction 數(shù)據(jù)集可以用但它們往往泛化性不夠領(lǐng)域任務效果不好。真正高質(zhì)量的 SFT 數(shù)據(jù)需要從實際業(yè)務場景中積累、篩選和人工編寫。我在構(gòu)造 SFT 數(shù)據(jù)時遵循幾條原則指令多樣覆蓋不同的表達方式、不同的任務類型問答、寫作、分類、抽取、總結(jié)等?;卮鹪攲嵡艺_每條回答都要經(jīng)過人工校驗或強模型輔助校驗不能有明顯的錯誤。難度適中既要有簡單的示例讓模型快速學會格式也要有復雜的示例讓模型學會推理。控制數(shù)量SFT 數(shù)據(jù)不一定越多越好。經(jīng)驗表明幾萬到幾十萬條高質(zhì)量 SFT 數(shù)據(jù)往往比幾百萬條低質(zhì)量數(shù)據(jù)效果更好。我在一個垂直領(lǐng)域項目中用了大約 5 萬條人工校驗過的 SFT 數(shù)據(jù)效果就明顯好于之前用 50 萬條自動構(gòu)造的低質(zhì)數(shù)據(jù)。SFT 訓練本身相對簡單通常就是標準的因果語言建模訓練但有幾個細節(jié)需要注意。一是學習率不能太高一般取 1e-5 到 2e-5 左右因為預訓練模型已經(jīng)有足夠能力微調(diào)太多容易破壞原有參數(shù)分布二是訓練輪數(shù)不要太多2-3 個 epoch 就夠訓練太久容易過擬合訓練集導致模型在評估集上表現(xiàn)下降三是在訓練數(shù)據(jù)里可以混入一些通用指令數(shù)據(jù)避免模型只在新任務上表現(xiàn)好、在通用能力上退化。5.2 RLHF 與 DPO——讓模型符合人類偏好SFT 只是讓模型學會了按照指令給出回答但什么樣的回答更符合人類期望這個標準SFT 并不擅長。這時候就需要偏好對齊。目前主流方法有兩種RLHF基于人類反饋的強化學習和 DPO直接偏好優(yōu)化。RLHF 的流程大致是三步訓練一個獎勵模型Reward Model基于人類對多個回答的排序/打分數(shù)據(jù)訓練一個模型來預測哪個回答更好。用強化學習優(yōu)化策略模型讓策略模型生成回答獎勵模型打分通過 PPO 等算法優(yōu)化策略模型的參數(shù)使期望獎勵最大化。在優(yōu)化過程中加入?yún)⒖寄P图s束通常用 KL 散度懲罰防止策略模型為了刷獎勵而偏離原始模型太遠導致輸出胡言亂語。RLHF 效果挺好但是工程復雜度很高。PPO 訓練中的穩(wěn)定性問題、獎勵模型的過擬合問題、KL 系數(shù)的調(diào)節(jié)問題任何一個處理不好都會讓訓練崩潰或者產(chǎn)生非常奇怪的模型行為。我剛開始實踐 RLHF 時多次遇到獎勵模型的 loss 明明在下降但策略模型的生成質(zhì)量卻在惡化——這是因為策略模型在鉆獎勵模型的空子找到了高獎勵但實際很差的回答模式。解決方法是加強 KL 約束和獎勵模型的多樣性并且在訓練中定期人工評估真實生成質(zhì)量。DPO 是近年來特別火的替代方案。它的核心思路是不需要訓練獎勵模型也不需要強化學習而是直接通過偏好數(shù)據(jù)構(gòu)造一個簡單的對比損失函數(shù)來優(yōu)化策略模型。具體做法是對于一個提示收集被偏好的回答和被拒絕的回答然后直接用語言模型自身的概率來構(gòu)造損失讓被偏好回答的概率提升、被拒絕回答的概率下降。DPO 相比 RLHF 最大的優(yōu)勢是簡單穩(wěn)定訓練資源消耗也低得多。在一些中等規(guī)模模型的實踐中DPO 的效果可以和 RLHF 媲美甚至某些場景下更好。我做對齊時的一般策略是如果團隊里有人熟悉強化學習且預算充足可以先跑 RLHF如果想快速看到一個可用的對齊模型DPO 是性價比更高的選擇。很多情況下我會先用 DPO 快速迭代出一個 baseline等產(chǎn)品驗證了方向再決定是否用 RLHF 做進一步打磨。5.3 對齊訓練中的常見策略與踩坑點對齊階段最常見的錯誤是過擬合到獎勵模型或者對著榜單指標猛優(yōu)化。我先說榜單指標的問題。很多團隊在對齊之后喜歡看一些公開 benchmark 的分數(shù)比如 MMLU、HumanEval、GSM8K然后試圖通過調(diào)數(shù)據(jù)、調(diào)超參來刷高這些分數(shù)。但刷榜分數(shù)和真實產(chǎn)品體驗往往存在偏差。我在實際項目中見過一個模型在某個公開 benchmark 上分數(shù)很高但用戶一用就發(fā)現(xiàn)它在邏輯推理上存在明顯缺陷——原因就是 benchmark 中的測試題在 SFT 階段就已經(jīng)被泄露進訓練數(shù)據(jù)了。這是嚴重的合規(guī)問題也違背了做對齊的初衷。所以我堅持在內(nèi)部評估中使用完全獨立的測試集并且定期從實際用戶反饋中構(gòu)造新的評測樣本防止評估集被污染。再看 RLHF 訓練本身的穩(wěn)定性問題。PPO 對超參非常敏感我踩過最大的坑是初始 KL 懲罰系數(shù)設(shè)置太小導致策略模型肆意偏離參考模型最后輸出內(nèi)容變得非常碎、非???。另一個坑是 reward model 訓練時只用了一種類型的偏好數(shù)據(jù)導致它對某些 prompt 的分數(shù)極不穩(wěn)定然后策略模型為了迎合它就出現(xiàn)了災難性的模式坍塌。我的建議是RLHF 訓練中每跑幾百步就抽一批 prompt 讓模型生成結(jié)果人工快速掃一眼不要只看 reward 曲線。reward 曲線在訓練中往往不能完全反映生成質(zhì)量。DPO 也有自己的坑。最典型的是 beta 參數(shù)控制對參考模型的偏離程度調(diào)不好。beta 太小模型容易過度擬合偏好數(shù)據(jù)導致通用能力下降beta 太大模型幾乎沒有學到任何偏好跟微調(diào)前差不多。我一般從 0.1 起步配合訓練集大小和評估結(jié)果來調(diào)。還有一個坑是偏好數(shù)據(jù)的構(gòu)造方式如果偏好數(shù)據(jù)中被拒絕的回答寫得特別差模型學到的是避免那種極端差的格式而不是提升回答質(zhì)量。所以好的偏好數(shù)據(jù)應該是兩個回答都有一定質(zhì)量但一個更優(yōu)這樣模型才能學會區(qū)分好壞而不是死記硬背地淘汰低質(zhì)回答。6. 評估與迭代訓練流程的反饋閉環(huán)6.1 評估集設(shè)計別讓評估變成走過場評估是大模型訓練流程中容易被應付了事但卻至關(guān)重要的一環(huán)。我自己做評估時會至少建立三套評估體系自動指標集在固定的測試集上計算指標比如困惑度Perplexity、BLEU翻譯、ROUGE摘要、Pass1代碼、準確率問答。這套體系方便快速迭代但它只能反映模型在某類任務上的機械能力。高質(zhì)量人工評估集從真實業(yè)務場景中采樣一批 prompt讓評估員最好是目標用戶或領(lǐng)域?qū)<覍δP偷幕卮饛臏蚀_性、相關(guān)性、流暢性、安全性等維度打分。這個耗時耗錢但最能反映真實體驗。線上 A/B 測試真正放到產(chǎn)品里對用戶反饋做埋點和分析。最終決定一個模型是否上線還是得看線上數(shù)據(jù)而不是訓練集上那點指標。很多團隊在訓練后只跑自動指標看起來分數(shù)不錯就上線了結(jié)果線上反饋一塌糊涂。原因在于自動指標對幻覺和邏輯一致性的捕捉能力非常有限。比如模型一本正經(jīng)地輸出一段包含虛構(gòu)事實的答案自動指標可能因為關(guān)鍵詞匹配而給出高分但用戶一眼就能發(fā)現(xiàn)內(nèi)容是錯的。所以在評估階段我會固定每周安排一批人工評估讓模型跑真實用戶 prompt再由兩個人獨立打分交叉驗證一致性。這個成本不低但對于保證模型質(zhì)量是必須付出的。6.2 訓練后數(shù)據(jù)反饋閉環(huán)評估完不能只是看個分數(shù)就結(jié)束關(guān)鍵是要把評估結(jié)果反饋到訓練流程中形成一個閉環(huán)。我在項目中實際使用的做法是每次評估完將典型的錯誤案例比如產(chǎn)生幻覺的回答、邏輯矛盾的推理、違反指令約束的輸出收集起來分析它們的共性然后針對性地調(diào)整下一輪訓練的數(shù)據(jù)。比如如果發(fā)現(xiàn)模型在長文檔摘要任務上表現(xiàn)差那就專門采集和構(gòu)造更多高質(zhì)量的長文檔摘要 SFT 數(shù)據(jù)再做一輪增量訓練如果發(fā)現(xiàn)模型在特定領(lǐng)域名詞上經(jīng)常出錯那就擴大該領(lǐng)域的預訓練數(shù)據(jù)權(quán)重做一輪領(lǐng)域繼續(xù)預訓練。這個反饋閉環(huán)的節(jié)奏需要控制好。訓練一輪大模型成本很高不可能每次發(fā)現(xiàn)問題都立刻重新預訓練。我的經(jīng)驗是按周或按雙周為周期把反饋數(shù)據(jù)積累到一個閾值后再觸發(fā)一輪小規(guī)模訓練。小規(guī)模訓練可以是領(lǐng)域繼續(xù)預訓練也可以是 SFT/DPO視問題類型而定。對于預訓練階段的問題可能要先積累足夠多的數(shù)據(jù)再啟動下一輪大規(guī)模預訓練而不是為了一個小問題就打亂整個訓練計劃。6.3 人情味與業(yè)務指標的平衡最后我想聊一個很多技術(shù)人容易忽略的維度模型效果的評判不能只看技術(shù)指標還要看業(yè)務指標。比如一個客服場景的模型回答得對不一定是好——用戶可能更在意回復是否禮貌、是否簡短、是否讓他感受到被理解。一個金融風控場景的對齊模型如果回答得太繞太保守可能用戶根本不愿意用。所以我在評估體系中會為每個業(yè)務場景定制業(yè)務指標比如用戶投訴率下降幅度、首輪解決率、用戶滿意度評分等。這些指標雖然不直接反映模型訓練的好與壞但對于決定項目是否繼續(xù)投入、模型能否上線往往比技術(shù)指標更有說服力。7. 部署與成本優(yōu)化訓完不等于結(jié)束7.1 模型壓縮蒸餾/量化/剪枝的取舍訓練完成的大模型在部署時通常面臨一個尷尬模型太大推理太慢顯存占用太多業(yè)務方希望 100ms 內(nèi)返回結(jié)果但大模型的推理時延動不動就超過 500ms。這時候就需要做模型壓縮。常用的手段有三種各有適用的場景知識蒸餾用一個大的教師模型剛訓練好的模型去指導一個小模型的學習讓小模型盡量逼近大模型的輸出。這個過程可以離線完成最終部署的是小模型速度快、成本低。缺點是訓練周期長且如果大小模型差距過大小模型的學習效果可能受限。我一般把小模型設(shè)定為教師模型的 1/4 到 1/8 參數(shù)量。量化把模型權(quán)重從 FP16 壓縮到 INT8 或 INT4。其中最常用的是 GPTQ 和 AWQ 這類訓練后量化方法不需要重訓模型。量化后的模型體積減小 3-4 倍推理速度明顯提升但會有一定精度損失。在垂直任務上我的經(jīng)驗是 INT8 量化對精度的影響通??煽厝鐪蚀_率下降 1% 以內(nèi)INT4 則要看具體任務有些任務下降明顯。如果對精度要求較高可以考慮量化感知訓練QAT在訓練中就讓模型適應量化誤差。剪枝去除模型中重要性較低的參數(shù)或?qū)訙p少計算量。對于大模型來說結(jié)構(gòu)化剪枝把整行/整列權(quán)重置零或者去掉某些層現(xiàn)在用得相對少因為效果不太穩(wěn)定而且大模型中的冗余似乎更結(jié)構(gòu)化不是簡單去掉參數(shù)就能保性能。我更傾向于把剪枝用在一些局部場景比如去除某些 attention head。我實際項目中最常見的壓縮組合是量化 推理優(yōu)化。比如把一個 7B 模型量化到 INT4配合 KV Cache 優(yōu)化和算子融合在單張 4090 上可以達到不錯的生成速度基本滿足交互式應用的需求。如果業(yè)務對速度要求更高但能接受延遲那么蒸餾出一個小模型可能更合適。7.2 推理服務的工程細節(jié)大模型部署和傳統(tǒng)模型的部署有不少區(qū)別某些工程細節(jié)如果不處理好線上體驗會很差。KV Cache 是自回歸生成中的一個核心概念。每生成一個新 token模型需要重新計算整個前文的鍵值向量。如果每次都從頭算計算量是平方級增長延遲高得無法接受。實踐中我們把之前計算過的 key/value 緩存下來生成新 token 時只需計算增量部分。KV Cache 的大小和序列長度、batch size、層數(shù)相關(guān)很容易占滿顯存。所以需要為它預留顯存空間并且設(shè)置合理的 max length 策略。另外一個關(guān)鍵工程細節(jié)是 batching 策略。在線推理服務通常通過連續(xù)批處理continuous batching來提升吞吐量。傳統(tǒng)靜態(tài)批處理是收集到固定 batch 就一起跑而連續(xù)批處理允許一個請求生成完了就退出 batch新的請求可以隨時插入這樣能更充分地利用 GPU 算力。我實測過連續(xù)批處理相比靜態(tài)批處理能把吞吐量提升 1.5-3 倍這在流量波動大的場景下特別重要。推理服務框架的選擇也有講究。如果只是單卡部署一個 7B 模型用 vLLM 或者 TGI 這些商業(yè)友好的框架就夠如果要部署 70B 級別模型可能就需要結(jié)合 TensorRT-LLM 或者自研服務框架做更細粒度的算子優(yōu)化和顯存管理。我的經(jīng)驗是不要一開始就想著自研推理引擎除非你有專門的基礎(chǔ)設(shè)施團隊否則基于成熟框架先跑通業(yè)務模式等量上來了再考慮深度優(yōu)化。7.3 全生命周期成本估算算力成本和訓練時間在大模型項目中是繞不開的賬。這里我給出一個非常粗略但符合實際經(jīng)驗的計算方法訓練成本 ≈ GPU 數(shù)量 × 單卡價格/小時 × 訓練時長單卡價格取決于硬件型號和采購/租賃模式。以云服務租用為例一張 A100 80G 的價格大約在每小時幾十元左右H100 會更貴一些。訓練時長可以根據(jù)模型參數(shù)量、數(shù)據(jù)量和集群性能來估算。一個 7B 模型、200B token 數(shù)據(jù)、在 32 張 A100 上的訓練時間樂觀估計也要 2-3 周。如果采用 64 卡訓練時間可以縮短到 1-2 周但 GPU 通信開銷增大加速比會略低于線性。除了訓練成本還要算上數(shù)據(jù)工程和人工評估的成本。這些往往占總預算的 30%-50%。我看到很多項目把預算幾乎全部花在 GPU 上結(jié)果數(shù)據(jù)質(zhì)量和評估質(zhì)量跟不上訓練出來的模型效果不佳最后還要返工整體成本反而更高。所以我在項目規(guī)劃時會明確地把算力預算、數(shù)據(jù)預算、人力預算三本賬分開算任何一個都不能省。8. 大模型訓練的未來方向與個人建議8.1 訓練范式的演進趨勢大模型訓練流程這幾年變化非常快。兩三年前從零預訓練還是主流話題現(xiàn)在更多討論的是如何用更少的算力、更少的數(shù)據(jù)在開源底座上做出領(lǐng)域好模型。從我的觀察看幾個比較明顯的趨勢是數(shù)據(jù)質(zhì)量權(quán)重越來越高隨著公開數(shù)據(jù)逐漸被訓完高質(zhì)量專有數(shù)據(jù)將成為真正的壁壘。未來競爭不是誰 GPU 多而是誰擁有的高質(zhì)量數(shù)據(jù)多、數(shù)據(jù)處理 pipeline 更先進。對齊技術(shù)越來越多樣化除了 SFT、RLHF、DPO基于自對弈、基于搜索的在線對齊等方法也在迅速發(fā)展。但本質(zhì)上的核心仍然是一致的讓模型輸出更加符合人類意圖。多模態(tài)和長上下文成為新挑戰(zhàn)訓練框架需要適配圖像、視頻、音頻、代碼等混合模態(tài)數(shù)據(jù)同時序列長度從 2K 增長到 1M 甚至更長分布式策略和內(nèi)存管理都需要重新設(shè)計。小型化部署成為落地關(guān)鍵大模型訓練完成后如何壓縮、加速、部署到邊緣設(shè)備或者有限的云資源上將決定產(chǎn)品能否真正規(guī)?;?。這些趨勢對從業(yè)者的啟示是不要只盯著某一個模型架構(gòu)或者某個訓練技巧要建立全流程工程化的思維方式理解每個環(huán)節(jié)的演進方向這樣才能在快速變化的環(huán)境中做出合理的決策。8.2 給新手的三個可操作建議如果你是一個正準備進入大模型訓練方向的開發(fā)者我的建議是三句話先跑通小規(guī)模閉環(huán)再上大規(guī)模訓練。先用一個小模型比如 0.5B-1B 參數(shù)在一個中等規(guī)模數(shù)據(jù)集幾 GB 到幾十 GB上跑通從數(shù)據(jù)預處理、訓練、評估到部署的完整鏈路。這個過程會讓你對大模型訓練成本、數(shù)據(jù)分布、超參影響形成真實的體感。讀懂 Loss 曲線比看懂論文更重要。訓練過程中l(wèi)oss 曲線的形態(tài)能告訴你大量信息欠擬合曲線是緩慢下降但有明顯余量過擬合曲線是驗證集 loss 反彈不穩(wěn)定訓練會出現(xiàn)尖刺或者震蕩。學會讀懂這些曲線你就能快速判斷一個訓練任務是否正常。把數(shù)據(jù)工程當成一項長期投資。很多新手覺得數(shù)據(jù)工作枯燥更愿意花時間調(diào)模型或者看論文。但真正拉開訓練效果差距的恰恰是數(shù)據(jù)。我強烈建議每個人在早期階段親手做一部分數(shù)據(jù)清洗、標注、去重工作這樣你才能深刻理解模型能力的上限是在哪里設(shè)定的。8.3 從訓練到產(chǎn)品化的最后一公里最后說一點個人體會。訓練出一個指標優(yōu)秀的模型只是邁出了產(chǎn)品化的第一步。真正難的是讓模型在一個真實的業(yè)務環(huán)境里穩(wěn)定、可靠、低成本地運行。你需要面對模型幻覺帶來的信任危機、請求忽高忽低帶來的擴縮容壓力、上線后用戶反饋中暴露出的新長尾問題……這些都不是訓練階段能夠完全預見的。我自己的經(jīng)驗是在大模型訓練流程的每一個環(huán)節(jié)都盡量保留可追溯的日志和數(shù)據(jù)版本記錄。這樣當線上模型出現(xiàn)問題時你能快速定位是預訓練數(shù)據(jù)的問題、對齊策略的問題還是增量訓練中引入的回歸。這種全鏈路可觀測性的建設(shè)前期往往感覺是額外的工作量但一旦業(yè)務規(guī)模起來、問題變多就會成為你最寶貴的資產(chǎn)。訓練大模型沒有銀彈每一個環(huán)節(jié)都需要扎扎實實地投入沒有捷徑可走。權(quán)衡取舍、快速實驗、充分復盤才是這條路上真正重要的方法論。希望能通過這篇文章幫你構(gòu)建起大模型訓練全景圖的認知框架在這個快速發(fā)展且充滿機遇的領(lǐng)域走得更穩(wěn)、更遠。