:從軟標(biāo)簽到離線蒸餾的完整生產(chǎn)鏈路)
一直有個做工程的朋友問我模型蒸餾是不是就是把大模型預(yù)測結(jié)果拿過來當(dāng)訓(xùn)練數(shù)據(jù)讓小模型照著學(xué)這話對了一半但它背后真正值得花時間的地方恰恰不在“學(xué)”這個動作而在怎么把整個流程做成一條穩(wěn)定、可復(fù)用、能出指標(biāo)的生產(chǎn)鏈路。我過去一年都在做這件事把一套千億參數(shù)級別的模型知識搬到一個參數(shù)量只有幾十分之一的模型上還要讓它在一個每天千萬級請求的真實系統(tǒng)里穩(wěn)定跑住。過程里踩了很多坑也總結(jié)出一套方法論。這篇文章不講理論綜述就講工程上怎么搭、怎么選、怎么調(diào)以及哪些環(huán)節(jié)是看論文想不到的。1. 蒸餾不是模型壓縮的降級方案而是預(yù)算約束下的最優(yōu)解1.1 項目最初的困境推理成本壓垮效果項目背景是這樣的線上有一個基于超大規(guī)模模型的意圖識別與語義匹配系統(tǒng)離線評測效果確實好所有指標(biāo)都比上一代方案高出一截。但一算賬就發(fā)現(xiàn)不對勁——單次推理的GPU成本是舊系統(tǒng)的十幾倍峰值時段的延遲也跑到800毫秒以上甲方給的服務(wù)預(yù)算根本兜不住。一開始團隊也試過幾條常規(guī)路線直接訓(xùn)練一個小模型效果差得沒法上線用結(jié)構(gòu)化剪枝壓縮率一上去精度就垮量化倒是成本降得最快但混合精度推理在目標(biāo)硬件上又要重新做算子適配工程量不小。最后還是把目光放到蒸餾上——它能保住大模型“見過世面”帶來的知識同時把推理成本壓到原來的幾十分之一。蒸餾確實不是降級方案它是在“模型效果、推理成本、交付周期”這個三方約束下可操作性最強的一條路。你要理解這一點得先認(rèn)識到大模型和小模型之間的差距不是“參數(shù)少所以笨”而是小模型的容量有限、見過的樣本分布太窄學(xué)不到那些隱藏在數(shù)據(jù)邊緣的復(fù)雜模式。蒸餾的作用就是把這些模式借教師模型的軟輸出傳遞過去。1.2 什么樣的項目真正適合上蒸餾我后來總結(jié)了一個判斷標(biāo)準(zhǔn)供你對照自身情況你有可用的教師模型效果經(jīng)過線上驗證而不是一個實驗室內(nèi)自high的模型。學(xué)生模型有明確的部署約束比如延遲預(yù)算、顯存上限、CPU/GPU型號固定。數(shù)據(jù)量足夠支撐師生之間的知識遷移一般至少幾十萬條清洗后的任務(wù)數(shù)據(jù)。團隊能接受一定的調(diào)參周期通常兩到四周而不是今天提需求明天要上線。如果這些條件都滿足蒸餾基本就是首選。如果連教師模型效果都不穩(wěn)定那第一件事應(yīng)該是先把教師模型調(diào)好而不是急著往下蒸餾——用差教師教出來的學(xué)生模型只會學(xué)一堆錯誤知識。作為參考我當(dāng)時定下的量化目標(biāo)是學(xué)生模型參數(shù)量控制在教師的3%以內(nèi)單次推理延遲低于80毫秒主要任務(wù)指標(biāo)相對教師下降不超過2個百分點。這個目標(biāo)聽起來很緊但工程化做得足夠好是可以夠到的。2. 蒸餾到底在傳遞什么軟標(biāo)簽里的信息密度與溫度參數(shù)直覺2.1 硬標(biāo)簽與軟標(biāo)簽的本質(zhì)差異除了答案還有答題思路如果只用一個詞概括蒸餾和其他訓(xùn)練方式的區(qū)別那就是“軟標(biāo)簽”。普通訓(xùn)練用one-hot硬標(biāo)簽類別直接標(biāo)成0/1模型學(xué)到的只是“正確答案是什么”蒸餾用教師模型的概率分布當(dāng)標(biāo)簽學(xué)生學(xué)到的還包括“錯誤答案之間的相對關(guān)系”。舉個例子一張圖片輸入教師模型它輸出的概率分布可能是貓0.75、老虎0.15、狗0.07、其他0.03。硬標(biāo)簽只會告訴學(xué)生“這是貓”軟標(biāo)簽則額外傳遞了一個信息貓和老虎在特征空間里的距離比貓和狗更近。這種相對關(guān)系正是小模型最缺的先驗知識。從工程視角看軟標(biāo)簽的價值可以拆成三點降低了學(xué)習(xí)難度學(xué)生不用從零摸索類別邊界直接順著教師給出的概率地形圖走。天然帶有正則化效果軟標(biāo)簽的置信度通常不會極端到0或1這抑制了過擬合。對小樣本場景尤其友好當(dāng)任務(wù)數(shù)據(jù)只有幾萬條時硬標(biāo)簽訓(xùn)練早就過擬合了軟標(biāo)簽還能穩(wěn)得住。2.2 溫度與KL散度為什么必須乘上T的平方蒸餾的核心損失函數(shù)一般寫成import torch import torch.nn.functional as F def distillation_loss(student_logits, teacher_logits, labels, T4.0, alpha0.7): # 教師輸出的軟概率分布 teacher_soft F.softmax(teacher_logits / T, dim-1) # 學(xué)生輸出的軟概率分布 student_soft F.log_softmax(student_logits / T, dim-1) # 軟標(biāo)簽蒸餾損失KL散度 kl_loss F.kl_div(student_soft, teacher_soft, reductionbatchmean) * (T ** 2) # 硬標(biāo)簽交叉熵?fù)p失 ce_loss F.cross_entropy(student_logits, labels) # 加權(quán)組合 return alpha * kl_loss (1 - alpha) * ce_loss這段代碼里最容易被忽略的細(xì)節(jié)是那個T ** 2。很多人照抄代碼但不理解為什么乘結(jié)果調(diào)參時一頭霧水。原因在于softmax加上溫度縮放之后梯度規(guī)模會發(fā)生變化。為了讓軟標(biāo)簽蒸餾和硬標(biāo)簽交叉熵兩部分loss的量級可以公平對比必須乘回T的平方否則T越大KL loss的梯度就越小訓(xùn)練會變得極不穩(wěn)定。溫度T的選擇本身就是個調(diào)參活。T越大輸出概率分布越平坦學(xué)生能看到更多“模糊關(guān)系”T太小軟標(biāo)簽退化成接近one-hot蒸餾失去意義。我試下來圖像類任務(wù)T在3到5比較合適文本語義匹配類任務(wù)T在4到8之間能保持較好的信息密度。2.3 軟標(biāo)簽和硬標(biāo)簽的配比alpha并不是越大越好損失函數(shù)里有個alpha參數(shù)用來控制軟標(biāo)簽和硬標(biāo)簽各占多少比重。直覺上會覺得教師那么強軟標(biāo)簽比重應(yīng)該越高越好。但實際測試下來alpha在0.7附近效果最好推到0.9以上反而會掉點。原因也不難理解教師模型也有犯錯的時候如果完全跟著軟標(biāo)簽走錯誤知識會被當(dāng)成真理固化到學(xué)生模型里。留一部分硬標(biāo)簽交叉熵相當(dāng)于在訓(xùn)練過程中持續(xù)給學(xué)生糾偏保證它至少不會偏離真實任務(wù)太遠(yuǎn)。另外訓(xùn)練后期可以把alpha做退火處理——前80%的epoch用較高的alpha充分吸收教師知識最后20%的epoch把alpha降下來讓學(xué)生從硬標(biāo)簽中做最后的精修。這種方式在多個任務(wù)上都穩(wěn)定帶來0.3到0.5個百分點的提升。3. 工程方案選型離線蒸餾、在線蒸餾、自蒸餾到底該選哪個3.1 離線蒸餾簡單可靠適合多數(shù)生產(chǎn)環(huán)境模型蒸餾按師生交互方式可以分成三類離線蒸餾、在線蒸餾、自蒸餾。字面意義容易理解但工程上“選哪個”這件事往往由資源約束決定而不是論文讀起來高級就選哪個。離線蒸餾是邏輯最簡單的一種教師模型先對全部訓(xùn)練數(shù)據(jù)做一遍推理把所有樣本的soft logits離線存好學(xué)生模型再拿著這些預(yù)先算好的logits訓(xùn)練。優(yōu)點非常明顯教師模型只用跑一次學(xué)生在訓(xùn)練階段完全不依賴教師工程解耦徹底。我強烈建議如果你的教師模型和服務(wù)不是同一套基礎(chǔ)設(shè)施優(yōu)先走離線蒸餾。預(yù)計算logits可以當(dāng)普通特征文件處理斷點續(xù)跑、分布式切分、緩存加速都很方便。當(dāng)時我們的實際流程是教師模型對180萬條樣本做批量推理大約跑了8個小時產(chǎn)出大概是幾個GB的logits文件。之后所有訓(xùn)練實驗都不再需要加載教師模型這一下省掉的資源相當(dāng)可觀。3.2 在線蒸餾適合教師和學(xué)生同步更新的動態(tài)場景在線蒸餾和離線蒸餾的區(qū)別在于教師模型在訓(xùn)練過程中也會更新或者學(xué)生模型實時向教師請教。典型方案是訓(xùn)練一個和教師同結(jié)構(gòu)的模型作為“動態(tài)教師”和學(xué)生一起梯度更新。這個方案的優(yōu)點是教師和學(xué)生學(xué)到的數(shù)據(jù)分布始終同步特別適合流式更新的場景比如推薦系統(tǒng)里用戶偏好隨時間漂移模型需要持續(xù)學(xué)習(xí)新數(shù)據(jù)。缺點也明顯工程復(fù)雜度高訓(xùn)練時必須同時維護兩個模型的前向和反向顯存開銷翻倍訓(xùn)練穩(wěn)定性也更難控制——教師的輸出一直在變學(xué)生的優(yōu)化目標(biāo)就不是一個固定函數(shù)收斂會變得很抖。我個人的判斷標(biāo)準(zhǔn)是如果數(shù)據(jù)分布相對穩(wěn)定優(yōu)先離線如果業(yè)務(wù)數(shù)據(jù)每天有顯著變化教師模型本身也需要在線學(xué)習(xí)那就得接受在線蒸餾的工程成本。3.3 自蒸餾沒有大模型時的另類解法自蒸餾是指用一個模型自己的輸出來教自己比如先訓(xùn)練一個模型然后用它的預(yù)測結(jié)果作為軟標(biāo)簽再重新訓(xùn)練一遍或者在一個batch內(nèi)把模型深層的輸出搬到淺層去學(xué)。自蒸餾的場景通常出現(xiàn)在“手里沒有更大的模型”的情況下。比如你手上只有一套已經(jīng)訓(xùn)好的中等模型沒有額外的預(yù)算再訓(xùn)大模型那么自蒸餾還是能帶來一些提升的因為它本質(zhì)上在做一個“深度特征對齊”強迫淺層學(xué)到深層已經(jīng)掌握的特征表達(dá)。但這套方案的上限就在那里——它并不能憑空造出教師沒見過的新知識。所以我的建議是自蒸餾可以作為效果優(yōu)化手段但如果你真的需要把能力拔高一個臺階還是得去拿一個大模型當(dāng)教師。下面是三種方案的快速對比我直接列成表格方便參考維度離線蒸餾在線蒸餾自蒸餾工程復(fù)雜度低高中訓(xùn)練資源開銷教師只推理一次雙模型同步訓(xùn)練單模型訓(xùn)練數(shù)據(jù)分布適應(yīng)性依賴固定數(shù)據(jù)集動態(tài)適應(yīng)依賴自身表達(dá)效果上限取決于教師模型師生同步提升受限于自身上限適合場景生產(chǎn)環(huán)境、固定任務(wù)流式數(shù)據(jù)、在線學(xué)習(xí)無額外大模型的場景4. 一條可直接落地的蒸餾訓(xùn)練鏈路數(shù)據(jù)準(zhǔn)備、樣本篩選與損失組裝4.1 數(shù)據(jù)準(zhǔn)備中最容易被忽視的細(xì)節(jié)tokenizer對齊與logits緩存推薦大家把蒸餾訓(xùn)練鏈路當(dāng)成數(shù)據(jù)處理鏈路來設(shè)計而不是模型訓(xùn)練。原因很簡單真正花掉大量時間的地方不是“怎么改模型結(jié)構(gòu)”而是怎么把特征、預(yù)測結(jié)果、標(biāo)簽對齊到同一個維度上。第一個要處理的坑是tokenizer對齊問題。教師模型如果在更大的詞表上訓(xùn)練學(xué)生模型為了控制參數(shù)量通常會換成自己獨立的詞表。這就導(dǎo)致同一個句子在教師和學(xué)生那邊tokenize出來的token id完全對不上直接拿教師輸出的logits喂給學(xué)生訓(xùn)練會因為token維度不一致而失敗。我們的做法是先對齊文本序列再對齊logits。教師和學(xué)生各自對同一段原始文本做tokenize然后通過“字符偏移量映射”找到對應(yīng)的token索引關(guān)系最后把教師那頭的logits重新映射到學(xué)生的token長度上。這個映射表建起來挺費時間但一旦建好后面所有任務(wù)都能復(fù)用。第二個點是logits緩存的結(jié)構(gòu)設(shè)計。我們落盤的格式是JSON Lines每條樣本包含原始文本、任務(wù)標(biāo)簽、教師logits向量、教師預(yù)測置信度四部分。緩存文件名要按照訓(xùn)練集、驗證集、分桶標(biāo)記來組織方便做樣本采樣和實驗回溯。4.2 樣本篩選不是所有教師output都有同等教學(xué)價值如果你直接把所有訓(xùn)練數(shù)據(jù)一股腦丟進(jìn)蒸餾效果通常不溫不火。原因很簡單——大量簡單樣本里教師和學(xué)生的預(yù)測本來就相差不大軟標(biāo)簽提供的“新增信息量”很低。我們需要做的是根據(jù)教師模型的預(yù)測置信度對訓(xùn)練樣本分桶。操作思路如下置信度高于0.9的樣本教師和學(xué)生都會做對學(xué)習(xí)價值低可以降采樣到總樣本的10%到20%。置信度在0.5到0.9之間的樣本教師能判對但置信度不高這類樣本蘊含豐富的邊界信息應(yīng)該全量保留。置信度低于0.5的樣本教師輸出高度不確定普通訓(xùn)練模型很容易在這類數(shù)據(jù)上崩潰但在蒸餾任務(wù)里它們反而是關(guān)鍵樣本因為只有大量的困難樣本才能逼著學(xué)生去借鑒教師的“思考過程”。當(dāng)時我們把這套采樣策略跑完訓(xùn)練集從180萬條壓到90萬條左右效果沒有下降訓(xùn)練時間卻砍了近一半。這就是數(shù)據(jù)工程帶來的杠桿。4.3 不只是logits中間層特征對齊帶來顯著收益很多教程只教你蒸餾最后一層輸出但實際項目里學(xué)生模型如果只在輸出層對齊它學(xué)到的是“答案”而不是“推理過程”。尤其當(dāng)學(xué)生模型的深度和教師相差較大時比如教師是30層transformer學(xué)生只有12層直接蒸餾輸出層的效果會非常有限。原因在于神經(jīng)網(wǎng)絡(luò)的層次化特征是有分工的淺層學(xué)到的是詞法和句法特征深層學(xué)到的是語義特征。學(xué)生模型如果只在最后一層被約束那么它的中間層就會自由發(fā)揮導(dǎo)致深層想要的信息在中間層就丟了。解決方案是引入中間層表征對齊常見的是MiniLM提出的策略選取教師和學(xué)生的若干層分別做attention map和value relation的匹配。具體到工程上我們給學(xué)生模型插入了一個輕量的對齊頭把學(xué)生層的表征投影到教師對應(yīng)層表征的空間里然后用均方誤差去拉近。代價是訓(xùn)練顯存會增加一些因為需要同時保留教師和學(xué)生的中間層輸出。但換來的收益是任務(wù)指標(biāo)在原本只蒸餾最后一層的基礎(chǔ)上再漲2個百分點左右值得。4.4 訓(xùn)練pipeline一個可以直接改的偽代碼框架我把整個訓(xùn)練pipeline整理成了可復(fù)用的結(jié)構(gòu)核心代碼思路如下以PyTorch為例for epoch in range(total_epochs): for batch in distill_dataloader: texts, labels, teacher_logits_list batch # 學(xué)生模型前向所有層的輸出都要拿 student_outputs, student_intermediates student_model(texts) # 1. 軟標(biāo)簽蒸餾loss帶溫度縮放 distill_loss_value distillation_loss( student_outputs, teacher_logits_list, labels, Ttemperature ) # 2. 中間層對齊loss可選建議開啟 align_loss 0.0 for layer_idx in align_layers: align_loss mse_loss( student_intermediates[layer_idx], teacher_intermediates_stored[layer_idx] ) # 3. 硬標(biāo)簽交叉熵 ce_loss F.cross_entropy(student_outputs, labels) # 總loss組合 total_loss ( alpha * distill_loss_value beta * align_loss (1 - alpha) * ce_loss ) total_loss.backward() optimizer.step() lr_scheduler.step()需要提醒的是teacher_intermediates_stored在離線蒸餾模式下可以是預(yù)先算好的不需要在訓(xùn)練過程中實時跑教師模型這是工程上最大的一個效率優(yōu)勢。4.5 關(guān)于訓(xùn)練超參數(shù)我的推薦配置蒸餾任務(wù)的超參數(shù)和普通訓(xùn)練略有差異這里給一組經(jīng)過大范圍試驗驗證過的初始值你可以照抄再微調(diào)參數(shù)推薦初始值調(diào)參范圍說明溫度T4.02~8越低越接近硬標(biāo)簽越高越平滑alpha0.70.5~0.9軟標(biāo)簽權(quán)重后期可退火beta0.10.05~0.3中間層對齊loss權(quán)重學(xué)習(xí)率3e-51e-5~1e-4一般用線性預(yù)熱衰減batch size12864~256過大容易導(dǎo)致軟標(biāo)簽學(xué)習(xí)不穩(wěn)定訓(xùn)練輪數(shù)64~10蒸餾通常不需要很長訓(xùn)練5. 訓(xùn)練中踩過的坑從logits對不齊到分布偏移的災(zāi)難性遺忘5.1 logits映射錯位一次靜默的bug讓實驗白跑一周這個坑值得單獨拿出來說。當(dāng)時我們從教師的vocab向?qū)W生vocab映射logits時用的是“token文本匹配”策略也就是把教師和學(xué)生的詞表按token字符串做join。看起來沒問題但實際跑出來的第一個epoch loss就異常高而且怎么調(diào)都降不下去。排查花了整整三天最后發(fā)現(xiàn)是詞匯表里存在大量同形不同義的情況同一個詞在教師和學(xué)生詞表里對應(yīng)不同的詞頻歸并規(guī)則導(dǎo)致某些token文本一樣但語義含義完全錯位。比如一個漢字作為單字出現(xiàn)和作為子詞前綴出現(xiàn)編碼含義是不同的強行按文本匹配等于把風(fēng)馬牛不相及的logits硬塞給學(xué)生。最終的修復(fù)方案是徹底放棄按文本匹配改為直接用“教師原始token下的完整logits”在學(xué)生側(cè)做特征工程的映射表時先對映射關(guān)系做一次質(zhì)量校驗隨機抽1000條樣本比對映射后的軟標(biāo)簽和教師原始軟標(biāo)簽的KL散度如果高于閾值就說明映射有bug立即修正。這個校驗步驟現(xiàn)在被我一直保留著成了蒸餾pipeline的標(biāo)準(zhǔn)動作。5.2 分布偏移蒸餾后模型在訓(xùn)練集上很漂亮一到線上就崩蒸餾完成后的離線評測看起來非常理想各種指標(biāo)都貼近教師但上線A/B測試第一周線上核心指標(biāo)反而掉了3%。問題最終定位到“分布偏移”上。教師模型的訓(xùn)練數(shù)據(jù)偏向于業(yè)務(wù)早期分布而線上實際請求在持續(xù)發(fā)生變化。學(xué)生模型在蒸餾時只學(xué)到了教師對歷史數(shù)據(jù)的理解面臨新分布時沒有任何應(yīng)變能力。而普通訓(xùn)練連硬標(biāo)簽和一部分在線數(shù)據(jù)都參與學(xué)習(xí)反而能感知到新分布。解決方案是在蒸餾數(shù)據(jù)集里摻入一定比例的新鮮線上日志數(shù)據(jù)哪怕是弱標(biāo)簽也行。這相當(dāng)于給學(xué)生模型在蒸餾之外打了一針“現(xiàn)實疫苗”。調(diào)整之后線上效果明顯回升。這也印證了一個道理蒸餾不是一個純離線過程它的數(shù)據(jù)分布更新頻率要和業(yè)務(wù)保持一致。5.3 災(zāi)難性遺忘學(xué)生模型對舊任務(wù)突然失憶訓(xùn)練到后期遇到了另一個典型問題——模型在新任務(wù)上指標(biāo)一路漲但在一個很久之前驗證過的舊任務(wù)上突然大幅下跌。這就是災(zāi)難性遺忘。原因是蒸餾過程中新樣本的占比過高或者新樣本的難度分布嚴(yán)重傾斜導(dǎo)致模型把大部分容量都用來擬合新分布舊知識被擠出。應(yīng)對方法主要靠兩條一是訓(xùn)練時按任務(wù)比例做采樣確保每個batch里舊任務(wù)樣本占比不低于三成二是把舊任務(wù)的軟標(biāo)簽和硬標(biāo)簽同時參與訓(xùn)練必要時對舊任務(wù)樣本的loss做加權(quán)保護。這個辦法雖然土但非常有效也是工業(yè)界最常用的及格線做法。5.4 在線蒸餾模式下的loss振蕩問題如果選擇在線蒸餾你大概率會碰到一個頭疼的問題——loss不收斂曲線像心電圖一樣震蕩。我們當(dāng)時排查了很久終于確認(rèn)了根因兩個模型在同步更新學(xué)生學(xué)到的目標(biāo)函數(shù)本身就在不停移動相當(dāng)于拿一個移動標(biāo)靶練射擊不穩(wěn)定是必然的。解決辦法是給教師側(cè)引入“動量更新”機制教師參數(shù)不再從梯度直接更新而是通過“學(xué)生參數(shù)的滑動平均”來更新。這樣一來教師在短時間內(nèi)保持相對穩(wěn)定學(xué)生有了一個固定參照物loss振蕩立刻緩解訓(xùn)練顯著平滑。這也解釋了為什么很多在線蒸餾論文里強調(diào)要使用動量教師。6. 上線前的質(zhì)量門禁離線評測維度、A/B實驗設(shè)計與回歸監(jiān)控6.1 離線評測不能只看總指標(biāo)分項看才能暴露問題很多團隊在蒸餾完成后只跑一個總準(zhǔn)確率就決定上線。實際上總指標(biāo)像“平均體溫”看著正常內(nèi)部可能已經(jīng)燒得很厲害。我自己采用的評測方案是把評測集按教師置信度分桶分別看待高置信度桶、中置信度桶、低置信度桶的學(xué)生模型表現(xiàn)。如果學(xué)生模型在高置信度桶上貼近教師但在低置信度桶上崩盤說明它只學(xué)會了“簡單知識”沒有掌握教師處理邊界樣本的策略。另外還要看KL散度學(xué)生輸出分布和教師輸出分布之間的差異這個指標(biāo)比準(zhǔn)確率更靈敏。好的蒸餾模型應(yīng)該有較低的KL散度同時保持較高的任務(wù)準(zhǔn)確率兩者出現(xiàn)背離就要警惕。6.2 A/B實驗與分析小流量驗證比什么都重要線上A/B測試我建議從5%流量開始最短跑滿一周覆蓋一個完整的業(yè)務(wù)周期。實驗指標(biāo)包括核心業(yè)務(wù)指標(biāo)如點擊率、轉(zhuǎn)化率、任務(wù)成功率也包括技術(shù)指標(biāo)延遲、GPU占用率、推理錯誤率。這里有個容易被忽略的細(xì)節(jié)蒸餾模型上線時不要和原系統(tǒng)同時改代碼。我們在上線時踩過一次坑把蒸餾模型和新版本的重試邏輯同時發(fā)布結(jié)果指標(biāo)波動后根本說不清是模型問題還是系統(tǒng)問題。把兩個變量拆開這是實驗設(shè)計的基礎(chǔ)常識但工程繁忙時總會被犧牲。A/B測試跑完還不能直接全量。我習(xí)慣多觀察三天看模型在各流量分桶的表現(xiàn)有沒有異常波動特別是低置信度樣本和長尾請求上的表現(xiàn)。這些地方最容易暴露蒸餾模型的盲區(qū)。6.3 上線后的回歸監(jiān)控設(shè)置三個層級的告警上線之后不是終點蒸餾模型在長尾數(shù)據(jù)上的退化速度往往比普通模型更快必須在生產(chǎn)環(huán)境里設(shè)置監(jiān)控。三級監(jiān)控指標(biāo)設(shè)置如下一級服務(wù)類指標(biāo)包括平均延遲、P99延遲、推理錯誤率超閾值直接告警。二級業(yè)務(wù)指標(biāo)比如核心業(yè)務(wù)轉(zhuǎn)化率、任務(wù)完成率按滑窗計算相對上一周的波動。三級模型分布指標(biāo)定時采樣線上輸入和訓(xùn)練集分布做相似度比對如果相似度持續(xù)下降說明出現(xiàn)了嚴(yán)重的分布漂移。三級的分布漂移監(jiān)控最容易被忽視但它其實是蒸餾模型的“預(yù)警雷達(dá)”。只要分布漂移到一定程度你不用等業(yè)務(wù)指標(biāo)崩了才發(fā)現(xiàn)可以提前回滾或重新蒸餾。7. 一點個人體會蒸餾的工程細(xì)節(jié)決定你在生產(chǎn)中是踩坑還是上岸這個項目做完最大的體會是蒸餾模型的效果天花板由教師決定但下限由工程細(xì)節(jié)決定。論文里寫清楚的是損失函數(shù)和模型結(jié)構(gòu)但寫不清楚的是那些讓你崩潰的細(xì)節(jié)tokenizer對齊要不要做質(zhì)量校驗、教師logits要不要緩存、訓(xùn)練集要不要按置信度分桶、線上分布漂移了要不要重新蒸餾樣本、A/B測試要不要拆變量。如果你正準(zhǔn)備在生產(chǎn)環(huán)境做模型蒸餾我的建議是從低風(fēng)險的離線蒸餾開始先把數(shù)據(jù)鏈路跑通再考慮在線蒸餾、中間層對齊這些高進(jìn)階玩法。節(jié)奏踩對了蒸餾是個性價比極高的模型升級路徑節(jié)奏踩錯了它會變成一個無底洞式的調(diào)參旋渦。