ZenML 0.96.x:把 pipeline 與 agent 一起收進同一個 stack 抽象
ZenML 🙏: One AI Platform from Pipelines to Agents. https://zenml.io.
秒懂
- 它是什麼?
- ZenML 用 client-server 架構與 stack 抽象,把「程式碼容器化、執行追蹤、基礎設施切換」三件事從使用者的 Python 邏輯裡抽走。它適合已經有明確部署環境、需要可觀測性的 ML 與 LLM 團隊;若只是單機跑幾段腳本,這層抽象的成本會先於收益出現。
- 適合誰用?
- 如果你的團隊已經有多個執行環境要切換、需要把每次訓練或 agent 執行的 metrics、logs 與 metadata 留在同一個地方,ZenML 的 stack 抽象值得花時間評估。若你只是單機跑幾段腳本、或已經有一套運作良好的排程系統且不想再引入一層 Python 框架,它帶來的設定負擔會大於好處。
- 可以商用嗎?
- 可以。Apache-2.0 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
- 還在維護嗎?
- 有在維護。儲存庫在最近一天內有新的提交。
- 用什麼語言寫的?
- 主要是 Python(依據 GitHub 的語言統計)。
以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。
開源專案深度解析
ZenML 想解決的是切換環境時的反覆重寫
多數 ML 團隊的痛點不在模型程式碼,而在程式碼外面那圈東西。本機用一個排程器跑得通的訓練流程,搬到雲端要改寫路徑、改寫憑證讀取、改寫日誌輸出;換一個實驗追蹤工具,又要再改一輪。ZenML 的定位是把這圈東西變成可替換的設定,而不是散落在程式碼裡的分支。README 的敘述很直接:使用者寫的是 pipeline,pipeline 跑在 stack 上,stack 代表某個基礎設施後端。
它鎖定的對象寫得很清楚,是「在公司情境下工作、處理傳統 ML、LLM workflow 或 agent 的 ML 或 AI 工程師」。這句話有兩個關鍵限定。第一是公司情境,代表有部署環境、有協作需求、有稽核壓力。第二是把 agent 和傳統 ML 並列,這在 0.96.x 這個版本線上是一個明確的產品選擇:同一個 pipeline 抽象要同時承接訓練迴圈與 agentic loop,README 也提到可以在 pipeline 裡嵌入「running an agentic loop」。
反過來說,如果你的工作是把一份 CSV 讀進來、跑一次 sklearn、印出分數,ZenML 不會讓這件事變快。它的價值來自重複執行與環境切換,一次性腳本沒有這兩個前提。
client-server 拆分與 stack 抽象是兩個獨立的決定
ZenML 的架構是 client-server,並且附帶一個獨立的 web dashboard(repository 指向 zenml-io/zenml-dashboard)。這個拆分在 README 裡有兩種安裝路徑對應:本機開發用 pip install "zenml[local]",client 與 server 都跑在本地;正式環境則是把 server 單獨部署,客戶端用 pip install zenml 加 zenml login <server-url> 連上去。
值得停下來想的是這兩個決定可以分開評價。client-server 拆分帶來的是集中式的執行紀錄與跨團隊可見性,代價是你多了一個要維運的服務,以及一個必須保持連線的元件。stack 抽象帶來的是同一份 pipeline 程式碼可以在不同後端上執行,代價是抽象層本身要學,而且當底層後端有特殊行為時,你得先確認這層抽象有沒有留出口。
README 列出的五項 operationalize 內容裡,第一項是自動容器化並追蹤程式碼,第二項是追蹤個別執行的 metrics、logs 與 metadata。這兩項都依賴 server 端存在,所以如果你選的是純本機模式,實際上你得到的是單機版的紀錄,而不是團隊共享的紀錄。這個差別在評估初期很容易被忽略。
從 pip install 到 zenml login 的最小路徑
README 給的入門步驟只有四行,值得照抄下來對照:
pip install "zenml[server]" zenml init zenml login
第一行旁邊有個註解說明 pip install zenml 會裝到較精簡的 client。同一份 README 在架構段落又給出第三種組合 pip install "zenml[local]",用於本機同時跑 client 與 server。三個安裝選項對應三種拓撲,這在實務上是最容易出錯的地方:你以為裝了完整版,實際上裝到的是 client,然後在 zenml login 這一步才發現連不上。
zenml init 會在當前目錄建立 ZenML repository,README 稱之為初始化 repository。之後 zenml login 可以啟動本機 server,或連向遠端。README 建議從 examples/quickstart/ 開始,並說明該範例示範的是 pipeline、step、artifact、snapshot 與 deployment 這幾個核心概念。這五個名詞構成了 ZenML 的基本詞彙表,其中 snapshot 這個概念值得注意,它暗示每次執行綁定的是一份特定版本的程式碼與設定組合,而不只是當下的檔案狀態。
至於要接哪些外部系統,README 點名了 MLflow、Langgraph、Langfuse、Sagemaker、GCP Vertex 等。清單本身是行銷式的舉例,不是完整支援矩陣,實際可用的整合項目要回到 docs.zenml.io 查。
stack 抽象真正的限制在於底層行為的滲漏
ZenML 的核心承諾是同一份 pipeline 跑在任意 stack 上。這個承諾在底層後端行為相近時成立,在行為差異大時就會打折。排程觸發方式、資源配置語法、日誌收集機制、artifact 存放位置,這些在不同後端之間本來就不一致。抽象層能抹平一部分,但抹不平的部分最終仍要以某種形式出現在設定裡。
這不是 ZenML 獨有的問題,任何做多後端抽象的框架都會遇到。重點是評估時要問:我實際會用到幾個後端?如果答案是一個,那 stack 抽象帶來的是純粹的學習成本,而不是彈性收益。很多團隊是在已經有多雲或多環境需求之後才引入這類工具,順序反過來的話,通常會覺得框架很重。
另一個限制是版本節奏。從 release 紀錄看,0.96.2 在 2026-07-17、0.96.3 在 2026-08-07、0.96.4 在 2026-09-04,大約每三到四週一個 patch。這個頻率本身不算激進,但意味著鎖定版本、定期升級是必要的工作,而不是選項。把 ZenML 當成裝好就不動的依賴,在這種節奏下會累積升級債。
和 Airflow 的差別在於抽象放的位置
拿 Airflow 來對照最能說明 ZenML 的取向。Airflow 是排程器優先:你先有一個 DAG,DAG 描述任務之間的依賴與時間關係,任務內容是 Python 可呼叫物件。基礎設施的處理、artifact 的傳遞、實驗追蹤,這些要你自己接。它的強項是排程語意完整、生態成熟、維運經驗容易找到人。
ZenML 是抽象層優先:你先寫帶型別的 step 與 pipeline,執行環境由 stack 決定,artifact 與 metadata 由框架自動記錄。排程不是它的核心賣點,可觀測性與環境可替換性才是。
這個差別會反映在導入時的爭論上。如果團隊的既有工作流大量依賴 Airflow 的排程語意,例如複雜的補跑邏輯、跨 DAG 依賴、SLA 告警,那 ZenML 不會取代這些,比較合理的做法是讓兩者各司其職。反過來說,如果團隊的痛點是「每次換環境就要重寫一輪程式碼」或「跑過的實驗找不到對應的 artifact」,那 Airflow 本來就不打算解決這兩個問題,ZenML 才是對的層級。
README 把 ZenML 描述為整合既有工具,而不是取代它們,這個定位和上面的一致。
Apache-2.0 與 Pro 版本之間的分界要自己確認
repository 的授權是 Apache-2.0,這是一個寬鬆授權,允許商業使用、修改與再散布,通常也包含專利授權條款。對企業內部使用而言,這個授權本身不構成採用障礙。
但 README 同時放了「Sign up for ZenML Pro」的連結,這代表存在一個閉源或商業授權的版本。開源 repository 與 Pro 版本之間的功能邊界,README 沒有交代,我也不會替你推測。實際要做的動作是:列出你打算用的功能,逐項確認它落在哪一側。特別是當你把 ZenML 放進正式環境的關鍵路徑時,這個確認不能等到採購階段才做。
這裡不涉及法律意見。授權條款的解讀、以及 Pro 版本合約的內容,應該由你們自己的法務或採購流程處理。技術評估能提供的是功能清單,不是授權結論。
維護成本方面,可從 release 節奏推得的是:每三到四週會有一個 patch,你需要在 CI 裡固定版本並安排升級窗口。README 指向 docs.zenml.io/changelog 作為變更來源,這是升級前應該先讀的地方。
該不該採用,取決於你有幾個執行環境
把判斷收斂成一個問題:你現在需要讓同一份 pipeline 程式碼在幾個不同的基礎設施上跑?如果答案是兩個以上,而且切換時確實造成重複工作,ZenML 的 stack 抽象就是在解決你的問題。如果答案是一個,而且短期內不會變,那這層抽象現階段只是多學一套 API。
第二個問題是:你需要跨團隊共享執行紀錄嗎?如果需要,那 client-server 拆分與 dashboard 是實質價值,你要準備的是 server 的部署與維運。如果只是個人或小組在本機迭代,pip install "zenml[local]" 這條路徑足夠,但別期待它提供團隊級的可見性。
第三個問題關於 agent 工作流。README 把 agent 與傳統 ML 並列,並提到 examples/agent_comparison/ 這個範例,內容是「以 LangGraph workflow、LiteLLM 整合與透過自訂 materializer 自動產生視覺化來比較 AI agent」。這是目前材料裡唯一具體的 agent 相關線索。如果你的主要場景是 agent,建議先跑這個範例,確認它的抽象方式符合你對 agent 狀態與工具呼叫的想像,再決定要不要往下投資。
最後提醒一個容易踩到的細節:pip install zenml 與 pip install "zenml[server]" 裝到的東西不同,前者是精簡 client。在你把安裝指令寫進 Dockerfile 或 CI 設定之前,先確認你要的是哪一個,因為這個差別會在 zenml login 那一步才顯現。
編輯結論
如果你的團隊已經有多個執行環境要切換、需要把每次訓練或 agent 執行的 metrics、logs 與 metadata 留在同一個地方,ZenML 的 stack 抽象值得花時間評估。若你只是單機跑幾段腳本、或已經有一套運作良好的排程系統且不想再引入一層 Python 框架,它帶來的設定負擔會大於好處。動手前先確認三件事:zenml init 之後產生的 repository 結構是否符合你的版控習慣;你要用的 orchestration 與 experiment tracking 後端是否在支援清單內;以及你的團隊要連的是自架 server 還是 ZenML Pro,因為 pip install zenml 與 pip install "zenml[server]" 裝到的東西並不相同。
社群筆記