機器學習的上線難題
軟體部署問的是「新版本還能通過測試嗎?」機器學習部署問的是更難的問題:「在我從未見過的即時流量上,新模型的表現更好嗎?」在保留集上的離線指標是必要的,卻永遠不充分——測試集是過去,而生產是現在。一個在驗證集上勝出的模型,可能因為分布位移、延遲退化,或離線評估看不見的回饋效應,而在生產中落敗。
所以我們從不替換模型;我們讓它們沿著一座曝光度遞增的階梯晉級,每一階在授予更多流量前先回答一種不同的風險。這些階分別是影子(shadow)、金絲雀(canary)與冠軍/挑戰者(champion–challenger),而回滾則是貫穿其下的安全網。每一階都以登錄庫 id 參照模型,並由同一個模型服務(model serving)層提供,因此晉級是一次設定變更,而非重新部署。
第一階——影子部署
影子部署讓新模型跑在真實的生產流量上,但丟棄它的輸出——使用者仍收到現任模型的預測。新模型看到的正是生產所看到的;你離線地把它的輸出與現任模型相比,使用者風險為零。影子部署回答離線評估無法回答的問題:新模型能否撐過真實的輸入分布、真實的延遲預算、真實的畸形請求、真實的特徵新鮮度?
影子部署也是訓練/服務偏移終於攤在陽光下的地方:因為影子模型透過即時服務路徑計算特徵,任何與其離線行為的偏離都是偏移,而且在任何一位使用者受影響之前就被逮到。代價是真實的——你付出跑兩次推論的費用——但它是對一次「自信卻錯誤」的上線,最便宜的一份保險。
把训练—服务偏差量化:群体稳定性指数对影子模型线上与离线特征分布之间的对数比漂移求和。
第二階——金絲雀部署
一旦影子部署證明機器運作健全,金絲雀部署就把新模型的輸出服務給一小片即時流量——1%、接著 5%、再到 25%——同時盯著那一片上的護欄指標。若金絲雀上的延遲、錯誤率或業務 KPI 維持健康,你就擴大切片;若任何護欄觸發,你就立刻把那片切片導回現任模型。這名字來自礦坑裡的金絲雀:小規模的暴露族群,在整座礦坑陷入風險之前先發出預警。
金絲雀天生與A/B 測試成對:金絲雀切片與現任切片構成一場受控實驗,你以第一卷的統計嚴謹度來解讀差異,而非用肉眼盯儀表板。關鍵紀律是在開始之前就預先登記你的護欄與決策規則——哪些指標、哪些門檻、最小樣本量是多少——好讓你無法在事後合理化一次糟糕的上線。
把金丝雀当作受控实验:对候选模型与现任模型做双比例 z 检验,判断 KPI 差异是真实信号还是噪声。
- 上線前釘住護欄(延遲 p99、錯誤率、主要 KPI)與最小樣本量。
- 把 1% 流量導向候選模型;維持到達到樣本門檻為止。
- 若所有護欄健康且 KPI 提升顯著,擴大到 5% → 25% → 100%。
- 若在任何寬度下有任一護欄觸發,自動把切片導回現任模型。
第三階——冠軍/挑戰者
金絲雀是一個事件;冠軍/挑戰者是一個常設機制。你把現任模型指定為冠軍(champion),並在生產流量上持續跑一個或多個挑戰者(challenger)與之對抗,以相同的即時指標相互比較。一個以事先約定的幅度、在足夠資料上持續打敗冠軍的挑戰者,就被升級為冠軍——而這個循環永遠繼續。它把模型改進,從一連串冒險的「一次到位」上線,變成一場穩定、由證據驅動的競賽。
這套框架逼出健康的問題:挑戰者必須跨過的幅度(margin)是多少(免得你因雜訊就升級)?當多個挑戰者同時競賽時,你如何避免多重比較(multiple comparisons)造成的膨脹?冠軍/挑戰者正是安全上線階梯與上一篇持續訓練迴圈的交會點:每個自動重訓的模型都以挑戰者身分進場,絕不自動成為冠軍。
只在可信的优势上晋升:改进量的置信下界(对 m 个挑战者做 Bonferroni 校正)必须超过边际阈值 δ。
安全網——回滾
上面每一階都假設一件事:當出錯時,你能迅速回到安全。回滾策略(rollback strategies)讓還原到一個已知良好的模型,成為一次單一、快速、低風險的操作。因為模型是不可變的登錄庫節點,回滾不是一次重建——而是把服務設定重新指向前任冠軍的 id。目標是以秒計、值班工程師能在凌晨三點、不靠部署管線就執行的回滾。
影子證明機器運作;金絲雀限縮爆炸半徑;冠軍/挑戰者把以證據為本的晉級制度化;回滾保證一個快速的出口。合起來,它們讓你能大膽上線,正因為你能瞬間撤退。但每一階都仰賴可信的即時指標——而計算那些指標,就是監控,正是下一篇的主題。