使用 CloudWatch 和 Lambda 設定自動訓練任務終止的偵錯工具 - Amazon SageMaker

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

使用 CloudWatch 和 Lambda 設定自動訓練任務終止的偵錯工具

Debugger 規則會監控訓練任務狀態,而 CloudWatch 事件規則會監控 Debugger 規則訓練任務評估狀態。下列各節概述使用 CloudWatch 和 Lambda 自動化訓練任務終止所需的程序。

步驟 1:建立 Lambda 函數

建立 Lambda 函式
  1. 在 開啟 AWS Lambda 主控台https://console.aws.amazon.com/lambda/

  2. 在導覽面板上,選擇函式,然後選擇建立函式

  3. 建立函式頁面上,選擇從頭開始撰寫

  4. 基本資訊區段中,輸入函數名稱 (例如 debugger-rule-stop-training-job )。

  5. 針對執行期,選擇 Python 3.7

  6. 針對許可,請展開下拉式清單選項,然後選擇變更預設執行角色

  7. 針對執行角色 ,選擇使用現有角色,然後選擇您在 上用於訓練任務IAM的角色 SageMaker。

    注意

    確保您使用的執行角色連接 AmazonSageMakerFullAccessAWSLambdaBasicExecutionRole。否則,Lambda 函式將無法正確回應訓練工作的 Debugger 規則狀態變更。如果您不確定正在使用哪個執行角色,請在 Jupyter 筆記本儲存格中執行下列程式碼,以擷取執行角色輸出:

    import sagemaker sagemaker.get_execution_role()
  8. 請在頁面底部,選擇建立函式

下圖顯示建立函式頁面的範例,其輸入欄位和選取已完成。

建立函式頁面。

步驟 2:設定 Lambda 函式

配置 Lambda 函式
  1. 在設定頁面的函式程式碼區段中,將下列 Python 指令碼貼到 Lambda 程式碼編輯器窗格中。lambda_handler 函數會監控 收集的偵錯工具規則評估狀態, CloudWatch 並觸發StopTrainingJobAPI操作。client 的 AWS SDK for Python (Boto3) SageMaker 提供高階方法 stop_training_job,可觸發 StopTrainingJobAPI操作。

    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 主控台編輯器建立函數。

  2. 略過所有其他設定,然後選擇組態頁面頂端的儲存

步驟 3:建立 CloudWatch 事件規則,並連結至 Debugger 的 Lambda 函數

若要建立 CloudWatch 事件規則並連結至 Debugger 的 Lambda 函數
  1. 在 開啟 CloudWatch 主控台https://console.aws.amazon.com/cloudwatch/

  2. 在左側導覽窗格內的事件下,選擇規則

  3. 選擇建立規則

  4. 步驟 1:建立規則頁面的事件來源區段中,選擇SageMaker服務名稱 ,然後選擇事件類型 SageMaker 的訓練任務狀態變更。事件模式預覽應如下所示JSON字串:

    { "source": [ "aws.sagemaker" ], "detail-type": [ "SageMaker Training Job State Change" ] }
  5. 目標區段中,選擇新增目標*,然後選擇您建立的 debugger-rule-stop-training-job Lambda 函數。此步驟會將 CloudWatch 事件規則與 Lambda 函數連結。

  6. 選擇設定詳細資訊,然後前往步驟 2:設定規則詳細資訊頁面。

  7. 指定 CloudWatch 規則定義名稱。例如,debugger-cw-event-rule

  8. 選擇建立規則以完成。

  9. 返回 Lambda 函式組態頁面,並重新整理頁面。在設計工具面板中確認已正確設定。 CloudWatch 事件規則應註冊為 Lambda 函數的觸發條件。組態設計看起來應該類似下列範例:

    CloudWatch 組態的設計工具面板。