這份 MLOps 清單把混亂拆成堆疊
我把一份 MLOps 清單拆成可直接抄的生產堆疊:版本控管、監控、部署、擴充與回滾。

我把一份 MLOps 清單拆成可直接抄的生產堆疊:版本控管、監控、部署、擴充與回滾。
我用生產環境的 ML 堆疊一陣子了。模型能訓練、Notebook 也很乾淨、Demo 在 Slack 裡還會被點個讚,結果一上線就開始鬧脾氣。資料漂移、特徵管線斷掉、重訓工作沒人發現失敗,然後有人問我:為什麼今天還在吐上週的預測?這種時候最煩的不是模型本身,是大家老愛把「把模型上線」講得像一個動作。根本不是。它是一整串很無聊、很瑣碎、但少一個就會爆的流程。我後來才慢慢想通,MLOps 不是找一個神工具,是把責任切清楚。
這次把我拉回來的是 EthicalML / awesome-production-machine-learning 這份清單。它不是在賣單一平台,而是把部署、監控、版本控管、擴充這些東西攤開來給你看。GitHub 上的星號和 fork 數我這邊不硬掰,因為來源頁面沒穩定提供我可核對的數字;但它會一直被人拿來當參考,原因很簡單:大家都卡在同一種痛點。這份 repo 的價值,不是「推薦你買什麼」,而是逼你承認生產 ML 本來就是一個堆疊。
別再把生產 ML 當成單一選型
訂閱 AI 趨勢週報
每週精選模型發布、工具應用與深度分析,直送信箱。不定期,不騷擾。
不會寄垃圾信,隨時可取消。
A curated list of awesome open source libraries to deploy, monitor, version and scale your machine learning.
翻譯一下就是:生產 ML 不是選一個平台就結束,而是要把好幾層責任拆開。你需要打包、服務、追蹤、監控、版本、排程,很多時候還要回滾。這份清單其實就是把這些層次畫給你看。

我以前也踩過這個坑。團隊一開始很愛問:「我們是不是只要找一個 inference server 就好?」結果模型真的能回應之後,大家才發現沒人知道是哪個資料版本訓練出這顆 checkpoint,也沒人說得清楚線上輸入欄位有沒有在訓練後改過。服務本身沒壞,壞的是流程。
所以我現在看這種清單,第一個反應不是「哪個工具最紅」,而是「每個環節到底誰負責」。服務不是追蹤,追蹤不是監控,監控也不是重訓。只要一個工具想把這些全包,我就會先皺眉頭。因為那通常代表你之後會很難除錯。
實操寫法很簡單:先把你們組織裡一個模型的生命週期寫出來,從資料進來、訓練、驗證、註冊、部署、觀測、回滾一路列完。每一步旁邊都補一個失敗模式。你如果寫不出失敗模式,通常不是你太懂,而是你還沒真的理解那一步。
- 把清單當檢查表,不要當購物車。
- 工具要對應生命週期,不要對應團隊喜好。
- 每個責任只留一個 owner,除錯才不會互踢皮球。
版本控管不是附屬品,是出事後唯一能講人話的東西
open source libraries to deploy, monitor, version and scale
這句裡面最容易被輕輕帶過的就是 version,但我跟你說,真正出事時,版本控管才是救命的。翻譯一下就是:你要版本化的不只是程式碼,還有資料、特徵、模型、設定檔,甚至訓練時那個把所有東西串起來的環境。
我看過太多團隊 Git 歷史很漂亮,結果完全沒辦法重現。原因很單純:訓練資料放在 bucket 裡,卻沒有 immutable snapshot。模型 artifact 有版本,feature 定義沒有。等到業務問我:「為什麼這次重訓後風控模型行為變了?」大家只能回一句「我們猜是輸入變了」。這不是答案,這是自白。
這份 repo 好的地方就在這裡,它會逼你把版本當成一等公民,而不是事後補票。因為只有版本化,你才講得清楚某次預測為什麼長這樣。沒有版本,出問題時你不是在 debug,你是在考古。
我自己的實操方式是,先訂一個最低版本契約。每個模型至少要把這些東西綁在一起:
- 訓練資料快照或查詢條件
- 特徵 schema
- 模型 artifact
- 超參數與訓練設定
- 服務映像檔或執行環境
如果你的堆疊沒辦法把這些串起來,先不要急著追求吞吐量。真的,先把可重現性補起來。能不能重現,比你跑得多快重要太多。
監控不是看幾條漂亮折線就叫完成
monitor
這個動詞看起來很小,實際上很煩。翻譯一下就是:你要同時盯系統健康跟模型健康。系統健康告訴你服務有沒有活著,模型健康告訴你預測還有沒有意義。這兩件事完全不同,但很多團隊會把它們混成一團。

服務可以在線上、延遲也正常,卻早就因為資料漂移、標籤品質下降、特徵管線開始亂補值而整個失真。你如果只看 CPU、記憶體、request rate,那你其實只是在監控管線,根本沒在看模型。這就是為什麼有些團隊明明儀表板全綠,卻還是一直被使用者抱怨。
我喜歡這種 curated list 的原因,是它會把觀測、drift、評估這些東西放在同一個視野裡。你不需要被某個 vendor 洗腦,說什麼「AI 驅動監控」很厲害。你真正需要的是能比較 production input 跟 training input 的工具,能看時間序列變化,能對有意義的 shift 發警報。
實操上,我會把監控分三層:
- 服務層:延遲、錯誤率、吞吐量
- 資料層:缺值、schema 變動、分佈漂移
- 模型層:校準度、precision、recall,或你業務真正關心的指標
如果你只有其中一層,那不叫監控,那叫儀表板。還有,警報一定要導向動作,不要導向焦慮。警報一響,大家要知道是該回滾、重訓、查資料,還是先忽略。沒辦法指向動作的警報,最後只會變噪音。
部署這件事,重點是回滾要像按掉鬧鐘一樣自然
deploy
很多 ML 團隊一講到部署就開始變得很怪。他們可以花幾週調模型,卻把上線當成理所當然。翻譯一下就是:你需要一條從 artifact 到服務的固定路徑,而且回滾不能靠祈禱。
這份清單有用的地方,在於它沒有把部署收斂成單一做法。它把開源世界裡常見的服務、容器化、既有基礎設施整合方式都攤出來。這很重要,因為部署選型跟延遲、流量型態、批次或即時、以及你們團隊能承受多少維運成本都有關。
我以前待過一個團隊,差點想把每個模型都做成客製微服務。聽起來很整齊,實際上是災難。模型一多,框架一亂,Dockerfile 一堆,最後就剩一個工程師在那邊救火。問題不是 inference 本身,而是每個服務的慣例都不一樣,健康檢查不一樣,部署腳本不一樣,連錯誤訊息都不一樣。壞掉時沒人知道是模型錯,還是 wrapper 爆了。
實操寫法:先標準化你的 serving 路徑。選一種包模型的方法、一種對外提供預測的方法、一種更新部署的方法,然後把回滾命令先寫好。你如果現在說不出回滾怎麼做,那你的部署流程還沒準備好。
- 寧可選無聊但穩的部署路徑,也不要每次都玩新花樣。
- 模型介面要穩,內部可以換。
- 用接近真實的 payload 跑完整 serving path 測試。
擴充不是先買 GPU,是先把人工作業砍掉
scale your machine learning
大家一聽到 scale,就想到 GPU、叢集、雲端帳單暴增。這些都是真的,但翻譯一下就是:擴充先從排程和流程開始,不是從硬體開始。如果你的 job 很不穩、pipeline 很脆、重訓還要人工點來點去,那你多買算力只是讓爛流程跑得更快。
這份 repo 的好處是,它把 scale 放在整個工作流裡一起看。順序很對:先把流程自動化,再談平行化、排程、資源分配。你不能拿一個壞流程去放大,這樣只會更慘。
我看過一個推薦系統專案,團隊一直喊訓練太慢,要更多 compute。結果真正卡住的是每次實驗都要人工複製設定檔、手動丟 job、再去翻截圖看結果。那根本不是硬體問題,是作業流程太原始。後來我們做的不是加機器,而是把參數化、工作排程、run tracking 補起來。
實操上,我會先找出 ML 生命週期裡最慢的人工步驟,先把那個自動化。訓練慢就先 profile,部署慢就先把 release path 自動化,實驗慢就先導入 job template 跟 run tracker。很多所謂的擴充,其實只是把人力瓶頸一個個拿掉。
還有一件事我很在意:吞吐量不等於成熟。跑得快但壞掉的 pipeline,還是壞掉。我寧願有一個慢一點但我知道它在幹嘛的系統,也不要一個高吞吐、卻沒人看得懂的黑盒子。
清單真正有價值的地方,是逼你把取捨攤開來
A curated list of awesome open source libraries
我會一直回頭看這種清單,原因很簡單:它不會硬塞你一個標準答案。它只是把菜單攤在桌上。翻譯一下就是:你可以用類別和適配度來比較工具,而不是把某一家廠商的世界觀整包吞下去。
這在 ML 特別重要,因為大多數團隊都不是從零開始。你通常已經有雲、CI、日誌、可能還有 feature store,也可能沒有。這種 curated list 的價值,是讓你能把缺口補上,而不是假裝現有堆疊不存在。我覺得這比那種「一個平台包山包海」的話術誠實太多。
當然,清單也有缺點:如果你不會用,它很容易變成一堆連結墳場。所以我不把它當推薦引擎,我把它當決策輔助。它幫我問更好的問題:我要的是 batch 還是 online serving?我要的是 model registry 還是單純 artifact storage?我要在 feature 層看 drift,還是在 prediction 層看 drift?
實操方式很直接:先用這份 repo 拉一份候選名單,再拿你們真的在跑的流程去測。不要問工具紅不紅,要問它能不能消掉你系統裡一個具體失敗模式。不能,就只是裝飾品。
可抄的模板
# 生產級 ML 堆疊檢查表
把這份模板拿去當你們選工具、補流程、做回滾設計的底稿。
## 1) 先寫清楚模型生命週期
- 資料進來:
- 訓練:
- 驗證:
- 註冊:
- 部署:
- 監控:
- 重訓:
- 回滾:
## 2) 訂出版本控管契約
每次 release 至少要一起記住這些東西:
- 程式碼 commit:
- 資料快照或查詢條件:
- 特徵 schema:
- 訓練設定:
- 模型 artifact:
- 服務映像檔/執行環境:
## 3) 每個責任只選一個工具
- 實驗追蹤:
- 模型註冊:
- 服務部署:
- 工作排程:
- 監控:
- 漂移偵測:
- 特徵管理:
## 4) 先定義警報要對應什麼動作
警報至少要能指向下面其中一個動作:
- 回滾:
- 重訓:
- 查資料:
- 查程式:
- 先忽略:
## 5) 寫好回滾流程
如果模型開始亂吐:
1. 先判斷是資料、程式,還是基礎設施。
2. 回到上一個已知正常的 artifact。
3. 關掉有問題的 release 路徑。
4. 用出問題的那段輸入重新跑評估。
5. 在重新上線前把原因寫清楚。
## 6) 評估每個候選工具時,固定回答這些問題
- 它解的是哪一種失敗模式?
- 它會取代我們現在的什麼?
- 我們能不能重現一次完整 run?
- 我們能不能分開看模型健康和系統健康?
- 出事時能不能不用人工硬救?
## 7) 最低上線門檻
一個模型要算能上線,至少要有:
- 可重現性
- 可觀測性
- 可重複部署的流程
- 回滾路徑
- 明確的 owner
## 8) 候選工具表
| 工具 | 類別 | 解決什麼 | 取代什麼 | 備註 |
|------|------|----------|----------|------|
| | | | | |
| | | | | |
| | | | | |
## 9) 最後的決策規則
選那個最簡單、但能回答下面問題的堆疊:
- 目前線上的是哪個模型?
- 是哪份資料做出來的?
- 它現在表現如何?
- 壞掉時怎麼回滾?
- 下一步誰負責?
這就是我想早點拿到的版本。它不花俏,但很實用。只要工具不能幫你回答上面那些問題,我就不太在乎它 README 寫得多漂亮。
原始來源是 EthicalML/awesome-production-machine-learning。我上面這篇是根據這份 curated repo 延伸拆解出來的原創解讀,不是把 README 重新翻成白話而已。
如果你想順手看幾個具體工具,我會再補看 MLflow、Feast、Evidently,這三個很適合對照這份清單在講的層次。它們各自解的問題不一樣,剛好可以拿來比對你們現在缺哪一塊。