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