為什麼需要 MLOps:
模型會過期
模型很少「壞掉」。它不會當機、不會噴錯誤、不會在半夜叫醒你。 它只是每天照常回答,而答案越來越常是錯的——因為世界變了,模型沒變。
下面是一顆真的模型的 24 個月:第 0 個月訓練好上線,之後沒人動它。 你可以在任何一個月按下「重訓」,看曲線怎麼跳回去、又怎麼開始往下掉。 多按幾次,你就會問出這堂課要回答的問題:到底該什麼時候按?
每一個點都是實驗場模擬跑出來的實測值(每月 300 位新客戶、6 個特徵, 每次重訓都真的重新訓練一次)。虛線是完全不重訓的下場。
這一課的實驗場是真的 Python(在你的瀏覽器裡跑,不用安裝任何東西)。 首次載入約需 30–60 秒,正好夠你讀完第 1 節。裡面沒有程式碼要讀—— 每一段都有滑桿,拉一下,整整 24 個月的模擬就會重跑一次。
模型上線那天,就開始過期
這個模擬裡有一間公司在做「客戶會不會流失」的預測。第 0 個月訓練好模型、上線, 每個月有 300 位新客戶進來,模型逐一判斷,月底對答案,得到那個月的準確率。 模型完全沒有變——變的是世界:客戶的組成、競爭對手、什麼樣的人會走。
| 上線後 | 那個月的準確率 | 感覺 |
|---|---|---|
| 第 1 個月 | 0.94 | 驗收通過,大家很開心 |
| 第 6 個月 | 0.79 | 有人覺得怪怪的,但說不上來 |
| 第 12 個月 | 0.68 | 業務開始抱怨名單不準 |
| 第 23 個月 | 0.45 | 比丟銅板還差 |
24 個月平均 0.660。而這段期間,系統監控是全綠的:沒有當機、沒有錯誤、 沒有告警。這是機器學習系統最危險的失敗方式——它會安靜地爛掉, 而且通常是業務先發現,不是工程師。
傳統軟體壞掉會噴例外,你馬上知道。模型「壞掉」的樣子是準確率慢慢滑落, 你只有在持續量它的時候才看得見。這句話就是整個 MLOps 的起點。
世界有兩種變法,只有一種會讓準確率掉
「世界變了」其實包含兩件完全不同的事,分清楚它們,你才知道要監控什麼:
| 名字 | 變的是什麼 | 比喻 |
|---|---|---|
| 資料漂移 | 進來的資料變了,但「什麼答案才對」的規則沒變 | 考卷的題型分佈變了(以前一半代數一半幾何,現在九成幾何),解法還是同一套 |
| 概念漂移 | 規則本身變了 | 同一題,標準答案改了 |
實驗場的第 2️⃣ 節讓三個世界跑同一件事——訓練一次、之後不重訓——結果很反直覺:
| 世界 | 24 個月平均準確率 | 進來的資料有沒有變 |
|---|---|---|
| 完全不變 | 0.926 | 沒有 |
| 只有資料漂移 | 0.945 | 變很多(某特徵月均值 -0.08 → +1.56,流失比例 48% → 95%) |
| 概念漂移 | 0.660 | 幾乎沒變 |
- 只有資料漂移時,準確率沒掉(0.945,甚至比世界完全不變的 0.926 還高一點點)。 規則沒變,模型學到的那條界線還是對的,只是進來的人整批移到了它的一側。 準確率沒掉不代表沒事——這個模型正在服務一群訓練時沒見過的客戶。
- 概念漂移時,資料看起來一切正常。你盯著輸入資料看到天亮也看不出異狀, 準確率卻已經腰斬。
這兩件事合起來,決定了監控要怎麼做:資料漂移不需要標籤就看得見 (比對輸入分佈,今天就能算),它是早期警訊;而概念漂移只有拿到標籤、 算出準確率才會現形——所以你必須有一個地方,持續記錄每個月的成績。 沒有那份紀錄,你連「什麼時候開始掉的」都答不出來。
三種策略:不重訓、定期重訓、監控觸發
知道模型會過期之後,只剩一個問題:什麼時候重訓?三種做法, 在實驗場的 3️⃣ 節可以用滑桿即時比較(世界變化速度 0.12 時的實測):
| 策略 | 做法 | 平均準確率 | 重訓次數 |
|---|---|---|---|
| 不重訓 | 訓練一次,永遠不動 | 0.660 | 0 |
| 定期重訓 | 每 3 個月重訓一次,不管準不準 | 0.900 | 7 |
| 監控觸發 | 準確率掉到 0.85 以下才重訓 | 0.889 | 4 |
定期重訓的成績最高,但監控觸發只用了 4 次重訓就拿到幾乎一樣的結果。 這就是這張表要一起看兩欄的原因:重訓次數就是成本——算力、工程師的時間、 每一次上線都要承擔的風險。
門檻該設多少?把實驗場的滑桿從 0.95 拉到 0.70,你會看到一條很清楚的取捨線:
從 0.85 拉到 0.95,多花 19 次重訓,平均準確率只多買到 2.7 個百分點。 門檻太高=天天重訓,太低=掉到很慘才救——中間那個甜蜜點不在這堂課裡, 在你自己的成本表:一次重訓要花多少錢,準確率掉一個百分點你要賠多少。
順帶一提,門檻拉到 0.95 的成績(0.916)跟「每 1 個月定期重訓」一模一樣—— 門檻拉到極限,監控觸發就退化成定期重訓,還多花了監控的力氣。
你不會馬上知道自己錯了
上面的「監控觸發」偷藏了一個很甜的假設:這個月準不準,這個月月底就知道。 真實世界很少這樣。你要等客戶真的解約、等帳單真的逾期、等病人真的回診, 答案才會揭曉——標籤晚幾個月是常態。
而標籤遲到會同時造成兩件事,第二件比第一件更傷:
- 警報遲到:第 12 個月的準確率,你第 15 個月才知道,那時已經爛了三個月。
- 連教材都過期:要重訓,只有「已經有標籤」的資料能用。你手上最新的有標籤資料 也是三個月前的——重訓出來的模型一出生就落後三個月,很快又跌破門檻, 於是再重訓一次。追著自己的影子跑。
| 標籤延遲 | 平均準確率 | 重訓次數 |
|---|---|---|
| 當月就知道 | 0.889 | 4 |
| 晚 3 個月 | 0.851 | 11 |
| 晚 6 個月 | 0.796 | 14 |
又慢又忙:準確率掉了 9 個百分點,重訓次數變成 3.5 倍。 更難堪的是最後一列——延遲 6 個月的監控觸發(0.796), 已經輸給什麼都不看、每 6 個月固定重訓一次的 0.867,而後者只重訓了 3 次。
所以真實專案的第一個問題往往不是「要用什麼演算法」,而是 「我的標籤多久會到?」——這個數字決定了監控值不值得做、 決定了你是不是該乾脆改用定期重訓,也決定了值不值得花錢買更快的標籤 (人工抽樣標註、找一個提早看得到的代理指標)。
「監控觸發」要真的跑起來,需要五個零件
到這裡,正確答案已經浮出來了:持續看著準確率,該重訓的時候重訓, 而且要確定新模型真的比舊的好。這句話講起來一秒,做起來需要五樣東西—— 每一樣正好是這個系列的一課:
| 你需要 | 沒有它會發生什麼 | 哪一課 |
|---|---|---|
| 每次訓練的設定與指標留得下紀錄、查得回來 | 你不知道是第幾個月開始掉的,也不知道當時用了什麼參數 | 01 MLflow 實驗追蹤 |
| 模型有版本,新舊能比較,能一行換上去、換錯能退回 | 重訓出一顆新模型,卻不敢換,因為不知道它比舊的好還壞 | 02 Models 與 Registry |
| 「取資料 → 訓練 → 評估」是一張看得懂的圖,不是散落的腳本 | 誰先誰後靠人腦記,換人接手就斷掉 | 03 Dagster 軟體定義資產 |
| 有東西會在對的時間按下重訓(排程,或偵測到就觸發) | 監控會響,但沒有人按 | 04 Dagster 自動化 |
| 上線前有品質閘,比舊版差就擋下來 | 重訓反而把線上弄壞——重訓不保證變好 | 05 Dagster × MLflow 管線 |
最後一列特別值得留意,因為這堂課的模擬對重訓太仁慈了:這裡的重訓永遠成功、 永遠拿得到乾淨的新資料、訓出來永遠不比舊的差。真實世界三件事都不保證—— 你在第 6️⃣ 節把世界變化速度拉到 0 就會親眼看到,重訓有時候是純成本, 有時候還會讓成績變差一點。所以完整的自動重訓,最後一步一定是 「先擋下來,通過才換上去」。
「MLOps」這個詞聽起來很大,但它要解決的就是上面這五件事。 接下來五堂課,你會親手把它們一個一個做出來。
換你動手
實驗場的 6️⃣ 節有四根滑桿,把前面所有旋鈕放在一起:世界變化速度、定期重訓的週期、 監控觸發的門檻、標籤延遲。三個挑戰,全部都是「拉到某個值,看表格怎麼變」:
把「世界變得多快」拉到 0(世界完全不變),其他不動。 三條線會變成什麼樣子?三種策略各重訓了幾次、平均準確率是多少? 誰做了白工?
世界變化速度放回 0.12、標籤延遲 0, 把「監控觸發門檻」從 0.95 一格一格拉到 0.70, 記下每一格的平均準確率與重訓次數。多花 19 次重訓,平均準確率買到幾個百分點?
把「標籤晚幾個月」拉到 6,然後只調「每幾個月定期重訓」, 找出一個能贏過這個監控觸發的設定。怎麼知道你贏了?看表格的兩欄—— 平均準確率更高、重訓次數更少,兩件事要同時成立。 做完再回答自己一個問題:你手上的專案,標籤多久會到?
卡住了?每一題在實驗場末節都有折疊解答——先自己拉一遍,再打開對照。
情境測驗
離開前試試看:下面的情境都真的會遇到。每題選一個你認為的最佳做法,選了馬上看得到解釋。
Q1 情境題
模型上線 8 個月,每月準確率都在 0.93 上下、一點都沒掉;但你發現進來的客戶跟訓練時很不一樣(某個特徵的月平均從 -0.08 一路走到 +1.5,正類比例從 48% 變成 95%)。最合理的處置是?
本課實測:只有資料漂移的世界,24 個月平均準確率是 0.945,甚至比「世界完全不變」的 0.926 還高一點——因為決定答案的規則沒變,模型學到的界線還是對的。所以 C 是過度反應:重訓要花錢、要承擔上線風險,而這裡沒有東西需要被修。但 A 也不對——資料漂移是你不用等標籤就看得到的唯一訊號,而且模型正在服務一群訓練時沒見過的客戶,值得繼續盯。D 更糟:實測把門檻拉到 0.95,重訓次數會從 4 次暴增到 23 次(等於每個月都重訓),平均只多 2.7 個百分點。正確的心態是:資料漂移=多看一眼;概念漂移(準確率真的掉)=該動手了。
Q2 情境題
你的專案要等客戶真的解約才知道答案,標籤大約晚 6 個月。團隊提議做「準確率低於門檻就自動重訓」。你的建議是?
實測數字站在 C 這邊:標籤晚 6 個月時,監控觸發的平均準確率是 0.796、重訓 14 次,而「每 6 個月固定重訓一次」是 0.867、只重訓 3 次——又準又便宜。原因是延遲同時傷了兩件事:警報晚 6 個月響,而且重訓只能用 6 個月前的舊資料,模型一出生就落後,很快又跌破門檻。A 的直覺(監控一定比較省)在標籤夠快時成立,在這裡剛好相反。B 會讓情況更糟:門檻越高觸發越頻繁,等於用過期教材一直重訓。D 則是放棄治療——本課第 1 節那條掉到 0.45 的曲線就是它的結局。
Q3 錯誤診斷
你把「世界變得多快」拉到 0(世界完全不變),實驗場給出這張表。為什麼定期重訓做了 7 次,平均準確率反而比完全不重訓低一點?
A 正是這堂課要打破的直覺:重訓不保證變好。世界沒變的時候,新資料裡沒有任何新資訊,重訓只是拿另外 300 筆樣本重擲一次骰子,運氣不好就略差一點(0.922 對 0.926)。C 說的災難性遺忘是持續學習的問題,這裡每次都是從頭訓練,不適用。D 把因果說反了——監控觸發沒被觸發,正是它做對了:它的成績跟不重訓一樣好,而且省下 7 次重訓。真正的教訓有兩個:定期重訓在穩定的世界裡是純成本(這就是監控觸發存在的理由),而「重訓可能更差」也正是每條自動重訓管線都必須有品質閘的原因——新模型要先跟舊的比過,贏了才准上線。
Q4 錯誤診斷
同樣的門檻 0.85、同樣的世界,只有「標籤延遲」不同。標籤越晚到,重訓次數為什麼反而變多?
關鍵在於延遲同時弄慢了警報和教材,而後者才是次數暴增的原因:第 m 個月要重訓,手上最新的有標籤資料是第 m-N 個月的,訓出來的模型等於「N 個月前的最佳解」,放到今天的世界馬上又不夠好,於是很快再觸發一次——追著自己的影子跑。A 不成立,這個模擬每次重訓都只用一個月份的資料,資料量固定。B 說反了:延遲不會改變任何一個月算出來的準確率數值,它只改變你什麼時候看到那個數字。D 是想像出來的 bug,每個月只判斷一次。帶得走的結論:先問標籤多久會到,再決定監控策略。