

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 為一或多個演算法建立超參數最佳化調校任務 (主控台)
<a name="multiple-algorithm-hpo-create-tuning-jobs"></a>

本指南說明如何為一或多個演算法建立新的超參數最佳化 (HPO) 調校任務。如要建立 HPO 任務，請定義調校任務的設定，並為每個要調校的演算法建立訓練任務定義。接下來，為調校任務配置資源並建立任務。下列各節將詳細說明如何完成各個步驟。我們在本指南結尾附上如何針對 Python 用戶端使用 SageMaker AI SDK，以調校多個演算法的範例。

## 調校任務的元件
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-settings"></a>

HPO 調校任務包含下列三個元件：
+ 調校任務設定
+ 訓練任務定義
+ 調校任務組態

HPO 調校任務中包含這些元件的方式，將取決於您的調校任務是否包含一或多個訓練演算法。下列指南說明每個元件，並提供兩種調校任務類型的範例。

### 調校任務設定
<a name="multiple-algorithm-hpo-create-tuning-jobs-components-tuning-settings"></a>

您的調校任務設定會套用至 HPO 調校任務中的所有演算法。只有在調校單一演算法時，才能使用暖啟動和提早停止。定義任務設定後，針對您要調校的每個演算法或變體，您將建立個別的訓練定義。

**暖啟動**  
如果您已複製此任務，則可選擇使用先前調校任務的結果，以改善此新的調校任務的效能。這是暖啟動功能，只有在調校單一演算法時才可使用。採用暖啟動選項時，最多可選擇五個先前的超參數調校任務搭配使用。或者，您也可以使用轉移學習，將其他資料新增至父調校任務。當您選取此選項時，請選擇一個先前的調校任務作為父系。

**注意**  
暖啟動僅與 2018 年 10 月 1 日之後建立的調校任務相容。如需更多資訊，請參閱[執行暖啟動任務](automatic-model-tuning-considerations.html)。

**提早停止**  
如要降低運算時間並避免過度擬合模型，可提前停止訓練任務。當訓練任務不太可能改善超參數調校任務現有的最佳客觀指標時，提早停止可派上用場。就像暖啟動一樣，只有在調校單一演算法時才能使用此功能。這是不含組態選項的自動功能，系統預設為停用。如需提早停止的運作方式、支援停止的演算法，以及如何搭配您自己的演算法的詳細資訊，請參閱[提前停止訓練任務](automatic-model-tuning-early-stopping.html)的說明。

**調校策略**  
調校策略可以是隨機、貝葉斯或 Hyperband。這些選項可指定自動調校演算法如何搜尋指定的超參數範圍 (該類範圍將在稍後的步驟中選取)。隨機搜尋會從指定範圍中選擇值的隨機組合，且可按順序或以平行方式執行。貝葉斯最佳化會根據先前所選的已知記錄可能獲得最佳結果的內容來選擇值。Hyperband 將使用多擬真性策略，以動態方式將資源分配給充分利用的任務，並自動停止執行不佳的任務。停止其他配置後啟動的新配置是隨機選擇的。

 Hyperband 只能與迭代式演算法或在迭代運算中執行步驟的演算法 (例如 [https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html) 或 [隨機分割森林](https://docs.aws.amazon.com/sagemaker/latest/dg/randomcutforest.html)) 搭配使用。Hyperband 無法與非迭代式演算法搭配使用，例如決策樹或 [k 近鄰演算法](https://docs.aws.amazon.com/sagemaker/latest/dg/k-nearest-neighbors.html)。如需搜尋策略的詳細資訊，請參閱[超參數調校的運作方式](automatic-model-tuning-how-it-works.html)。

**注意**  
Hyperband 使用先進的內部機制來套用提早停止。因此，當您使用 Hyperband 內部提早停止功能時，必須將 `HyperParameterTuningJobConfig` API 中的參數 `TrainingJobEarlyStoppingType` 設為 `OFF`。

**Tags (標籤)**  
為了妥善管理調校任務，您可以將標籤輸入為鍵值對，以便將中繼資料指派給調校任務。鍵值對中的值並非必要。您可以使用沒有值的鍵。若要查看與任務相關聯的索引鍵，請在調校任務詳細資料頁面上，選擇**標籤**索引標籤。如需有關在調校任務中使用標籤的詳細資訊，請參閱：[管理超參數調校和訓練任務](multiple-algorithm-hpo-manage-tuning-jobs.md)。

### 訓練任務定義
<a name="multiple-algorithm-hpo-create-tuning-jobs-training-definitions"></a>

如要建立訓練任務定義，您必須設置演算法和參數、定義資料輸入和輸出，以及設置資源。至少為每個 HPO 調校任務提供一個 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TrainingJobDefinition.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TrainingJobDefinition.html)。每個訓練定義指定演算法的組態。

若要為訓練任務建立多個定義，您可以複製任務定義。複製任務可以節省時間，因為會複製所有的任務設定，包括輸出成品的資料通道和 Amazon S3 儲存位置。您可以編輯複製的任務，以變更使用案例所需的項目。

**Topics**
+ [設置演算法和參數](#multiple-algorithm-hpo-algorithm-configuration)
+ [定義資料輸入和輸出](#multiple-algorithm-hpo-data)
+ [設定訓練任務資源](#multiple-algorithm-hpo-training-job-definition-resources)
+ [新增或複製訓練任務](#multiple-algorithm-hpo-add-training-job)

#### 設置演算法和參數
<a name="multiple-algorithm-hpo-algorithm-configuration"></a>

 下列清單說明為每個訓練任務設置超參數值集所需的項目。
+ 調校任務的名稱
+ 存取服務的權限
+ 任何演算法選項的參數
+ 目標指標
+ 必要時，超參數值的範圍

**名稱**  
 提供訓練定義的唯一名稱。

**許可**  
 Amazon SageMaker AI 需要許可來代表您呼叫其他服務。選擇 AWS Identity and Access Management (IAM) 角色，或讓 AWS 建立已連接 IAM `AmazonSageMakerFullAccess` 政策的角色。

**選用安全性設定**  
 網路隔離設定可防止容器進行任何對外網路呼叫。這是 AWS Marketplace 機器學習產品的必要項目。

 您也可以選擇使用虛擬私有雲端 (VPC)。

**注意**  
 只有從 API 建立任務定義時，才能使用容器間加密。

**演算法選項**  
您可以選擇內建演算法、您自己的演算法、附帶演算法的自有容器，也可以從 AWS Marketplace訂閱演算法。
+ 如果您選擇內建演算法，該演算法會預先填入 Amazon Elastic Container Registry (Amazon ECR) 映像資訊。
+ 若您選擇自己的容器，則必須指定 (Amazon ECR) 映像資訊。您可以將演算法的輸入模式選取為檔案或管道。
+ 如果您打算使用 Amazon S3 中的 CSV 檔案來提供資料，則應該選取該檔案。

**指標**  
當您選擇內建演算法時，將會為您提供指標。如果您選擇自己的演算法，則必須定義您的指標。您可以定義多達 20 個指標以讓調校任務進行監控。您必須選擇一個指標作為目標指標。如需如何為調校任務定義指標的詳細資訊，請參閱：[定義指標](automatic-model-tuning-define-metrics-variables.md#automatic-model-tuning-define-metrics)。

**目標指標**  
要找到最佳的訓練工作，請設定一個目標指標，以及是否將其最大化或最小化。在訓練任務完成後，即可檢視調校任務詳細資訊頁面。詳細資訊頁面提供使用此目標指標找到的最佳訓練任務摘要。

**超參數組態**  
當您選擇內建演算法時，將會使用當前演算法的最佳化範圍，為您設定超參數的預設值。只要覺得合適，您可以變更這些值。例如，您可以將參數的類型設為**靜態**，以設定超參數的固定值，而非設為範圍。每個演算法都有不同的必要參數和選用參數。如需更多資訊，請參閱[超參數調校的最佳實務](automatic-model-tuning-considerations.html)和[定義超參數範圍](automatic-model-tuning-define-ranges.html)。

#### 定義資料輸入和輸出
<a name="multiple-algorithm-hpo-data"></a>

調校任務的每個訓練任務定義都必須設定資料輸入、資料輸出位置的通道，以及選擇性地為每個訓練任務設定任何檢查點儲存位置的通道。

**輸入資料組態**  
輸入資料由通道定義。每個通道各有自己的來源位置 (Amazon S3 或 Amazon Elastic File System)、壓縮和格式選項。您最多可以 20 個輸入來源通道。如果您選擇的演算法支援多個輸入通道，您也可以指定這些通道。例如，使用 [XGBoost 流失率預測筆記本](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_applying_machine_learning/xgboost_customer_churn/xgboost_customer_churn.html)時，您可以新增兩個通道：訓練和驗證。

**檢查點組態**  
訓練期間會定期產生檢查點。您必須選擇 Amazon S3 位置以儲存檢查點。檢查點用於指標報告，也用於繼續受管的重點訓練任務。如需詳細資訊，請參閱[Amazon SageMaker AI 中的檢查點](model-checkpoints.md)。

**輸出資料組態**  
定義 Amazon S3 位置，以便儲存訓練任務的成品。您可以選擇使用 AWS Key Management Service (AWS KMS) 金鑰將加密新增至輸出。

#### 設定訓練任務資源
<a name="multiple-algorithm-hpo-training-job-definition-resources"></a>

調校任務的每個訓練任務定義都必須設置要部署的資源，包括執行個體類型和計數、受管 Spot 訓練和停止條件。

**資源組態**  
每個訓練定義可以有不同的資源組態。您可以選擇執行個體類型和節點數目。

**受管 Spot 訓練**  
如果您在開始和結束時間方面具有彈性，可讓 SageMaker AI 使用備用容量來執行任務，藉此節省任務的運算成本。如需詳細資訊，請參閱[Amazon SageMaker AI 中的受管 Spot 訓練](model-managed-spot-training.md)。

**停止條件**  
停止條件會指定每個訓練任務所允許的最長持續時間。

#### 新增或複製訓練任務
<a name="multiple-algorithm-hpo-add-training-job"></a>

建立調校任務的訓練工作定義後，您將返回**訓練工作定義**面板。您可以在此面板建立其他訓練任務定義，以訓練其他演算法。您可以選取**新增訓練任務定義**，接著逐步執行步驟以再次定義訓練任務。

或者，若要複製現有的訓練任務定義並針對新演算法進行編輯，請從**動作**選單選擇**複製**。複製選項可複製所有任務的設定，包括資料通道和 Amazon S3 儲存位置，因此可以節省時間。如需複製功能的資訊，請參閱[管理超參數調校和訓練任務](multiple-algorithm-hpo-manage-tuning-jobs.md)。

### 調校任務組態
<a name="multiple-algorithm-hpo-resource-config"></a>

**資源限制**  
您可以指定超參數調校任務可同時執行的同步訓練任務數量上限 (最多 10 個)。也可以指定超參數調校任務可以執行的訓練任務數量上限 (最多 500 個)。平行任務的數量不該超過您在所有訓練定義中請求的節點數量。任務總數不得超過您的定義預期執行的任務數目。

檢視任務設定、訓練任務定義和資源限制。接著，選擇**建立超參數調校任務**。

## HPO 調整任務範例
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example"></a>

若要執行超參數最佳化 (HPO) 訓練任務，請先為每個正在調校的演算法建立訓練任務定義。接著，定義調校任務設定並設置調校任務的資源。最後，執行調校任務。

如果您的 HPO 調校工作包含單一訓練演算法，SageMaker AI 調校函式將直接呼叫 `HyperparameterTuner` API 並傳入您的參數。如果您的 HPO 調校工作包含多個訓練演算法，您的調校函式將呼叫 `HyperparameterTuner` API 的 `create` 函式。該 `create` 函式會指示 API 期望包含一或多個估算器的字典。

在下一節中，程式碼範例會說明如何使用 SageMaker AI Python SDK 調校包含單一訓練演算法或多個演算法的任務。

### 建立訓練任務定義
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-train"></a>

當您建立包含多個訓練演算法的調校任務時，您的調校任務組態會納入估算器和指標，以及訓練任務的其他參數。因此，您需要先建立訓練任務定義，再來設置調校任務。

下列程式碼範例顯示如何擷取兩個包含內建演算法 [https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html](https://docs.aws.amazon.com/sagemaker/latest/dg/xgboost.html) 和 [https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html) 的 SageMaker AI 容器。如果您的調校工作僅包含一個訓練演算法，則請略過其中一個容器和其中一個估算器。

```
import sagemaker
from sagemaker import image_uris

from sagemaker.estimator import Estimator

sess = sagemaker.Session()
region = sess.boto_region_name
role = sagemaker.get_execution_role()

bucket = sess.default_bucket()
prefix = "sagemaker/multi-algo-hpo"

# Define the training containers and intialize the estimators
xgb_container = image_uris.retrieve("xgboost", region, "latest")
ll_container = image_uris.retrieve("linear-learner", region, "latest")

xgb_estimator = Estimator(
    xgb_container,
    role=role,
    instance_count=1,
    instance_type="ml.m4.xlarge",
    output_path='s3://{}/{}/xgb_output".format(bucket, prefix)',
    sagemaker_session=sess,
)

ll_estimator = Estimator(
    ll_container,
    role,
    instance_count=1,
    instance_type="ml.c4.xlarge",
    output_path="s3://{}/{}/ll_output".format(bucket, prefix),
    sagemaker_session=sess,
)

# Set static hyperparameters
ll_estimator.set_hyperparameters(predictor_type="binary_classifier")
xgb_estimator.set_hyperparameters(
    eval_metric="auc",
    objective="binary:logistic",
    num_round=100,
    rate_drop=0.3,
    tweedie_variance_power=1.4,
)
```

接下來，透過指定訓練、驗證和測試資料集來定義輸入資料，如下列程式碼範例所示。此範例說明如何調校多個訓練演算法。

```
training_data = sagemaker.inputs.TrainingInput(
    s3_data="s3://{}/{}/train".format(bucket, prefix), content_type="csv"
)
validation_data = sagemaker.inputs.TrainingInput(
    s3_data="s3://{}/{}/validate".format(bucket, prefix), content_type="csv"
)
test_data = sagemaker.inputs.TrainingInput(
    s3_data="s3://{}/{}/test".format(bucket, prefix), content_type="csv"
)

train_inputs = {
    "estimator-1": {
        "train": training_data,
        "validation": validation_data,
        "test": test_data,
    },
    "estimator-2": {
        "train": training_data,
        "validation": validation_data,
        "test": test_data,
    },
}
```

如果您的調校演算法僅包含一個訓練演算法，您的 `train_inputs` 應該只能包含一個估算器。

您必須先將訓練、驗證和訓練資料集的輸入內容上傳到 Amazon S3 儲存貯體，然後才能在 HPO 調校任務中使用這些資料集。

### 定義調校任務的資源和設定
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-resources"></a>

本節說明如何初始化調校器、定義資源以及指定調校任務的任務設定。如果您的調校任務包含多個訓練演算法，這些設定會套用至調校任務中所含的全部演算法。本節提供兩個定義調校器的程式碼範例。程式碼範例會示範如何最佳化單一訓練演算法，並附上如何調校多個訓練演算法的範例。

#### 調校單一訓練演算法
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-resources-single"></a>

下列程式碼範例說明如何初始化調校器，以及如何為下列 SageMaker AI 內建演算法 XGBoost 設定超參數範圍。

```
from sagemaker.tuner import HyperparameterTuner
from sagemaker.parameter import ContinuousParameter, IntegerParameter

hyperparameter_ranges = {
    "max_depth": IntegerParameter(1, 10),
    "eta": ContinuousParameter(0.1, 0.3),
}

objective_metric_name = "validation:accuracy"

tuner = HyperparameterTuner(
    xgb_estimator,
    objective_metric_name,
    hyperparameter_ranges,
    objective_type="Maximize",
    max_jobs=5,
    max_parallel_jobs=2,
)
```

#### 調校多個訓練演算法
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-resources-multiple"></a>

每個訓練任務都需要不同的組態，而這些設定會透過使用字典來指定。下列程式碼範例說明如何使用兩個 SageMaker AI 內建演算法組態 (XGBoost 和 Linear Learner)，來初始化調校器。程式碼範例也會示範如何設定調校策略和其他任務設定，例如調校任務的運算資源。下列程式碼範例使用 `metric_definitions_dict`，而此為選用項目。

```
from sagemaker.tuner import HyperparameterTuner
from sagemaker.parameter import ContinuousParameter, IntegerParameter

# Initialize your tuner
tuner = HyperparameterTuner.create(
    estimator_dict={
        "estimator-1": xgb_estimator,
        "estimator-2": ll_estimator,
    },
    objective_metric_name_dict={
        "estimator-1": "validation:auc",
        "estimator-2": "test:binary_classification_accuracy",
    },
    hyperparameter_ranges_dict={
        "estimator-1": {"eta": ContinuousParameter(0.1, 0.3)},
        "estimator-2": {"learning_rate": ContinuousParameter(0.1, 0.3)},
    },
    metric_definitions_dict={
        "estimator-1": [
            {"Name": "validation:auc", "Regex": "Overall test accuracy: (.*?);"}
        ],
        "estimator-2": [
            {
                "Name": "test:binary_classification_accuracy",
                "Regex": "Overall test accuracy: (.*?);",
            }
        ],
    },
    strategy="Bayesian",
    max_jobs=10,
    max_parallel_jobs=3,
)
```

### 執行您的 HPO 調校任務
<a name="multiple-algorithm-hpo-create-tuning-jobs-define-example-run"></a>

現在，您可以透過將訓練輸入傳遞給 `HyperparameterTuner` 類別的 `fit` 函式，來執行調校任務。下列程式碼範例會示範如何將 `train_inputs` 參數 (已在上個程式碼範例中定義) 傳遞給您的調校器。

```
tuner.fit(inputs=train_inputs, include_cls_metadata ={}, estimator_kwargs ={})   
```