在大型企業的機器學習(ML)開發過程中,最容易被忽視的技術債往往不是演算法本身,而是如何「執行」這些訓練流程。許多團隊在初期為了快速驗證,會直接撰寫 Spark 訓練腳本,但隨著模型數量增加與團隊擴張,這種做法會導致嚴重的維護危機。Yelp 最近推出的內部框架 Training Orchestrator,正是為了解決這種從「實驗室腳本」轉向「工業化生產時遇到的典型問題。
為什麼需要統一的訓練編排器
在導入 Training Orchestrator 之前,Yelp 的各個 ML 團隊各自為政,每組都開發自己的編排邏輯。這導致了三個核心痛點。首先是代碼重複且不一致,每個團隊都要重複撰寫監控、日誌紀錄和配置管理邏輯。其次是強耦合問題,訓練邏輯與 Spark 集群的執行環境緊密綁定,導致工程師無法在本地端運行測試。如果想修改一行代碼,必須提交到集群、等待容器啟動,數小時後才發現是一個簡單的參數錯誤。最後是缺乏可追溯性,由於驗證邏輯散落在各處,很難在不同環境中完全複現之前的訓練結果。
解耦核心:將「要做什麼」與「如何執行」分開
Training Orchestrator 的核心設計理念是將訓練邏輯(What to run)與執行基礎設施(How it runs)徹底解耦。
為了達成這個目標,Yelp 引入了 Pydantic 進行配置驗證。Pydantic 是一個基於 Python 類型提示的數據驗證庫,它能確保在程式碼真正執行前,所有輸入參數的類型和範圍都是正確的。這意味著配置錯誤會在秒級時間內被攔截,而不需要浪費昂貴的集群計算資源去跑幾個小時才報錯。
在執行流程上,該框架採用了 DAG(Directed Acyclic Graph,有向無環圖)模型。DAG 是一種用來描述任務依賴關係的圖形結構,確保任務會按照正確的拓撲順序執行(例如:必須先完成數據清洗,才能開始模型訓練)。透過這種宣告式(Declarative)的定義方式,開發者只需要定義步驟及其依賴關係,而不需要關心底層是如何調度 Spark 任務的。
實務上的工程改善
這種架構變革為工程師帶來了顯著的開發效率提升。首先是本地化測試的實現,由於步驟定義與基礎設施分離,開發者可以使用樣本數據在本地或 Jupyter Notebook 中運行完整管線,並為每個步驟編寫單元測試,大幅縮短了迭代週期。
其次是標準化的輸入輸出模式。每個步驟都被定義為一個函數,並配有明確的輸入與輸出 Schema(模式)。例如,數據準備步驟(PrepareDataStep)明確定義接收什麼數據集並輸出什麼結果。這種模組化讓團隊可以輕鬆更換預處理邏輯,或同時運行多個版本的模型,而無需修改底層的編排代碼。
最後是自動化的追蹤與可複現性。所有執行配置會自動記錄為 MLflow Artifact(產出物)。MLflow 是一個開源的 ML 生命周期管理平台,用於追蹤實驗參數、代碼版本和模型結果。透過將完整配置記錄下來,任何一次訓練都可以透過單一記錄完美複現。
產業趨勢與權衡
Yelp 的做法反映了業界在 ML 平台化上的共同趨勢。例如 Netflix 的 Metaflow 和 Uber 的 Michelangelo 平台,同樣在解決碎片化問題,旨在提供一條從原型開發到生產部署的清晰路徑。
然而,這種中心化框架並非沒有代價。它需要前期的設計投資來定義 Schema 和步驟類型,且現有的舊腳本必須花時間遷移到新的設定與函數契約中。但對 Yelp 而言,這是一種將成本集中化的策略,避免每個團隊在面對同樣的問題時重複支付開發成本。
總結來說,當 ML 團隊規模擴大時,臨時性的腳本編排會成為開發瓶頸。透過建立一個基於配置驅動、支持 DAG 執行且與環境解耦的編排層,能有效提升模型的可測試性、可複現性以及整體的開發速度。
來源:infoq.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。