本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
為一或多個演算法建立超參數最佳化調校任務 (主控台)
本指南說明如何為一或多個演算法建立新的超參數最佳化 (HPO) 調校任務。若要建立HPO任務,請定義調校任務的設定,並為要調校的每個演算法建立訓練任務定義。接下來,為調校任務配置資源並建立任務。下列各節將詳細說明如何完成各個步驟。我們提供如何使用 調整多個演算法的範例 SageMaker SDK for Python 用戶端。
調校任務的元件
HPO 調校任務包含下列三個元件:
-
調校任務設定
-
訓練任務定義
-
調校任務組態
這些元件包含在HPO調校任務中的方式取決於調校任務是否包含一或多個訓練演算法。下列指南說明每個元件,並提供兩種調校任務類型的範例。
您的調校任務設定會套用至HPO調校任務中的所有演算法。只有在調校單一演算法時,才能使用暖啟動和提早停止。定義任務設定後,針對您要調校的每個演算法或變體,您將建立個別的訓練定義。
暖啟動
如果您已複製此任務,則可選擇使用先前調校任務的結果,以改善此新的調校任務的效能。這是暖啟動功能,只有在調校單一演算法時才可使用。採用暖啟動選項時,最多可選擇五個先前的超參數調校任務搭配使用。或者,您也可以使用轉移學習,將其他資料新增至父調校任務。當您選取此選項時,請選擇一個先前的調校任務作為父系。
注意
暖啟動僅與 2018 年 10 月 1 日之後建立的調校任務相容。如需更多資訊,請參閱執行暖啟動任務。
提早停止
如要降低運算時間並避免過度擬合模型,可提前停止訓練任務。當訓練任務不太可能改善超參數調校任務現有的最佳客觀指標時,提早停止可派上用場。就像暖啟動一樣,只有在調校單一演算法時才能使用此功能。這是不含組態選項的自動功能,系統預設為停用。如需提早停止的運作方式、支援停止的演算法,以及如何搭配您自己的演算法的詳細資訊,請參閱提前停止訓練任務的說明。
調校策略
調整策略可以是隨機的、貝氏的或 Hyperband。 這些選擇會指定自動調校演算法如何搜尋稍後步驟中選取的指定超參數範圍。隨機搜尋會從指定範圍中選擇值的隨機組合,且可按順序或以平行方式執行。Bayesian 最佳化會根據先前選擇的已知歷史記錄,根據可能獲得最佳結果的值來選擇值。Hyperband 使用多保真策略,可將資源動態配置給充分利用的任務,並自動停止表現不佳的任務。停止其他配置後啟動的新配置是隨機選擇的。
Hyperband 只能與迭代演算法或執行迭代步驟的演算法搭配使用,例如 XGBoost 或 隨機剪切森林 。Hyperband 無法與非疊代演算法搭配使用,例如決策樹或 k-Nearest Neighbors 。如需搜尋策略的詳細資訊,請參閱超參數調校的運作方式。
注意
Hyperband 使用進階內部機制來套用提前停止。因此,當您使用 Hyperband 內部提前停止功能, TrainingJobEarlyStoppingType
中的 參數HyperParameterTuningJobConfig
API必須設定為 OFF
。
標籤
為了妥善管理調校任務,您可以將標籤輸入為鍵值對,以便將中繼資料指派給調校任務。鍵值對中的值並非必要。您可以使用沒有值的鍵。若要查看與任務相關聯的索引鍵,請在調校任務詳細資料頁面上,選擇標籤索引標籤。如需有關在調校任務中使用標籤的詳細資訊,請參閱:管理超參數調校和訓練任務。
如要建立訓練任務定義,您必須設置演算法和參數、定義資料輸入和輸出,以及設置資源。TrainingJobDefinition
為每個HPO調校任務提供至少一個。每個訓練定義指定演算法的組態。
若要為訓練任務建立多個定義,您可以複製任務定義。複製任務可以節省時間,因為會複製所有的任務設定,包括輸出成品的資料通道和 Amazon S3 儲存位置。您可以編輯複製的任務,以變更使用案例所需的項目。
設置演算法和參數
下列清單說明為每個訓練任務設置超參數值集所需的項目。
-
調校任務的名稱
-
存取服務的權限
-
任何演算法選項的參數
-
目標指標
-
必要時,超參數值的範圍
名稱
提供訓練定義的唯一名稱。
許可
Amazon SageMaker 需要代表您呼叫其他服務的許可。選擇 AWS Identity and Access Management (IAM) 角色,或讓 AWS 建立附加AmazonSageMakerFullAccess
IAM政策的角色。
選用安全性設定
網路隔離設定可防止容器進行任何對外網路呼叫。這是 AWS Marketplace 機器學習方案的必要項目。
您也可以選擇使用虛擬私有雲端 (VPC)。
注意
容器間加密只有在您從 建立任務定義時才可用API。
演算法選項
您可以選擇內建演算法、您自己的演算法、附帶演算法的自有容器,也可以從 AWS Marketplace訂閱演算法。
-
如果您選擇內建演算法,則會預先填入 Amazon Elastic Container Registry (AmazonECR) 映像資訊。
-
如果您選擇自己的容器,則必須指定 (Amazon ECR) 映像資訊。您可以選取演算法的輸入模式作為檔案或管道。
-
如果您計劃使用來自 Amazon S3 CSV的檔案提供資料,您應該選取該檔案。
指標
當您選擇內建演算法時,將會為您提供指標。如果您選擇自己的演算法,則必須定義您的指標。您可以定義多達 20 個指標以讓調校任務進行監控。您必須選擇一個指標作為目標指標。如需如何為調校任務定義指標的詳細資訊,請參閱:定義指標。
目標指標
要找到最佳的訓練工作,請設定一個目標指標,以及是否將其最大化或最小化。在訓練任務完成後,即可檢視調校任務詳細資訊頁面。詳細資訊頁面提供使用此目標指標找到的最佳訓練任務摘要。
超參數組態
當您選擇內建演算法時,將會使用當前演算法的最佳化範圍,為您設定超參數的預設值。只要覺得合適,您可以變更這些值。例如,您可以將參數的類型設為靜態,以設定超參數的固定值,而非設為範圍。每個演算法都有不同的必要參數和選用參數。如需更多資訊,請參閱超參數調校的最佳實務和定義超參數範圍。
定義資料輸入和輸出
調校任務的每個訓練任務定義都必須設定資料輸入、資料輸出位置的通道,以及選擇性地為每個訓練任務設定任何檢查點儲存位置的通道。
輸入資料組態
輸入資料由通道定義。每個通道各有自己的來源位置 (Amazon S3 或 Amazon Elastic File System)、壓縮和格式選項。您最多可以 20 個輸入來源通道。如果您選擇的演算法支援多個輸入通道,您也可以指定這些通道。例如,當您使用XGBoost churn 預測筆記本
檢查點組態
訓練期間會定期產生檢查點。您必須選擇 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 調校函數會HyperparameterTuner
API直接呼叫 並傳遞參數。如果您的HPO調校任務包含多個訓練演算法,則調校函數會呼叫 HyperparameterTuner
的create
函數API。create
函數會告訴 API預期字典包含一或多個估算器。
在下一節中,程式碼範例示範如何使用 調整包含單一訓練演算法或多個演算法的任務 SageMaker Python SDK.
建立訓練任務定義
當您建立包含多個訓練演算法的調校任務時,您的調校任務組態會納入估算器和指標,以及訓練任務的其他參數。因此,您需要先建立訓練任務定義,再來設置調校任務。
下列程式碼範例示範如何擷取兩個包含內建演算法的 SageMaker 容器 XGBoost 和 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調校任務中使用。
定義調校任務的資源和設定
本節說明如何初始化調校器、定義資源以及指定調校任務的任務設定。如果您的調校任務包含多個訓練演算法,這些設定會套用至調校任務中所含的全部演算法。本節提供兩個定義調校器的程式碼範例。程式碼範例會示範如何最佳化單一訓練演算法,並附上如何調校多個訓練演算法的範例。
調校單一訓練演算法
下列程式碼範例示範如何初始化調諧器,並為一個 SageMaker 內建演算法設定超參數範圍,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, )
調校多個訓練演算法
每個訓練任務都需要不同的組態,而這些設定會透過使用字典來指定。下列程式碼範例示範如何使用兩個 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 ={})