這裡寫的東西有一個共同點:都在自己的筆電上重現過、跑綠過、或撞壞過。 主要場景是 OpenShift 上的交付鏈——Jenkins、Tekton、Harbor、GitOps——以及圍繞它的供應鏈安全。
配套的 lab 在 ryanGTR/ocp-pipeline-lab:一台有 CRC 的機器,make up,十五分鐘內看到 12 個 task 全綠。
模型那條線在 《從零打造並對齊一個 LLM》:從零刻一個 GPT,把 digest、gate、lineage 同一套紀律搬到模型上,全程可在筆電重現。
Posts
-
所以這個平台到底能不能用
三十天、八個功能、十七道關卡。這篇是總評——不是「好不好」,是一個評估者真正需要的數字:從「官方說有」到「我手上能用」,中間要跨幾關,以及那些關卡誰來跨。 -
怎麼把資料放上平台——以及放上去之後你答不答得出它哪來的
四種把資料弄上平台的方式,各自的代價。但真正的問題不是「怎麼放」——是我查了自己平台上那份 99 MB 的語料,除了檔名、日期、大小之外,什麼都查不到。 -
從 gate 放行到真的上線,中間那一步是空的
我的 pipeline 有完整的四棒、有 gate、有台帳。gate 也真的放行了一顆模型。然後我去查線上跑的是哪一顆——是四天前的另一顆,而且跟這條 pipeline 完全無關。 -
我的驗收清單自己有三個 bug
照文件寫了一份 42 條的驗收清單,實際跑過之後發現三條會誤導——其中一條會讓你以為裝了 80 套 operator。清單也是程式,也要測試。 -
棘輪失效:每一步都合法,二十步之後系統爛掉
我的 gate 規則是「不能比現行版差超過 tol」。這條規則有一個結構性缺陷:每次退一點點都合法,二十次之後累積退步 0.84——而每一步都通過了檢查。 -
三十天對帳:我量錯的四次
這個系列每一篇都在講「別人的檢查沒在檢查」。這篇算我自己的帳:三十天裡我量錯四次,其中兩次差點寫進要交出去的文件。 -
假綠的五種形態
這三十天我在同一套平台上撞到五種「顯示正常但實際壞掉」。它們的共同點不是 bug,是檢查本身的設計缺陷——而且每一種都有一句話可以戳破。 -
私有 registry:為什麼 image 跟模型要分開放
同一份東西,image 進 registry、模型進 S3。這個分法不是潔癖,是因為兩者的生命週期完全不同——以及它怎麼決定你的放行流程長什麼樣。 -
3.x 不會幫你開對外入口:「上線了」和「打得到」是兩件事
ISvc 顯示 READY=True,你拿到的網址卻是 .svc.cluster.local。這是 2.x 換到 3.x 之後最容易忽略的一個差別,而它會在驗收當天才爆出來。 -
Kueue:CRD 說可以,webhook 說不行
把 kueue 設成 Managed 被拒絕,但 CRD 的 enum 裡明明還列著 Managed。這篇是兩層驗證不一致的實例,以及它對「照文件做」的意義。 -
線上的 LLM 要監控什麼、怎麼評估
一般服務壞掉會回 500,LLM 壞掉會回一個看起來正常的答案。所以只盯錯誤率和延遲等於沒監控。這篇是四層指標、埋法、以及「監控」和「評估」為什麼是兩件事。 -
ODH Dashboard 實際長怎樣:一個 project 從頭走到尾
前幾篇都在講 YAML 和指令。這篇改用畫面走一次:project 怎麼建、pipeline 上傳在哪、run 從哪裡看、產出物在哪一頁——以及每一頁上哪個欄位是真的要看的。 -
離線鏡像:operator 宣告 2 顆,實際跑起來要 76 顆
在內網裝 OpenShift AI,最大的坑不是「怎麼鏡像」,是「鏡哪些」。operator bundle 給你的清單,跟實際要跑的差了一個數量級。 -
pod 要到卡 ≠ 模型算在卡上
GPU 被 pod 佔住、但模型其實跑在 CPU 上——這是最貴的一種失敗,而且所有你會看到的畫面都是綠的。這篇是分辨它的唯一乾淨訊號,以及 3.x 的 Hardware Profile 怎麼設。 -
Connection 其實是一個貼了 label 的 Secret
OpenShift AI 的「Connection」不是 CRD。這篇講它到底是什麼、怎麼建,以及為什麼你的 pipeline 明明在用 S3,dashboard 上卻顯示「沒有 connection」。 -
Workbench 被 webhook 擋住了——四個指令查到根因,以及一個我答不出來的問題
兩個 admission webhook 擋住 Notebook 建立。這篇是查根因的過程、一個撐得過重啟的修法、以及一個我查不出答案的矛盾——同一個叢集上有一個五天前建的 Notebook 好好地跑著。 -
Model Registry:登記成功,但每一個值都是 0
OpenShift AI 的模型台帳。這篇從開元件、備 DB、建實例到用 API 登記一顆模型全走一次——最後在 API 上踩到一個會讓你的治理數據全部歸零、而且不會報錯的坑。 -
DataScienceCluster:整套平台的總開關
一個 CR 決定你的叢集上有哪些 AI 元件。這篇講它是什麼、什麼時候你會動到它、怎麼改,以及為什麼「先全開再說」是最貴的選擇。 -
你的門檻憑什麼是 0.05:先去量你的 σ
我的 promotion gate 用 tol=0.05 判斷模型有沒有退步。那個數字是我填的,沒有依據。這篇是把它量出來的過程,以及為什麼你該借的是管制圖而不是 p 值。 -
RBAC 缺權限不會回 Forbidden,它會讓 controller 逾時自殺
兩個 controller 冷啟動後 CrashLoopBackOff,log 停在一行 cache sync 逾時。看起來像網路慢,實際上是權限。這個錯誤訊息我在網路上一筆都搜不到。 -
Day 10:InferenceService——把模型變成一個 API
訓練完了,接下來要讓別人打得到。這篇講 KServe 的兩條部署路線、什麼時候該選哪一條,以及每一步怎麼確認它真的起來了。 -
Day 9:第一條 Data Science Pipeline
notebook 跑得動不代表下個月還跑得動。這篇講 DSPA 是什麼、怎麼開起來、怎麼把一段 Python 變成一條會留下紀錄的 pipeline。 -
在 OpenShift AI 上搭一條四棒的模型交付鏈
prepare → train → evaluate → gate。用 Python 寫、編成 YAML、丟上平台跑。這篇是最小可用版本,以及三個當初卡住我的設定。 -
Day 8:Workbench——把 notebook 搬到叢集上
Workbench 就是跑在叢集上的 JupyterLab。這篇講它跟你筆電上的 notebook 差在哪、怎麼開一個、資料和 GPU 怎麼接進去。 -
InferenceService 到底幫你生了什麼
41 行 YAML,換來一個 Deployment、一個 Service、一個自動塞進去的 init container,和三個容器。這篇把它拆開看,並說明哪一樣它不會幫你生。 -
我用錯的量法,差點讓我把工作量翻倍
一個自訂的字數上限,一批「全部超標」的稿子,一個差點做出的錯誤決定。問題不在稿子,在量法。 -
Day 7:把儲存接上——叢集裡的東西怎麼讀到你的資料
workbench 要讀訓練資料、pipeline 要存產物、模型服務要抓權重——都靠這一份設定。這篇是怎麼建、怎麼給不同的東西用、以及怎麼確認它真的能用。 -
怎麼自動截 OpenShift console 和 Grafana 的圖
寫平台文件要大量截圖,手動截會過期。用 Chrome DevTools Protocol + OAuth cookie 全自動化,四個坑一次講完。 -
Day 6:Dashboard 導覽——每個分頁在做什麼
你的資料科學家不會用 oc,他們會打開那個網頁。這篇把 dashboard 每一頁走一次,標出哪一欄是真的要看的。 -
容器裡沒有 curl,而且 port 不是 8080
兩個會讓你在 KServe 上浪費半小時的小事。都不難,但都不會寫在教學裡。 -
Day 5:DataScienceCluster——平台元件的總開關
裝完 operator 之後,平台上什麼都沒有。要有東西,得先建 DataScienceCluster。這篇講它管什麼、怎麼開關元件、怎麼讀它的狀態。 -
監控上線了,九個面板全是壞的
Grafana pod Running、Prometheus target up、dashboard 開得起來——而九個面板一個資料都查不到。根因是一個沒填的欄位。 -
Day 4:在一台筆電上裝一套 OpenShift AI
用 CRC 在自己的機器上跑一套完整的 OpenShift AI。從資源規劃、裝 operator、建 DataScienceCluster,到確認每個元件真的起來——含每一步的驗證指令。 -
Day 3:先問一句——這些用 podman 做不行嗎?
社群教的是 podman 和 docker compose,而且它走得比多數人以為的遠。這篇是我兩邊都做過之後的對照:podman 版做得到什麼、在哪裡斷、以及那個交叉點在哪。 -
平台全綠,但服務是死的
冷啟動之後,DSC 說 KserveReady=True,opendatahub 的 pod 零異常,而模型服務是死的。根因在叢集外面——而叢集的健康檢查只看得到叢集裡的東西。 -
三顆一樣的模型,一顆上線兩顆被擋
同一條 pipeline、同一份資料、同樣的步數,三次訓練出來的模型能力幾乎相同:7.2343 / 7.2370 / 7.2428。一顆上線,兩顆被 gate 擋下。決定它們命運的不是模型。 -
Day 2:一張圖看懂 OpenShift AI 有哪些東西
KServe、Kubeflow、Model Registry、TrustyAI、Kueue、Ray、Feast——官網一個一章,但沒有一章說它們是什麼關係。這篇把它們排進 MLOps 流程,每一步標出關鍵指標。 -
一張版本試紙:怎麼三分鐘看出對方手上的文件是 2.x 的
五個 oc 指令,每個都會直接告訴你這套 OpenShift AI 是 2.x 還是 3.x。附一個我今天才發現的坑:你寫 RawDeployment,叢集會靜默改寫成 Standard。 -
Day 1:這 30 天要教什麼
如果你被交辦「評估一下 AI 平台」,而你會 k8s、不會 ML —— 這個系列是寫給你的。三十天,一天一個工具或一個決定。 -
同一條 gate,三種分母,三種結論
品質閘門擋下了我的模型,我很滿意——護欄有在擋。然後我去看它擋的理由,發現那個數字只可能是 0 或 100。修了兩次分母之後,同一份資料、同一組門檻,我得到三種結論;而修好之後,我又弄丟了另一個模型的身分。 -
llm-d 我跑不起來——但我可以告訴你它需要什麼
CRD 全都在,但三個前置一個都不滿足。這篇不是教學,是一份「你評估 llm-d 時該問廠商什麼」的清單——而叢集自己就會把缺什麼講出來。 -
我的漂移監控說「該重訓了」。它是錯的。
服務上線後什麼時候該重訓 LLM?我的監控回 retrain_suggested: true。查下去發現:它在零漂移的情況下也會這樣說,因為樣本太小。這篇是那個 bug 的解剖,以及一組不會騙你的觸發訊號。 -
OpenShift AI 3.x:為什麼你搜到的教學會壞給你看
2.x 是把 AI 平台架在 Service Mesh / Serverless 上,3.x 把那層整個拆掉。網路上的教學絕大多數是 2.x 的,照做會缺 operator、模型上線模式不同、GPU 設定物件換了名字——而且 2.25 不能升級到 3.x。這篇列出實測到的差異與一組可以當場用的檢查。 -
全景圖:從一台筆電到一個被治理的模型服務
官網文件是按元件分章的——裝什麼、怎麼用某個功能。缺的是「一條完整的路走一次」。這篇是那張圖,標出官網講到哪、我補在哪,以及一個官網目前還在教 2.x 做法的實例。 -
SBOM 有了,還是答不出「誰在用」:四個實測
把成品 digest 綁進 SCA 平台、把依賴樹入帳、把匯出打開——每一步都成功。然後逐條去驗,四件事是錯的,其中兩件是我自己算錯的。 -
哪一步、用什麼工具、看什麼指標
七個流程步驟,各對應哪個工具,以及那一步的關鍵指標——而指標分成「跑完了」和「做對了」兩欄,因為它們是完全不同的兩件事。附官方教學用幾個工具的對照。 -
這一堆工具各是誰:OpenShift AI 的角色分工表
KServe、DSPA、storage-initializer、MinIO、Harbor、Prometheus、cert-manager⋯⋯第一次看到會矇。這篇把每個角色用一句話定位、對應到流程哪一步、以及那一步該看什麼指標——並區分「跑完了」和「做對了」。 -
儀表板全綠,四件事還是錯的:OpenShift AI 驗收實錄
在 lab 上把 Open Data Hub 裝起來、把模型上線、把 pipeline 跑完,全程綠燈。然後逐條去驗,發現四件事是錯的——而且每一件都是靠看儀表板永遠看不出來的。 -
從零刻一個 GPT,然後把交付鏈的紀律套上去
一本線上書、十一章、全程可在筆電重現。模型只有 8M 參數,重點不是模型,是四次『以為對、量了才知道錯』——以及 digest、gate、lineage 這套交付鏈的東西原封不動搬到模型上。 -
用 CRC 在筆電上重現一條企業 OpenShift 交付鏈
Jenkins 帶參數建置 → Tekton 11 個 task → Harbor → GitOps repo,加上變更單號閘門與人工放行。一台有 CRC 的機器,make up,十五分鐘。 -
OpenShift 上的 Tekton buildah 不需要 privileged:SCC、SETFCAP 與 vfs
IBM Cloud-Native Toolkit 的 build task 預設 privileged: true。在沒有 privileged SCC 的 SA 上會 PodAdmissionFailed;其實只要 SETFCAP 加 vfs storage driver 就能跑。 -
tkn pipeline start --showlog 會讓 Jenkins 永遠綠
Jenkins 用 tkn 觸發 Tekton 是很常見的組合。--showlog 把 log 串回來很方便,但它不會把 PipelineRun 的失敗變成非零 exit code——Jenkins 看到的永遠是 SUCCESS。
subscribe via RSS