本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 CloudWatch 和 Lambda 設定自動訓練任務終止的偵錯工具
Debugger 規則會監控訓練任務狀態,而 CloudWatch 事件規則會監控 Debugger 規則訓練任務評估狀態。下列各節概述使用 CloudWatch 和 Lambda 自動化訓練任務終止所需的程序。
步驟 1:建立 Lambda 函數
建立 Lambda 函式
在 開啟 AWS Lambda 主控台https://console.aws.amazon.com/lambda/
。 -
在導覽面板上,選擇函式,然後選擇建立函式。
-
在建立函式頁面上,選擇從頭開始撰寫。
-
在基本資訊區段中,輸入函數名稱 (例如 debugger-rule-stop-training-job )。
-
針對執行期,選擇 Python 3.7。
-
針對許可,請展開下拉式清單選項,然後選擇變更預設執行角色。
-
針對執行角色 ,選擇使用現有角色,然後選擇您在 上用於訓練任務IAM的角色 SageMaker。
注意
確保您使用的執行角色連接
AmazonSageMakerFullAccess
和AWSLambdaBasicExecutionRole
。否則,Lambda 函式將無法正確回應訓練工作的 Debugger 規則狀態變更。如果您不確定正在使用哪個執行角色,請在 Jupyter 筆記本儲存格中執行下列程式碼,以擷取執行角色輸出:import sagemaker sagemaker.get_execution_role()
-
請在頁面底部,選擇建立函式。
下圖顯示建立函式頁面的範例,其輸入欄位和選取已完成。
步驟 2:設定 Lambda 函式
配置 Lambda 函式
-
在設定頁面的函式程式碼區段中,將下列 Python 指令碼貼到 Lambda 程式碼編輯器窗格中。
lambda_handler
函數會監控 收集的偵錯工具規則評估狀態, CloudWatch 並觸發StopTrainingJob
API操作。client
的 AWS SDK for Python (Boto3) SageMaker 提供高階方法stop_training_job
,可觸發StopTrainingJob
API操作。import json import boto3 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): training_job_name = event.get("detail").get("TrainingJobName") logging.info(f'Evaluating Debugger rules for training job: {training_job_name}') eval_statuses = event.get("detail").get("DebugRuleEvaluationStatuses", None) if eval_statuses is None or len(eval_statuses) == 0: logging.info("Couldn't find any debug rule statuses, skipping...") return { 'statusCode': 200, 'body': json.dumps('Nothing to do') } # should only attempt stopping jobs with InProgress status training_job_status = event.get("detail").get("TrainingJobStatus", None) if training_job_status != 'InProgress': logging.debug(f"Current Training job status({training_job_status}) is not 'InProgress'. Exiting") return { 'statusCode': 200, 'body': json.dumps('Nothing to do') } client = boto3.client('sagemaker') for status in eval_statuses: logging.info(status.get("RuleEvaluationStatus") + ', RuleEvaluationStatus=' + str(status)) if status.get("RuleEvaluationStatus") == "IssuesFound": secondary_status = event.get("detail").get("SecondaryStatus", None) logging.info( f'About to stop training job, since evaluation of rule configuration {status.get("RuleConfigurationName")} resulted in "IssuesFound". ' + f'\ntraining job "{training_job_name}" status is "{training_job_status}", secondary status is "{secondary_status}"' + f'\nAttempting to stop training job "{training_job_name}"' ) try: client.stop_training_job( TrainingJobName=training_job_name ) except Exception as e: logging.error( "Encountered error while trying to " "stop training job {}: {}".format( training_job_name, str(e) ) ) raise e return None
如需 Lambda 程式碼編輯器介面的詳細資訊,請參閱使用 AWS Lambda 主控台編輯器建立函數。
-
略過所有其他設定,然後選擇組態頁面頂端的儲存。
步驟 3:建立 CloudWatch 事件規則,並連結至 Debugger 的 Lambda 函數
若要建立 CloudWatch 事件規則並連結至 Debugger 的 Lambda 函數
在 開啟 CloudWatch 主控台https://console.aws.amazon.com/cloudwatch/
。 -
在左側導覽窗格內的事件下,選擇規則。
-
選擇建立規則。
-
在步驟 1:建立規則頁面的事件來源區段中,選擇SageMaker服務名稱 ,然後選擇事件類型 SageMaker 的訓練任務狀態變更。事件模式預覽應如下所示JSON字串:
{ "source": [ "aws.sagemaker" ], "detail-type": [ "SageMaker Training Job State Change" ] }
-
在目標區段中,選擇新增目標*,然後選擇您建立的 debugger-rule-stop-training-job Lambda 函數。此步驟會將 CloudWatch 事件規則與 Lambda 函數連結。
-
選擇設定詳細資訊,然後前往步驟 2:設定規則詳細資訊頁面。
-
指定 CloudWatch 規則定義名稱。例如,debugger-cw-event-rule。
-
選擇建立規則以完成。
-
返回 Lambda 函式組態頁面,並重新整理頁面。在設計工具面板中確認已正確設定。 CloudWatch 事件規則應註冊為 Lambda 函數的觸發條件。組態設計看起來應該類似下列範例: