三十篇寫完了。這篇回答那個所有人真正想問的問題。

先給答案:能用。 我今天把原本壞掉的三個功能都修好了, 現在模型服務、pipeline、workbench、監控、台帳全部跑得起來。

但「能用」這兩個字,藏了一天的工和七個坑。


⭐ 一個評估者真正需要的數字

不是「這個平台有沒有 X 功能」——那個答案永遠是「有」。

是這個:從「官方說有」到「我手上能用」,中間要跨幾關。

功能 官方 實際跨幾關 是哪幾關
模型上線(KServe) 3 依賴在叢集外/3.x 不幫你開 Route/服務答不出自己是誰
Pipeline(DSPA) 1 caching 預設開著,你會看到全綠但什麼都沒跑
Workbench 3 admission webhook 擋下/CPU 排不進去/鏡像 digest 不符
Model Registry 3 namespace 被寫死/CR 與 API 版本號不一致/camelCase 欄位被靜默丟成零值
監控(Prometheus+Grafana) 1 datasource 沒給 uid,九個面板全查不到資料
離線鏡像 2 relatedImages 只宣告 2 顆而實際 76 顆/IDMS 用 digest 比對
GPU ?* pod 要到卡 ≠ 模型算在卡上
Kueue 1+ Managed 被拒,要自己裝 RHBOK
llm-d 3+ Connectivity Link + LeaderWorkerSet + 多 GPU 多節點

* GPU 那條我的環境驗不了(CRC 看不到卡),但那個「要到卡 ≠ 算在卡上」的陷阱是在主機上實測過的。

八個功能,十七道以上的關卡。

而其中沒有任何一關寫在官方文件上


這些關卡長什麼樣

我把它們分類之後,發現只有三種:

① 平台自己的 bug(4 關) Workbench 的 webhook(有 JIRA 編號,PR 還 open)、 Model Registry 的 camelCase 靜默丟值、KServe controller 的 RBAC 缺漏、 內建 imagestream 指向不存在的 tag。

這類你修不了根,只能繞。 而繞的方法要自己找。

② 設計如此,但沒人告訴你(7 關) 3.x 不幫你開 Route、模型和 image 分開放、Connection 是貼 label 的 Secret、 IDMS 用 digest 比對、Kueue 要走 Unmanaged、caching 預設開著、 Model Registry 要你自己準備資料庫。

這類最花時間,因為你會以為自己做錯了,而其實是不知道規則。

③ 資源與環境(6 關) CPU 不夠排不進去、鏡像不完整、GPU 沒 passthrough、多節點做不到。


誰來跨這些關卡——這才是驗收該問的

上面那張表對你有用的地方不是數字,是下一個問題

這十七關,誰來跨?

三種可能,而且代價差非常多:

誰跨 發生在什麼時候 代價
廠商(在交付前) PoC 階段 已包含在合約裡
(在驗收時發現) 驗收階段 要求補件,時程延後
(在上線後撞到) 正式環境 最貴。而且通常在半夜

如果驗收只問「功能有沒有」,那十七關就會全部落到第三種。

因為每一關都符合「功能是有的」這個描述。


所以驗收該怎麼問

把整個系列壓成一句:

不要問「有沒有 X」,要問「請當著我的面,把 X 從零做一次」。

而這個「做一次」有三個必要條件,缺一個就無效:

  1. 當著你的面——不接受截圖,因為所有壞掉的東西都能截出一張好看的圖
  2. 從零——不是操作一個已經配好的環境
  3. 完整走完——包括最後那個「真的能用」的動作(打端點、開 workbench、看面板)

我在這三十篇裡整理出來的六步驗收腳本是:

建 project → 設 connection → 建 workbench 並開啟
→ 上傳並跑一次 pipeline → 看 run 的 input parameters
→ 部署模型並從叢集外打一發推論

六步,每一步都會踩到上面那張表裡的某幾關。


平心而論:它好的地方

寫了三十篇的坑,也該說公道話。

① 3.x 比 2.x 好,而且是結構性的好。 把 Knative/Service Mesh 那層拿掉之後,排錯回到 oc get deploy/pod/svc—— 你原本會的 Kubernetes 技能直接可用,不用先學一整套中介層。 代價是路由和伸縮要自己接,但那是可預期的成本,不是黑盒子

② 所有東西都是標準 k8s 物件。 DSC、ISvc、Notebook、webhook、CSV——全部查得到、改得動、看得懂。 今天我能在四個指令內查出 Workbench 的根因,就是因為它沒有把資訊藏起來

③ 錯誤訊息雖然常常誤導,但底層資訊都在。 「scaled to zero」不是真正的原因,但 oc describe podFailedScheduling; 「cache sync timeout」很誤導,但 oc auth can-i --as= 一問就知道。 它不會騙你,只是不會主動告訴你。


我的建議

如果你在評估要不要導入:

值得導入,但把上面那張「跨幾關」的表帶進合約談判。 明確約定哪幾類關卡由誰負責——尤其是第②類(設計如此但沒人告訴你), 那類最容易變成「這不在我們的範圍內」。

如果你已經在導入:

先跑那六步。每一步的失敗都比你想的更早出現,而且更容易修—— 在 PoC 階段修一個 webhook 是半天,在正式環境是一個變更視窗。

如果你是被交辦要驗收的人:

你真正的產出不是一份「全部通過」的清單, 是一份「這幾關是誰的責任」的紀錄

因為半年後系統出事時,沒有人會問「當初驗收有沒有通過」, 他們會問「這件事當初有沒有人知道」。


最後

這三十篇裡我自己量錯了四次,其中一次差點把錯誤寫進要交出去的驗收條件。

所以最後這句同時是給你的,也是給我自己的:

每一個「已經確認過」的結論,都有一個沒有被重新驗證的日期。

而那個日期,通常比你以為的更久以前。


如果你導入過類似的平台,你的「跨幾關」大概是多少?哪一關最貴?

🧪 這篇的實驗環境與 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.2openshift-gitops-operator.v1.21.3

DataScienceCluster 開啟的元件

  • kserveaipipelinesdashboardworkbenchesmodelregistrykueue(Unmanaged)
  • 其餘(raytrustyaifeastaigateway…)為 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-* 那一套)。 指令的邏輯可以照用,字串要自己對一次。