設定好實驗後,下一步就是將其應用到 Kubernetes 叢集中並監控進度。
啟動實驗
使用 kubectl 命令將實驗設定應用到叢集:
kubectl apply -f random-example.yaml
監控實驗進度
可以透過命令列檢查實驗狀態:
kubectl -n kubeflow describe experiment random-example
這個命令會回傳實驗的詳細訊息,包括:
- 實驗狀態:建立時間、當前狀態等
- 最佳試驗:目前為止效能最好的參陣列合及其指標
- 試驗統計:成功、執行中和失敗的試驗數量
在實驗輸出中,最值得關注的部分是「Current Optimal Trial」,它顯示了目前找到的最佳參陣列合:
Current Optimal Trial:
Observation:
Metrics:
Name: Validation-accuracy
Value: 0.981091
Parameter Assignments:
Name: --lr
Value: 0.025139701133432946
Name: --num-layers
Value: 4
Name: --optimizer
Value: sgd
這告訴我們,目前最佳的模型使用學習率約為 0.025,4 層神經網路,以及 SGD 最佳化器,達到了 98.1% 的驗證準確率。
Katib 使用者介面:視覺化實驗管理
除了命令列操作外,Katib 還提供了一個直觀的使用者介面,讓實驗管理和監控變得更加簡單。
存取 Katib UI
如果你已經佈署了 Kubeflow,可以透過以下步驟存取 Katib UI:
- 在 Kubeflow 導航面板中點選「Katib」
- 在首頁上選擇「Hyperparameter Tuning」
透過 UI 建立實驗
Katib UI 提供了兩種建立實驗的方式:
- 直接貼上 YAML:將準備好的 YAML 設定貼上到文字框中
- 使用表單介面:透過填寫表單來設定實驗引數
使用表單介面時,你可以:
- 設定實驗名稱和名稱空間
- 設定目標指標和最佳化方向
- 定義超引數搜尋空間
- 設定演算法和資源限制
- 設定試驗範本
完成設定後,點選「Deploy」按鈕即可啟動實驗。
實驗監控與視覺化
Katib UI 的一大優勢是提供了豐富的視覺化功能:
- 實驗進度圖表:顯示各試驗的效能指標,幫助你直觀比較不同參陣列合的效果
- 試驗詳情表格:列出每個試驗的引數值和最終指標
- 單個試驗效能曲線:點選特定試驗可檢視其訓練過程中指標的變化曲線
這些視覺化工具極大地提升了分析和理解超引數影響的能力,讓我發現一些僅透過資料難以察覺的模式。在實際專案中,我經常利用這些圖表來快速識別哪些引數對模型效能影響最大,從而更有針對性地調整搜尋策略。
調整分散式訓練任務
隨著模型規模和資料量的增長,分散式訓練已經成為機器學習工程中的常見需求。Katib 不僅支援單機訓練任務的超引數調整,還能無縫整合 TensorFlow 和 PyTorch 的分散式訓練框架。
分散式訓練超引數調整範例
以下是一個用於調整 TensorFlow 分散式訓練任務超引數的 Katib 實驗設定:
apiVersion: "kubeflow.org/v1beta1"
kind: Experiment
metadata:
namespace: kubeflow
name: tfjob-example
spec:
parallelTrialCount: 3
maxTrialCount: 12
maxFailedTrialCount: 3
objective:
type: maximize
goal: 0.99
objectiveMetricName: accuracy_1
algorithm:
algorithmName: random
metricsCollectorSpec:
source:
fileSystemPath:
path: /train
kind: Directory
collector:
kind: TensorFlowEvent
parameters:
- name: learning_rate
parameterType: double
feasibleSpace:
min: "0.01"
max: "0.05"
- name: batch_size
parameterType: int
feasibleSpace:
min: "100"
max: "200"
trialTemplate:
trialParameters:
- name: learningRate
description: Learning rate for the training model
reference: learning_rate
- name: batchSize
description: Batch Size
reference: batch_size
trialSpec:
apiVersion: "kubeflow.org/v1"
kind: TF工作
spec:
tfReplicaSpecs:
Worker:
replicas: 2
restartPolicy: OnFailure
template:
spec:
containers:
- name: tensorflow
image: gcr.io/kubeflow-ci/tf-mnist-with-summaries:1.0
command:
- "python"
- "/var/tf_mnist/mnist_with_summaries.py"
- "--log_dir=/train/metrics"
- "--learning_rate=${trialParameters.learningRate}"
- "--batch_size=${trialParameters.batchSize}"
這個設定與之前的例子有幾個關鍵區別:
- 指標收集方式:使用 TensorFlowEvent 收集器從 TensorBoard 日誌中提取指標
- 試驗定義:使用 TF工作 而非普通的 Kubernetes 工作,支援 TensorFlow 分散式訓練
- 引數傳遞:透過
${trialParameters.paramName}語法將引數傳遞給訓練指令碼 - 工作節點設定:設定了 2 個工作節點(Worker replicas: 2)進行分散式訓練
這種設定方式讓 Katib 能夠協調分散式訓練任務,同時調整超引數,極大地提高了資源利用效率和實驗速度。
分散式訓練中的注意事項
在使用 Katib 調整分散式訓練任務時,有幾點需要特別注意:
- 指標同步:確保分散式訓練任務正確地將指標寫入可被 Katib 收集的位置
- 資源規劃:分散式訓練會消耗更多資源,需要合理設定平行試驗數
- 容錯機制:分散式任務失敗的機率更高,應適當設定 maxFailedTrialCount
- 網路設定:確保工作節點之間的網路連線良好,以免影響訓練效率
在實踐中,我發現為分散式訓練任務調整超引數時,不僅要關注常規的學習引數,還需要考慮批次大小、工作節點數量等分散式特有引數,這些往往對訓練效率和模型收斂有顯著影響。
Katib 進階使用策略
除了基本的超引數調整功能外,Katib 還提供了一些進階特性和使用策略,能夠進一步提升實驗效率和結果品質。
早期停止策略
早期停止(Early Stopping)是一種避免資源浪費的重要技術。當某個試驗的表現明顯不佳時,及早終止可以釋放資源用於更有希望的參陣列合。Katib 支援多種早期停止演算法,例如:
spec:
algorithm:
algorithmName: random
earlyStopping:
algorithmName: medianstop
中位數停止(Median Stop)演算法會比較當前試驗的效能與所有試驗的中位數效能,如果明顯落後,則提前終止該試驗。
高階搜尋演算法
除了隨機搜尋外,Katib 還支援多種更高效的搜尋演算法:
- 貝葉斯最佳化:根據先前試驗結果建立機率模型,預測最有希望的引數區域
- TPE(Tree-structured Parzen Estimator):一種根據樹結構的機率估計方法
- ENAS(Efficient Neural Architecture Search):針對神經網路架構搜尋的高效演算法
在實際應用中,我常在初期使用隨機搜尋快速探索引數空間,然後切換到貝葉斯最佳化進行精細調整。這種混合策略往往能在有限資源下取得更好的結果。
自定義指標收集
Katib 支援多種指標收集方式,可根據不同框架和需求選擇:
metricsCollectorSpec:
source:
# 從檔案系統收集
fileSystemPath:
path: /logs
kind: Directory
collector:
# 支援多種收集器型別
kind: TensorFlowEvent # 或 StdOut, File, Custom 等
如果標準收集器不滿足需求,還可以實作自定義收集器,只需遵循 Katib 的 API 規範即可。
超引數重要性分析
瞭解哪些超引數對模型效能影響最大是調優過程中的關鍵洞察。雖然 Katib 目前沒有內建的引數重要性分析工具,但我們可以透過匯出實驗結果並使用外部工具(如 SHAP 或 fANOVA)進行分析。
在我的工作流程中,通常會在實驗完成後執行以下步驟:
- 匯出所有試驗的引數和結果
- 使用 Python 中的分析工具計算引數重要性
- 根據分析結果,調整下一輪實驗的搜尋空間,聚焦於重要引數
這種迭代式的分析和調整過程能夠顯著提高超引數調優的效率。
實戰經驗與最佳實踐
根據我使用 Katib 進行超引數調整的經驗,以下是一些實用的建議和最佳實踐:
搜尋空間設計策略
- 初始搜尋範圍:首先使用較寬的搜尋範圍,瞭解引數的大致影響
- 對數尺度:對於學習率等引數,使用對數尺度(如 1e-4 到 1e-1)比線性尺度更有效
- 分階段調優:先調整關鍵引數(如學習率、批次大小),再調整次要引數(如正則化因子)
- 引數相關性考量:注意某些引數之間可能存在相關性,如學習率和批次大小
資源管理與效率最佳化
- 平行度設定:根據可用計算資源合理設定平行試驗數,避免資源爭用
- 快速反饋迴圈:使用小資料集或較少的訓練輪次進行初步調優,再在完整資料上驗證
- 檢查點利用:對有希望的參陣列合,從檢查點繼續訓練而非重新開始
- 資源配額:在多使用者環境中,使用 Kubernetes 資源配額限制單個實驗的資源使用
常見問題排查
使用 Katib 過程中可能遇到的一些問題及其解決方法:
- 指標收集失敗:確保訓練程式碼正確輸出指標,與格式與收集器設定一致
- 試驗一直處於 Pending 狀態:檢查叢集資源是否充足,是否有 PodSecurityPolicy 限制
- 實驗卡在某個狀態:使用
kubectl describe experiment檢視詳細訊息,尤其是 Events 部分 - 引數不生效:檢查試驗範本中的引數參照是否正確,以及訓練程式碼是否正確解析引數
在實際操作中,我發現保持良好的日誌記錄習慣對於問題排查至關重要。適當增加訓練程式碼的日誌輸出,特別是超引數值的確認和關鍵訓練階段的標記,能夠大幅提高除錯效率。
Katib 與自動機器學習
超引數調整是自動機器學習(AutoML)的重要組成部分,但 AutoML 的範圍更廣,還包括特徵選擇、模型選擇和神經架構搜尋等。Katib 正在逐步擴充套件其功能,向完整的 AutoML 平台演進。
神經架構搜尋
神經架構搜尋(Neural Architecture Search, NAS)是 AutoML 的前沿領域,旨在自動化神經網路結構的設計。Katib 已經開始支援一些 NAS 演算法,如 ENAS 和 DARTS。
在設定 NAS 實驗時,除了常規超引數外,還需要定義架構搜尋空間,例如:
parameters:
- name: num_layers
parameterType: int
feasibleSpace:
min: "2"
max: "5"
- name: units_1
parameterType: int
feasibleSpace:
min: "32"
max: "256"
- name: activation
parameterType: categorical
feasibleSpace:
list:
- relu
- tanh
- sigmoid
這種設定允許 Katib 搜尋不同深度、寬度和啟用函式的網路架構。
與其他 AutoML 工具的整合
Katib 作為 Kubeflow 生態系統的一部分,可以與其他 AutoML 工具整合,形成更完整的工作流程:
- 與 Pipeline 整合:將 Katib 實驗作為 Kubeflow Pipeline 的一部分,實作端對端的 AutoML 流程
- 與模型服務整合:自動將調優後的模型佈署到 KFServing 或 Seldon Core 進行服務
- 與資料處理整合:結合 TFX 等工具實作資料處理、特徵工程與模型調優的自動化
在我的專案中,常將 Katib 超引數調整作為更大工作流程的一部分,前面是資料驗證和特徵工程,後面是模型評估和佈署,這種端對端的自動化大提高了團隊的產出效率。
未來發展與趨勢
隨著機器學習技術的快速發展,超引數調整和 AutoML 領域也在不斷演進。以下是一些值得關注的趨勢:
- 遷移學習與元學習:利用先前實驗的知識加速新任務的超引數調優
- 多目標最佳化:同時最佳化多個指標,如精確度、延遲和模型大小
- 資源感知調優:考慮計算資源限制的超引數搜尋策略
- 自適應搜尋空間:根據初步結果動態調整搜尋空間
- 分散式與聯邦 AutoML:在多叢集或邊緣裝置上進行分散式超引數調優
Katib 作為開放原始碼專案,正在積極發展以支援這些新趨勢。社群貢獻和企業需求將共同推動其功能擴充套件和效能提升。
Katib 為機器學習工程師提供了強大的超引數調優工具,能夠顯著提高模型開發效率和效能。在這篇文章中,我們探討了 Katib 的設定、執行和監控,以及在分散式訓練中的應用和進階使用策略。
從實踐角度看,成功的超引數調優不僅依賴於工具,還需要合理的方法論和經驗積累。建議從小規模實驗開始,熟悉 Katib 的工作流程和設定選項,然後逐步擴充套件到更複雜的場景。同時,保持對實驗結果的分析和反思,不斷最佳化搜尋策略和引數空間。
超引數調優是機器學習工程中的重要環節,但它不是終點。真正的價值在於將調優後的模型應用到實際問題中,並持續監控和改進。Katib 作為 Kubeflow 生態系統的一部分,能夠無縫融入端對端的機器學習工作流程,幫助團隊更高效地交付人工智慧解決方案。
在機器學習的道路上,工具只是輔助,真正的核心是對問題的深入理解和持續學習的態度。希望這篇文章能為你的超引數調優之旅提供有價值的指引。
目標規格與指標收集:TensorFlow任務的特殊處理
在Katib的TensorFlow任務中,目標規格設定與前面類別似 - 我們希望最大化準確率指標。不過,在指標收集規格方面有些差異,這是因為TensorFlow任務可以直接利用TensorFlow輸出的TFEvents。
使用Katib內建的TensorFlowEvent收集器型別時,系統能自動解析TensorFlow事件並填充指標資料函式庫。這種整合大幅簡化了指標收集流程,讓研究人員能專注於模型本身而非監控架構。
引數設定部分保持一致 - 在這個例子中,我們調整的是模型的學習率(learning rate)和批次大小(batch size)。
試驗範本與分散式訓練範例規格相似。這裡最關鍵的差異在於我們將learning_rate和batch_size引數化,讓Katib能夠自動嘗試不同的參陣列合。
神經網路架構搜尋:自動化網路設計
經過前面的介紹,我們已經瞭解如何使用Katib進行超引數調整。但你可能注意到,我們仍需自行選擇模型架構。那麼,能否進一步減少人工作量?AutoML的其他子領域又如何?接下來,我將探討Katib如何支援完整神經網路的自動生成。
神經架構搜尋概述
神經架構搜尋(Neural Architecture Search, NAS)是自動化機器學習領域中快速發展的子領域。與超引數調整不同,超引數調整是在已選定的模型上透過調整某些引數來最佳化效能;而NAS則嘗試生成網路架構本身。近期研究表明,NAS在影像分類別、物體檢測和語義分割等任務上的表現可以超越手工設計的神經網路。
NAS的方法主要分為生成方法和變異方法兩類別:
-
生成方法:演算法在每次迭代中提出一個或多個候選架構。這些架構經過評估後,在下一輪迭代中進行改進。
-
變異方法:首先提出一個過於複雜的架構,隨後的迭代嘗試簡化(剪枝)模型。
Katib支援的NAS實作
Katib目前支援兩種NAS實作:
-
可微分架構搜尋(DARTS):透過將搜尋空間從離散放寬為連續,並利用梯度下降來最佳化架構,實作NAS的可擴充套件性。
-
高效神經架構搜尋(ENAS):觀察到大多數NAS演算法的瓶頸發生在每個子模型的訓練過程中。ENAS強制每個子模型分享引數,從而提高整體效率。
Katib中的NAS工作流程
Katib中NAS的一般工作流程類別似於超引數搜尋,但增加了構建模型架構的額外步驟。Katib的內部模組(稱為模型管理器)負責接收拓撲設定和變異引數,並構建新模型。然後,Katib使用相同的試驗和指標概念來評估模型效能。
NAS實驗規格範例
以下是使用DARTS的NAS實驗規格範例:
apiVersion: "kubeflow.org/v1beta1"
kind: Experiment
metadata:
namespace: kubeflow
name: darts-example-gpu
spec:
parallelTrialCount: 1
maxTrialCount: 1
maxFailedTrialCount: 1
objective:
type: maximize
objectiveMetricName: Best-Genotype
metricsCollectorSpec:
collector:
kind: StdOut
source:
filter:
metricsFormat:
- "([\\w-]+)=(Genotype.*)"
algorithm:
algorithmName: darts
algorithmSettings:
- name: num_epochs
value: "3"
nasConfig:
graphConfig:
numLayers: 3
operations:
- operationType: separable_convolution
parameters:
- name: filter_size
parameterType: categorical
feasibleSpace:
list:
- "3"
- operationType: dilated_convolution
parameters:
- name: filter_size
parameterType: categorical
feasibleSpace:
list:
- "3"
- "5"
- operationType: avg_pooling
parameters:
- name: filter_size
parameterType: categorical
feasibleSpace:
list:
- "3"
- operationType: max_pooling
parameters:
- name: filter_size
parameterType: categorical
feasibleSpace:
list:
- "3"
- operationType: skip_connection
trialTemplate:
trialParameters:
- name: algorithmSettings
description: Algorithm settings of DARTS Experiment
reference: algorithm-settings
- name: searchSpace
description: Search Space of DARTS Experiment
reference: search-space
- name: numberLayers
description: Number of Neural Network layers
reference: num-layers
trialSpec:
apiVersion: batch/v1
kind: 工作
spec:
template:
spec:
containers:
- name: training-container
image: docker.io/kubeflowkatib/darts-cnn-cifar10
imagePullPolicy: Always
command:
- python3
- run_trial.py
- --algorithm-settings="${trialParameters.algorithmSettings}"
- --search-space="${trialParameters.searchSpace}"
- --num-layers="${trialParameters.numberLayers}"
resources:
limits:
nvidia.com/gpu: 1
restartPolicy: Never
這個YAML設定案定義了一個使用DARTS演算法的神經架構搜尋實驗。與超引數調整實驗相比,最顯著的差異在於新增了nasConfig部分。在這部分中,我們可以設定要建立的神經網路的規格,例如:
- 層數:透過
numLayers設定為3層 - 操作型別:定義了多種可能的神經網路操作,包括:
- 可分離卷積(separable_convolution)
- 擴張卷積(dilated_convolution)
- 平均池化(avg_pooling)
- 最大池化(max_pooling)
- 跳躍連線(skip_connection)
- 引數空間:為每種操作定義了可能的引數值,如不同的過濾器大小(filter_size)
這個設定允許Katib自動探索並構建最佳的神經網路架構,而非僅調整預定義模型的引數。試驗容器使用預先建立的CIFAR-10影像分類別任務映像,並要求一個GPU資源用於訓練。
Katib相較於其他框架的優勢
市場上有許多類別似的開放原始碼超引數搜尋系統,包括NNI、Optuna、Ray Tune和Hyperopt等。此外,Katib的原始設計靈感來自Google Vizier。雖然這些框架提供了許多與Katib相似的功能,特別是使用各種演算法設定平行超引數掃描的能力,但Katib具有一些獨特的特點:
兼顧使用者和管理員的設計
大多數調整框架主要為使用者(執行調整實驗的資料科學家)設計。Katib不僅如此,它還考慮到系統管理員的需求,這些管理員負責維護基礎設施、分配計算資源和監控系統健康狀況。這種雙重視角使Katib在企業環境中特別實用,因為它能同時滿足技術團隊和基礎設施團隊的需求。
雲端原生設計
其他框架(如Ray Tune)可能支援與Kubernetes整合,但通常需要額外的工作來設定叢集。相比之下,Katib是第一個完全根據Kubernetes設計的超引數搜尋框架;其所有資源都可以透過Kubernetes API存取和操作。這種設計使Katib能無縫融入現有的雲端基礎設施。
可擴充套件性和可攜性
因為Katib使用Kubernetes作為其協調引擎,所以很容易擴充套件實驗規模。你可以在筆記型電腦上執行相同的實驗進行原型設計,然後將作業佈署到生產叢集,只需對規格進行最小的更改。相比之下,其他框架根據硬體可用性需要額外的安裝和設定工作。
在實際工作中,我發現這種可擴充套件性特別有價值。曾經,我需要從小規模測試迅速擴充套件到使用數十個GPU的大型訓練任務,使用Katib讓這個過程幾乎無縫,而使用其他工具可能需要重新設計整個實驗流程。
可擴充性
Katib為其搜尋演算法和儲存系統提供了靈活與可插拔的介面。大多數其他框架附帶預設的演算法列表,並且具有硬編碼的指標收集機制。在Katib中,使用者可以輕鬆實作自定義搜尋演算法並將其與框架整合。
這種可擴充性使Katib能夠跟上快速發展的AutoML研究領域。當新的搜尋策略發布時,將其整合到Katib中通常只需要幾天時間,而不是幾週或幾個月。
原生支援
Katib原生支援分散式訓練和神經架構搜尋等進階功能。這些功能通常需要在其他框架中進行大量自定義工作才能實作。
結語
在本文中,我們概述了AutoML的概念,並瞭解它如何透過自動化耗時任務(如超引數搜尋)來加速機器學習模型的開發。透過自動化超引數調整等技術,你可以擴大模型開發規模,同時維持高模型品質。
我們使用了Kubeflow平台中的Kubernetes原生調整服務Katib來設定和執行超引數搜尋實驗。我們還展示瞭如何使用Katib的儀錶板來提交、追蹤和視覺化實驗。
Katib的強大之處在於它將Kubernetes的可擴充套件性與先進的機器學習自動化技術結合起來,為資料科學家和機器學習工程師提供了一個強大的工具,使他們能夠更快速、更有效地開發高品質模型。
在實際應用中,Katib可以大幅減少手動調整超引數的時間,讓研究人員專注於更有創造性的工作,如特徵工程和模型設計。隨著AutoML領域的不斷發展,像Katib這樣的工具將在機器學習工作流程中扮演越來越重要的角色。