Katib 提供了一套便捷的工具和方法,讓使用者能夠在 Kubernetes 環境中有效地進行超引數調優。透過定義 Experiment CRD,使用者可以指定目標指標、HPO 演算法、超引數搜尋空間以及試驗範本。Katib 支援多種訓練框架,並提供範例程式碼和 Docker 映像檔,簡化了訓練程式碼的封裝過程。除了使用 kubectl 命令列工具,使用者還可以透過 Katib SDK 或網頁介面操作實驗。實驗過程中,Katib 會監控試驗進度並記錄結果,方便使用者追蹤和分析。為了提升 HPO 效率,Katib 提供了平行試驗、分散式訓練和提前停止等加速技巧。使用者可以根據自身需求和資源狀況選擇合適的策略,有效縮短 HPO 流程所需的時間和資源成本。
使用 Katib 進行超引數調優的完整
C.2 開始使用 Katib
C.2.4 步驟 4:組態實驗
現在您已經準備好了訓練程式碼,我們可以開始在 Katib 中準備超引數調優(HPO)實驗。我們只需要建立一個 Experiment CRD(客戶資源定義)物件。
透過使用 Kubernetes API 或 kubectl 命令,我們可以透過指定 YAML 組態來建立實驗 CRD。為了便於閱讀,我們將範例組態分成三個部分。讓我們逐一檢視每個部分。
第一部分:目標
第一部分是定義 HPO 實驗的目標,並確定如何衡量每次試驗(訓練執行)的效能。Katib 使用 objectiveMetric 和 additionalMetric 的值作為目標值,以監控建議的超引數如何與模型配合。如果試驗中的目標值達到目標,Katib 將把建議的超引數標記為最佳值,並停止進一步的試驗。
apiVersion: kubeflow.org/v1beta1
kind: Experiment
metadata:
namespace: kubeflow
name: bayesian-optimization
spec:
objective:
type: maximize
goal: 0.99
objectiveMetricName: Validation-accuracy
additionalMetricNames:
- Train-accuracy
第二部分:HPO 演算法和超引數
在設定 HPO 目標後,我們可以組態 HPO 演算法並宣告其搜尋空間和需要調優的超引數。
algorithm:
algorithmName: bayesianoptimization
algorithmSettings:
- name: "random_state"
value: "10"
parallelTrialCount: 3
maxTrialCount: 12
maxFailedTrialCount: 3
parameters:
- name: lr
parameterType: double
feasibleSpace:
min: "0.01"
max: "0.03"
- name: num-layers
parameterType: int
feasibleSpace:
min: "2"
max: "5"
- name: optimizer
parameterType: categorical
feasibleSpace:
list:
- sgd
- adam
- ftrl
第三部分:試驗組態
在試驗範本組態中,我們定義了要執行的訓練程式碼(Docker 映像檔)以及要傳遞給訓練程式碼的超引數。Katib 為幾乎所有模型訓練框架提供了內建作業,例如 TensorFlow、PyTorch、MXNet 等,這些框架負責在 Kubernetes 中執行實際的訓練。
trialTemplate:
primaryContainerName: training-container
trialParameters:
- name: learningRate
description: Learning rate for the training model
reference: lr
- name: numberLayers
description: Number of training model layers
reference: num-layers
- name: optimizer
description: Training model optimizer (sdg, adam or ftrl)
reference: optimizer
trialSpec:
apiVersion: batch/v1
kind: Job
spec:
template:
spec:
containers:
- name: training-container
image: docker.io/kubeflowkatib/mxnet-mnist:latest
command:
- "python3"
- "/opt/mxnet-mnist/mnist.py"
- "--batch-size=64"
- "--lr=${trialParameters.learningRate}"
- "--num-layers=${trialParameters.numberLayers}"
- "--optimizer=${trialParameters.optimizer}"
restartPolicy: Never
C.2.5 步驟 5:啟動實驗
一旦我們定義了實驗組態並將其儲存到 YAML 檔案中,我們就可以執行以下命令來啟動實驗:
% kubectl apply -f bayesian-optimization.yaml
experiment.kubeflow.org/bayesian-optimization created
% kubectl get experiment -n kubeflow
NAME TYPE STATUS AGE
bayesian-optimization Created True 46s
從 kubectl get experiment -n kubeflow 的傳回訊息中,我們可以看到實驗 bayesian-optimization 已被建立為 Experiment CRD 資源。從現在開始,Katib 將完全擁有 HPO 實驗,直到獲得結果。
#### 內容解密:
- 實驗組態:在 Katib 中進行 HPO 實驗需要建立一個 Experiment CRD 物件,並透過 YAML 檔案進行組態。
- 目標定義:第一部分定義了實驗的目標,包括最大化或最小化某個指標。
- HPO 演算法和超引數:第二部分組態了 HPO 演算法和需要調優的超引數及其搜尋空間。
- 試驗組態:第三部分定義了訓練程式碼的執行方式和傳遞給訓練程式碼的超引數。
- 啟動實驗:透過
kubectl apply命令將實驗組態應用到 Kubernetes 中,並使用kubectl get experiment檢視實驗狀態。
圖表說明:HPO 實驗流程圖
此圖示展示了在 Katib 中進行 HPO 實驗的基本流程,從定義實驗目標到啟動實驗並監控其進度,直到達到預設目標或完成所有試驗。
使用 Kubeflow Katib 進行超引數最佳化(HPO)服務的建立
C.2 使用 Katib 入門
C.2.6 步驟 6:查詢進度和結果
除了使用 kubectl 命令之外,我們還可以透過 Katib SDK、其網頁介面或傳送 HTTP 請求來啟動實驗。要檢查實驗的執行狀態,可以使用以下命令:
% kubectl describe experiment bayesian-optimization -n kubeflow
該命令將傳回有關實驗的所有資訊,例如其組態、後設資料和狀態。從進度跟蹤的角度來看,我們主要關注的是狀態部分。以下是示例輸出:
Status:
Completion Time: 2022-01-23T05:27:19Z
Conditions:
...
Message: Experiment is created
Type: Created
...
Message: Experiment is running
Reason: ExperimentRunning
Status: False
Type: Running
...
Message: Experiment has succeeded because max trial count has reached
Reason: ExperimentMaxTrialsReached
Status: True
Type: Succeeded
Current Optimal Trial:
Best Trial Name: bayesian-optimization-9h25bvq9
Observation:
Metrics:
Latest: 0.979001
Max: 0.979001
Min: 0.955713
Name: Validation-accuracy
Latest: 0.992621
Max: 0.992621
Min: 0.906333
Name: Train-accuracy
Parameter Assignments:
Name: lr
Value: 0.014183662191100063
Name: num-layers
Value: 3
Name: optimizer
Value: sgd
Start Time: 2022-01-23T05:13:00Z
Succeeded Trial List:
...
bayesian-optimization-5s59vfwc
bayesian-optimization-r8lnnv48
bayesian-optimization-9h25bvq9
...
Trials: 12
Trials Succeeded: 12
C.2.7 步驟 7:故障排除
如果有失敗的試驗,我們可以執行以下命令來檢查失敗的試驗作業的錯誤訊息:
% kubectl describe trial bayesian-optimization-mnist-pytorch-88c9rdjx -n kubeflow
從傳回的資料中,我們可以看到試驗中使用的超引數值和相關的錯誤訊息。
C.3 加速 HPO
HPO 是一種耗時且昂貴的操作。Katib 提供三種方法來加速該過程:平行試驗、分散式訓練和早期停止。
C.3.1 平行試驗
透過在實驗組態中指定 parallelTrialCount,您可以平行執行試驗。需要注意的是,有些 HPO 演算法不支援平行試驗執行,因為這類別演算法對試驗執行順序有線性要求,下一個試驗需要等待當前試驗完成。
內容解密:
- 平行試驗的意義:透過平行執行多個試驗,可以顯著減少 HPO 的總時間。
- 限制:並非所有 HPO 演算法都支援平行試驗,需要根據具體演算法的特性進行選擇。
- 實踐建議:在設計實驗時,應根據資源情況和演算法特性合理設定
parallelTrialCount。
使用 Plantuml 圖表示 HPO 流程
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Katib 超引數調優
package "資料庫架構" {
package "應用層" {
component [連線池] as pool
component [ORM 框架] as orm
}
package "資料庫引擎" {
component [查詢解析器] as parser
component [優化器] as optimizer
component [執行引擎] as executor
}
package "儲存層" {
database [主資料庫] as master
database [讀取副本] as replica
database [快取層] as cache
}
}
pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中
master --> replica : 資料同步
note right of cache
Redis/Memcached
減少資料庫負載
end note
@enduml此圖示說明瞭 HPO 的基本流程,包括實驗組態、試驗啟動、平行或順序執行試驗,以及最終評估最佳超引數的過程。
加速超引數最佳化(HPO)流程:Katib 的進階應用
C.3 加速 HPO 流程
C.3.2 分散式訓練任務
為了加快試驗任務的完成速度,Katib 允許啟用分散式訓練來執行訓練程式碼。如同在 C.2 章節(步驟 4)中所解釋的,Katib 在 trialTemplate 中為不同的訓練框架(如 PyTorch、TensorFlow 和 MXNet)定義了不同的任務型別。
以下是一個示例,展示如何在 Katib 實驗中為 PyTorch 訓練程式碼啟用分散式訓練(一台主機,兩台工作節點):
trialTemplate:
primaryContainerName: pytorch
trialParameters:
- name: learningRate
description: 訓練模型的學習率
reference: lr
- name: momentum
description: 訓練模型的動量
reference: momentum
trialSpec:
apiVersion: kubeflow.org/v1
kind: PyTorchJob
spec:
pytorchReplicaSpecs:
Master:
replicas: 1
restartPolicy: OnFailure
template:
spec:
containers:
- name: pytorch
image: docker.io/kubeflowkatib/pytorch-mnist:latest
command:
- "python3"
- "/opt/pytorch-mnist/mnist.py"
- "--epochs=1"
- "--lr=${trialParameters.learningRate}"
- "--momentum=${trialParameters.momentum}"
Worker:
replicas: 2
restartPolicy: OnFailure
template:
spec:
containers:
- name: pytorch
image: docker.io/kubeflowkatib/pytorch-mnist:latest
command:
- "python3"
- "/opt/pytorch-mnist/mnist.py"
- "--epochs=1"
- "--lr=${trialParameters.learningRate}"
- "--momentum=${trialParameters.momentum}"
#### 內容解密:
trialTemplate定義了試驗任務的範本,指定了主要的容器名稱和試驗引數。trialSpec指定了試驗任務的型別為PyTorchJob,並組態了主機和工作節點的數量和重啟策略。pytorchReplicaSpecs定義了 PyTorchJob 的副本規格,包括主機和工作節點的組態。Master和Worker分別組態了主機和工作節點的數量、重啟策略和容器規格。
在上述範例中,我們可以看到與非分散式實驗組態相比,唯一的差異在於 trialSpec 部分。任務型別現在更改為 PyTorchJob,並且具有獨立的設定,例如主機和工作節點的副本數量。您可以透過以下兩個 GitHub 儲存函式庫找到 Katib 訓練運算元和其組態範例的詳細資訊:Kubeflow 訓練運算元(https://github.com/kubeflow/training-operator)和 Katib 運算元組態範例(http://mng.bz/rdgB)。
C.3.3 提前停止
Katib 提供的另一個有用的技巧是提前停止。提前停止在試驗的目標指標不再改善時結束試驗。它透過切斷無望成功的試驗來節省計算資源並減少執行時間。
在 Katib 中使用提前停止的優勢在於,我們只需要更新實驗組態檔案,而無需修改訓練程式碼。只需在 .spec.algorithm 部分定義 .earlyStopping.algorithmName 和 .earlyStopping.algorithmSettings,即可啟用提前停止功能。
目前,Katib 支援的中位數停止規則(median stopping rule)會在試驗的最佳目標值比其他所有已完成試驗在相同步驟中報告的目標值的執行平均值的中位數還差時停止該試驗。有關更多詳細資訊,請閱讀 Katib 官方檔案中的「使用提前停止」。