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 使用 objectiveMetricadditionalMetric 的值作為目標值,以監控建議的超引數如何與模型配合。如果試驗中的目標值達到目標,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 實驗,直到獲得結果。

#### 內容解密:

  1. 實驗組態:在 Katib 中進行 HPO 實驗需要建立一個 Experiment CRD 物件,並透過 YAML 檔案進行組態。
  2. 目標定義:第一部分定義了實驗的目標,包括最大化或最小化某個指標。
  3. HPO 演算法和超引數:第二部分組態了 HPO 演算法和需要調優的超引數及其搜尋空間。
  4. 試驗組態:第三部分定義了訓練程式碼的執行方式和傳遞給訓練程式碼的超引數。
  5. 啟動實驗:透過 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 演算法不支援平行試驗執行,因為這類別演算法對試驗執行順序有線性要求,下一個試驗需要等待當前試驗完成。

內容解密:

  1. 平行試驗的意義:透過平行執行多個試驗,可以顯著減少 HPO 的總時間。
  2. 限制:並非所有 HPO 演算法都支援平行試驗,需要根據具體演算法的特性進行選擇。
  3. 實踐建議:在設計實驗時,應根據資源情況和演算法特性合理設定 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 的副本規格,包括主機和工作節點的組態。
  • MasterWorker 分別組態了主機和工作節點的數量、重啟策略和容器規格。

在上述範例中,我們可以看到與非分散式實驗組態相比,唯一的差異在於 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 官方檔案中的「使用提前停止」。