為一或多個演算法建立超參數最佳化調校任務 (主控台) - Amazon SageMaker

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

為一或多個演算法建立超參數最佳化調校任務 (主控台)

本指南說明如何為一或多個演算法建立新的超參數最佳化 (HPO) 調整工作。若要建立HPO工作,請定義調整工作的設定,並為要調整的每個演算法建立訓練工作定義。接下來,為調校任務配置資源並建立任務。下列各節將詳細說明如何完成各個步驟。我們在本指南末尾提供如何使用 to Python client SageMaker SDK 來調整多個演算法的範例。

調校任務的元件

HPO調整工作包含下列三個元件:

  • 調校任務設定

  • 訓練任務定義

  • 調校任務組態

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

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

暖啟動

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

注意

暖啟動僅與 2018 年 10 月 1 日之後建立的調校任務相容。如需更多資訊,請參閱執行暖啟動任務

提早停止

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

調校策略

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

Hyperband 只能與反覆式演算法或在反覆運算中執行步驟的演算法 (例如 XGBoost隨機分割森林) 搭配使用。Hyperband 無法與非反覆式演算法搭配使用,例如決策樹或 k 近鄰演算法。如需搜尋策略的詳細資訊,請參閱超參數調校的運作方式

注意

Hyperband 使用先進的內部機制來套用提早停止。因此,當您使用內Hyperband部提前停止特徵時,HyperParameterTuningJobConfigAPI必須將TrainingJobEarlyStoppingType中的參數設定為OFF

標籤

為了妥善管理調校任務,您可以將標籤輸入為鍵值對,以便將中繼資料指派給調校任務。鍵值對中的值並非必要。您可以使用沒有值的鍵。若要查看與任務相關聯的索引鍵,請在調校任務詳細資料頁面上,選擇標籤索引標籤。如需有關在調校任務中使用標籤的詳細資訊,請參閱:管理超參數調校和訓練任務

如要建立訓練任務定義,您必須設置演算法和參數、定義資料輸入和輸出,以及設置資源。TrainingJobDefinition為每個HPO調整工作至少提供一個。每個訓練定義指定演算法的組態。

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

設置演算法和參數

下列清單說明為每個訓練任務設置超參數值集所需的項目。

  • 調校任務的名稱

  • 存取服務的權限

  • 任何演算法選項的參數

  • 目標指標

  • 必要時,超參數值的範圍

名稱

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

許可

Amazon SageMaker 需要許可才能代表您呼叫其他服務。選擇 AWS Identity and Access Management (IAM) 角色,或讓 AWS 建立附加AmazonSageMakerFullAccessIAM原則的角色。

選用安全性設定

網路隔離設定可防止容器進行任何對外網路呼叫。這是 AWS Marketplace 機器學習供應項目的必要條件。

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

注意

只有當您從建立工作定義時,才能使用容器間加密。API

演算法選項

您可以選擇內建演算法、您自己的演算法、附帶演算法的自有容器,也可以從 AWS Marketplace訂閱演算法。

  • 如果您選擇內建演算法,則會預先填入 Amazon 彈性容器登錄 (AmazonECR) 映像資訊。

  • 如果您選擇自己的容器,則必須指定 (AmazonECR) 映像資訊。 您可以將演算法的輸入模式選取為檔案或管道。

  • 如果您打算使用 Amazon S3 的CSV檔案提供資料,則應選取該檔案。

指標

當您選擇內建演算法時,將會為您提供指標。如果您選擇自己的演算法,則必須定義您的指標。您可以定義多達 20 個指標以讓調校任務進行監控。您必須選擇一個指標作為目標指標。如需如何為調校任務定義指標的詳細資訊,請參閱:定義指標

目標指標

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

超參數組態

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

定義資料輸入和輸出

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

輸入資料組態

輸入資料由通道定義。每個通道各有自己的來源位置 (Amazon S3 或 Amazon Elastic File System)、壓縮和格式選項。您最多可以 20 個輸入來源通道。如果您選擇的演算法支援多個輸入通道,您也可以指定這些通道。例如,使用 XGBoost 流失率預測筆記本時,您可以新增兩個通道:訓練和驗證。

檢查點組態

訓練期間會定期產生檢查點。您必須選擇 Amazon S3 位置以儲存檢查點。檢查點用於指標報告,也用於繼續受管的重點訓練任務。如需詳細資訊,請參閱在 Amazon 使用檢查站 SageMaker

輸出資料組態

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

設定訓練任務資源

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

資源組態

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

受管 Spot 訓練

如果您在開始和結束時間方面具有彈性,可以透過允許使用備用容量 SageMaker 來執行工作,節省工作的電腦成本。如需詳細資訊,請參閱在 Amazon 中使用受管 Spot 訓練 SageMaker

停止條件

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

新增或複製訓練任務

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

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

資源限制

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

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

HPO調整工作示例

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

如果您的HPO調整工作包含單一訓練演算法, SageMaker 調整函數會HyperparameterTunerAPI直接呼叫並傳入您的參數。如果您的HPO調整工作包含多個訓練演算法,您的調整函數將呼叫的create函數HyperparameterTunerAPI。該create函數告訴期API望包含一個或多個估計器的字典。

在下一節中,程式碼範例說明如何使用調整包含單一訓練演算法或多重演算法的工作 SageMaker Python SDK。

建立訓練任務定義

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

下列程式碼範例會示範如何擷取兩個包含內建演算法XGBoost和的 SageMaker 容器Linear Learner。如果您的調校工作僅包含一個訓練演算法,則請略過其中一個容器和其中一個估算器。

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調整任務中使用這些資料集。

定義調校任務的資源和設定

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

調校單一訓練演算法

下列程式碼範例會示範如何初始化調諧器,XGBoost以及如何為一個 SageMaker 內建演算法設定超參數範圍。

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, )

調校多個訓練演算法

每個訓練任務都需要不同的組態,而這些設定會透過使用字典來指定。下列程式碼範例示範如何使用兩個 SageMaker 內建演算法的組態來初始化調諧器,以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整工作

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

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