三十天走完了

前面二十九天,每一天講一個工具或一個決定。

這一天把它們收成一張表。每一列對應一天,寫的是那天最該記住的一件事—— 不是摘要,是你動手時真的會用到的那句。


第一部:認識平台(1–5)

# 一件事
1 這不是 ML 的問題,是平台的問題。 你缺的不是模型知識,是「這些工具怎麼串」
2 平台不包含現成模型、自動重訓、自動擋模型上線。期待錯了後面全錯
3 先問「podman 做不行嗎」。 勾不到兩個斷點就別導——這是這 30 天最省錢的一個結論
4 用 ODH 在筆電上裝一套。每條指令你都能自己跑一次,不用等採購
5 DataScienceCluster 是總開關。⚠️ Ready=False 不代表故障——Removed 的元件也被算進去

第二部:八個核心工具(6–13)

# 一件事
6 Dashboard 上的每個動作都是在產 CR。做一次,然後 oc get -o yaml 看它產了什麼——最快的學法
7 Connection 不是 CRD,是貼了 label 的 Secret。dashboard 顯示正常 ≠ 憑證能用,要真的連一次
8 Workbench 只有 PVC 掛載的目錄會留下來。pip install 的東西不會
9 Pipeline 的價值不在排程,在血緣。Output[Dataset] 幫你記了誰產生誰
10 STORAGE_URI 讓權重不進 image。換模型不用重 build——這是 KServe 最實在的好處
11 部署前先問:我的格式有沒有現成的 runtime? sklearn/xgboost/onnx 都有
12 Model Registry 不在必經之路上,所以最容易被跳過,然後就沒人答得出「線上是哪版」
13 pod 拿到卡 ≠ 模型在卡上。 只有 nvidia-smi --query-compute-apps 分得出來

第三部:一條完整的路(14–18)

# 一件事
14 七站六個交接點,②④⑤ 三段平台不會幫你做。評估成熟度就看這三段是人工還是自動
15 MLMD 記的是路徑不是內容。檔案被換掉,紀錄不會知道——所以要記 digest
16 監控先接延遲、錯誤率、吞吐、輸入分布四個。少於四個會有盲區
17 換版之後 sha256sum /mnt/models/。「換了」和「以為換了」看起來一模一樣
18 在你需要回滾之前,先回滾一次。 沒演練過的回滾等於沒有

第四部:企業環境的現實(19–24)

# 一件事
19 離線有三件事:搬 image、改路由、給權限。三件錯誤訊息不一樣,照症狀分類別亂試
20 用 kubeadmin 測,你永遠不會發現權限問題。 建個測試帳號走一次
21 「怎麼存」大家都會,「怎麼換」才會出事。輪替要排時間
22 官方最低需求是「平台起得來」,不是「你能做事」。requests 超過 80% 就開始排不進去
23 看到 Serverless / ModelMesh / Accelerator Profile=2.x 的教學。而 2.x→3.x 沒有升級路徑,是重建
24 正式環境的模型部署走 Argo——「誰按了 merge」就是核准紀錄,最便宜的合規補法

第五部:驗收與治理(25–30)

# 一件事
25 每條驗收問一次:「環境是壞的時候,這條會不會發現?」 不會就是白寫
26 五種假綠同一個結構:你檢查的是「有沒有」,不是「對不對」
27 平台給的是「可以擋」,不是「在擋」。 護欄要驗過它會擋,才算存在
28 定門檻之前先量雜訊。抄來的門檻只有兩種結局:永遠不響,或一直響
29 Q2/Q3/Q4(怎麼訓的、誰核准的、做了哪些檢查)事後補不回來
30 ——見下

第 30 條

這三十天裡,我改口最多次的一句話是:「它看起來是好的。」

Grafana 九個面板是空的,但 Prometheus 有資料。 Pipeline 是綠的,但 step 什麼都沒做。 閘門通過了,但線上跑的還是舊模型。 GPU 被佔著,但模型在 CPU 上算。

這些沒有一個是「壞掉」——每一個都是「看起來是好的」。

所以第 30 條是:

每一個你相信的綠燈,去找出它在事情沒發生時會不會也是綠的。

這件事不需要更好的工具,只需要多問一層。 而它是我在這三十天裡學到最有用的東西。


這個系列的界線

最後把話說清楚:

能給你的:這些工具怎麼用、怎麼壞、怎麼驗。 每條指令都在我自己筆電的 CRC lab 上跑過。

不能給你的:

  • 多節點的行為(排程、HA、跨節點網路)——我只有單節點
  • 真實負載下的效能——CPU 上跑 LLM 的數字不能外推
  • 你們的合規要求——去問法遵
  • RHOAI 商業版的差異——我用的是 ODH

以及:這裡沒有一個字是我任職單位的做法。 全部來自我自己的 lab。


如果你只做三件事

清單三十條太長的話,這三件的投報率最高:

  1. Day 23 的資源盤點——一行指令,避免最貴的規劃錯誤
  2. Day 28 的反向測試——挑一道門,故意弄壞,看它會不會擋
  3. Day 30 的七題演練——挑一個模型,計時答完

三件事一個下午做得完,而它們會告訴你缺哪一塊。


謝謝讀完

寫這三十篇的過程中,我修正了不少自己原本以為對的事—— 有些是官方文件已經過時,有些是我自己設計的檢查沒在檢查。 這些修正比原本的內容有價值。

如果你照著做的時候發現我寫錯了,或是你的環境行為不一樣, 留言告訴我。我會查、會改、會標明是誰指出的。


這三十條裡,你們現在做到幾條?

🧪 這篇的實驗環境與 lab 檔案(最後更新 2026-08-30)

叢集

  • CRC 2.63.0 · OpenShift 4.22.7 · Kubernetes v1.35.6
  • 單節點:13 vCPU / 40 GiB RAM / 120 GB disk
  • 宿主:Framework Laptop 16(Ryzen AI 7 350 · 8C/16T · 64 GB RAM · 1 TB NVMe · RTX 5070 顯卡模組)
  • ⚠️ 叢集內看不到 GPU(CRC 是 VM,RTX 5070 未 passthrough)

Operator

  • opendatahub-operator.v3.5.0 ← 即 RHOAI 3.x 的上游開源版
  • cert-manager-operator.v1.20.0(3.x 的必要相依;2.x 不需要)
  • openshift-pipelines-operator-rh.v1.23.2、openshift-gitops-operator.v1.21.3

DataScienceCluster 開啟的元件

  • kserve、aipipelines、dashboard、workbenches、modelregistry、kueue(Unmanaged)
  • 其餘(ray/trustyai/feast/aigateway…)為 Removed

叢集外的依賴(跑在宿主的 podman 上,crc start 不會帶起來)

  • Harbor v2.15.2(私有 registry)· MinIO(S3)

模型端

  • Python 3.12.13 · PyTorch 2.11.0+cu128 · FastAPI + uvicorn · prometheus-client

lab 檔案

⚠️ ODH ≠ RHOAI:元件同源,但 namespace 與部分名稱不同 (我這裡是 opendatahub,商用版是 redhat-ods-* 那一套)。 指令的邏輯可以照用,字串要自己對一次。