

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

# 透過 存取訓練容器 AWS Systems Manager 以進行遠端偵錯
<a name="train-remote-debugging"></a>

您可以透過 AWS Systems Manager (SSM) 安全地連線至 SageMaker 訓練容器。如此一來，您就可以存取 Shell 層級，以偵錯在容器內執行的訓練任務。您也可以記錄串流到 Amazon CloudWatch 的命令和回應。如果您使用自己的 Amazon Virtual Private Cloud (VPC) 來訓練模型，您可以使用 AWS PrivateLink 來設定 SSM 的 VPC 端點，並透過 SSM 私下連線至容器。

您可以連線至 [SageMaker AI 架構容器](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)或連線至透過 SageMaker 訓練環境設定的自有訓練容器。

## 設定 IAM 許可
<a name="train-remote-debugging-iam"></a>

若要在 SageMaker 訓練容器中啟用 SSM，您需要為容器設定 IAM 角色。若要讓您或 AWS 帳戶中的使用者透過 SSM 存取訓練容器，您需要設定具有使用 SSM 許可的 IAM 使用者。

### IAM 角色
<a name="train-remote-debugging-iam-role"></a>

若要以 SSM 代理程式啟動 SageMaker 訓練容器，請提供具 SSM 許可的 IAM 角色。

若要為您的訓練任務啟用遠端偵錯，SageMaker AI 需要在訓練任務啟動時，於訓練容器中啟動 [SSM 代理程式](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html)。若要允許 SSM 代理程式與 SSM 服務溝通，請將下列政策新增至您用來執行訓練任務的 IAM 角色。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	             
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"    
        }
    ]
 }
```

------

### IAM 使用者
<a name="train-remote-debugging-iam-user"></a>

新增下列政策以授予 IAM 使用者 SSM 工作階段連線至 SSM 目標的許可。在此情況下，SSM 目標為 SageMaker 訓練容器。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	             
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession",
                "ssm:TerminateSession"
            ],
            "Resource": "*"    
        }
    ]
}
```

------

 您可以新增 `Condition` 索引鍵來限制 IAM 使用者僅連線到特定訓練任務的容器，如下列政策範例所示。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	             
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession",
                "ssm:TerminateSession"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/aws:ssmmessages:target-id": [
                        "sagemaker-training-job:*"
                    ]
                }
            } 
        }
    ]
}
```

------

您也可以明確使用 `sagemaker:EnableRemoteDebug` 條件索引鍵來限制遠端偵錯。以下是 IAM 使用者限制遠端偵錯的範例政策。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DenyRemoteDebugInTrainingJob",
            "Effect": "Allow",
            "Action": [
                "sagemaker:CreateTrainingJob",
                "sagemaker:UpdateTrainingJob"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "sagemaker:EnableRemoteDebug": false
                }
            }
        }
    ]
}
```

------

如需更多資訊，請參閱 *AWS 服務授權參考*內的 [Amazon SageMaker AI 的條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsagemaker.html#amazonsagemaker-policy-keys)。

## 如何啟用 SageMaker 訓練任務的遠端偵錯
<a name="train-remote-debugging-how-to-use"></a>

在本節中了解如何在 Amazon SageMaker AI 中啟動或更新訓練任務時啟用遠端偵錯。

------
#### [ SageMaker Python SDK ]

您可以使用 SageMaker Python SDK 中的估算器類別，使用 `enable_remote_debug` 參數或 `enable_remote_debug()` 和 `disable_remote_debug()` 方法開啟或關閉遠端偵錯。

**建立訓練任務時啟用遠端偵錯**

若要在建立訓練任務時啟用遠端偵錯，請將 `enable_remote_debug` 參數設為 `True`。預設值為 `False`，因此，如果您完全未設定此參數或明確將其設為 `False`，則會停用遠端偵錯功能。

```
import sagemaker

session = sagemaker.Session()

estimator = sagemaker.estimator.Estimator(
    ...,
    sagemaker_session=session,
    image_uri="<your_image_uri>", #must be owned by your organization or Amazon DLCs 
    role=role,
    instance_type="ml.m5.xlarge",
    instance_count=1,
    output_path=output_path,
    max_run=1800,
    enable_remote_debug=True
)
```

**更新訓練任務以啟用遠端偵錯**

您可以使用下列估算器類別方法，在任務的 `SecondaryStatus` 為 `Downloading` 或 `Training` 時，於訓練任務執行時啟用或停用遠端偵錯。

```
# Enable RemoteDebug
estimator.enable_remote_debug()

# Disable RemoteDebug
estimator.disable_remote_debug()
```

------
#### [ 適用於 Python (Boto3) 的 AWS SDK ]

**建立訓練任務時啟用遠端偵錯**

若要在建立訓練任務時啟用遠端偵錯，請在 `RemoteDebugConfig` 參數中將 `EnableRemoteDebug` 索引鍵的值設為 `True`。

```
import boto3

sm = boto3.Session(region_name=region).client("sagemaker")

# Start a training job
sm.create_training_job(
    ...,
    TrainingJobName=job_name,
    AlgorithmSpecification={
        // Specify a training Docker container image URI 
        // (Deep Learning Container or your own training container) to TrainingImage.
        "TrainingImage": "<your_image_uri>",
        "TrainingInputMode": "File"
    },
    RoleArn=iam_role_arn,
    OutputDataConfig=output_path,
    ResourceConfig={
        "InstanceType": "ml.m5.xlarge",
        "InstanceCount": 1,
        "VolumeSizeInGB": 30
    },
    StoppingCondition={
        "MaxRuntimeInSeconds": 86400
    },
    RemoteDebugConfig={
        "EnableRemoteDebug": True
    }
)
```

**更新訓練任務以啟用遠端偵錯**

您可以使用 `update_traing_job` API，在任務的 `SecondaryStatus` 為 `Downloading` 或 `Training` 時，於訓練任務執行時啟用或停用遠端偵錯。

```
# Update a training job
sm.update_training_job(
    TrainingJobName=job_name,
    RemoteDebugConfig={
        "EnableRemoteDebug": True     # True | False
    }
)
```

------
#### [ AWS Command Line Interface (CLI) ]

**建立訓練任務時啟用遠端偵錯**

準備 JSON 格式的 `CreateTrainingJob` 請求檔案，如下所示。

```
// train-with-remote-debug.json
{
    "TrainingJobName": job_name,
    "RoleArn": iam_role_arn,
    "AlgorithmSpecification": {
        // Specify a training Docker container image URI (Deep Learning Container or your own training container) to TrainingImage.
        "TrainingImage": "<your_image_uri>",
        "TrainingInputMode": "File"
    },
    "OutputDataConfig": {
        "S3OutputPath": output_path
    },
    "ResourceConfig": {
        "InstanceType": "ml.m5.xlarge",
        "InstanceCount": 1,
        "VolumeSizeInGB": 30
    },
    "StoppingCondition": {
        "MaxRuntimeInSeconds": 86400
    },
    "RemoteDebugConfig": {
        "EnableRemoteDebug": True
    }
}
```

儲存 JSON 檔案後，請在您提交訓練任務的終端機中執行下列命令。下列範例命令假設 JSON 檔案名為 `train-with-remote-debug.json`。如果您從 Jupyter 筆記本執行該命令，請將驚嘆號 (`!`) 新增至命令列的開頭。

```
aws sagemaker create-training-job \
    --cli-input-json file://train-with-remote-debug.json
```

**更新訓練任務以啟用遠端偵錯**

準備 JSON 格式的 `UpdateTrainingJob` 請求檔案，如下所示。

```
// update-training-job-with-remote-debug-config.json
{
    "TrainingJobName": job_name,
    "RemoteDebugConfig": {
        "EnableRemoteDebug": True
    }
}
```

儲存 JSON 檔案後，請在您提交訓練任務的終端機中執行下列命令。下列範例命令假設 JSON 檔案名為 `train-with-remote-debug.json`。如果您從 Jupyter 筆記本執行該命令，請將驚嘆號 (`!`) 新增至命令列的開頭。

```
aws sagemaker update-training-job \
    --cli-input-json file://update-training-job-with-remote-debug-config.json
```

------

## 存取您的訓練容器
<a name="train-remote-debugging-access-container"></a>

當相應訓練任務的 `SecondaryStatus` 為 `Training` 時，您就可以存取訓練容器。下列程式碼範例示範如何使用 `DescribeTrainingJob` API 檢查訓練任務的狀態、如何在 CloudWatch 中檢查訓練任務日誌，以及如何登入訓練容器。

**檢查訓練任務的狀態**

------
#### [ SageMaker Python SDK ]

若要檢查訓練任務的 `SecondaryStatus`，請執行下列 SageMaker Python SDK 程式碼。

```
import sagemaker

session = sagemaker.Session()

# Describe the job status
training_job_info = session.describe_training_job(job_name)
print(training_job_info)
```

------
#### [ 適用於 Python (Boto3) 的 AWS SDK ]

若要檢查訓練任務的 `SecondaryStatus`，請執行下列 SDK for Python (Boto3) 程式碼。

```
import boto3

session = boto3.session.Session()
region = session.region_name
sm = boto3.Session(region_name=region).client("sagemaker")

# Describe the job status
sm.describe_training_job(TrainingJobName=job_name)
```

------
#### [ AWS Command Line Interface (CLI) ]

若要檢查訓練任務`SecondaryStatus`的 ，請針對 SageMaker AI 執行下列 AWS CLI 命令。

```
aws sagemaker describe-training-job \
    --training-job-name job_name
```

------

**尋找訓練容器的主機名稱**

若要透過 SSM 連線至訓練容器，請針對目標 ID 使用此格式：`sagemaker-training-job:<training-job-name>_algo-<n>`，其中 `algo-<n>` 是容器主機的名稱。如果您的任務在單一執行個體上執行，主機一律為 `algo-1`。如果您在多個執行個體上執行分散式訓練任務，SageMaker AI 會建立相同數量的主機和日誌串流。例如，如果您使用 4 個執行個體，SageMaker AI 會建立 `algo-1`、`algo-2`、`algo-3` 和 `algo-4`。您必須決定要偵錯哪個日誌串流及其主機號碼。若要存取與訓練任務相關的日誌串流，請執行下列動作。

1. 開啟位在 [https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/) 的 Amazon SageMaker AI 主控台。

1. 在左側導覽窗格中，選擇**訓練**，然後選擇**訓練任務**。

1. 在**訓練任務**清單下，選擇您要偵錯的訓練任務。畫面即會顯示訓練任務詳細資訊頁面。

1. 在**監控**區段中，選擇**檢視日誌**。相關的訓練任務日誌串流清單會在 CloudWatch 主控台中開啟。

1. 日誌串流名稱會以 `<training-job-name>/algo-<n>-<time-stamp>` 格式顯示，其中 `algo-<n>` 代表主機名稱。

若要進一步了解 SageMaker AI 如何管理多執行個體分散式訓練的組態資訊，請參閱[分散式訓練組態](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-running-container.html#your-algorithms-training-algo-running-container-dist-training)。

**存取訓練容器**

請在終端機中使用下列命令來啟動 SSM 工作階段 (`[aws ssm start-session](https://docs.aws.amazon.com/cli/latest/reference/ssm/start-session.html)`) 並連線至訓練容器。

```
aws ssm start-session --target sagemaker-training-job:<training-job-name>_algo-<n>
```

例如，如果訓練任務名稱為 `training-job-test-remote-debug` 且主機名稱為 `algo-1`，則目標 ID 會變成 `sagemaker-training-job:training-job-test-remote-debug_algo-1`。如果此命令的輸出類似於 `Starting session with SessionId:xxxxx`，即表示連線成功。

### 使用 存取 SSM AWS PrivateLink
<a name="train-remote-debugging-access-container-vpc"></a>

如果您的訓練容器在未連線至公有網際網路的 Amazon Virtual Private Cloud 中執行，您可以使用 AWS PrivateLink 來啟用 SSM。 會將端點執行個體、SSM 和 Amazon EC2 之間的所有網路流量 AWS PrivateLink 限制在 Amazon 網路。如需如何使用 設定 SSM 存取的詳細資訊 AWS PrivateLink，請參閱[設定 Session Manager 的 Amazon VPC 端點](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-privatelink.html)。

## 記錄 SSM 工作階段命令和結果
<a name="train-remote-debugging-log-ssm"></a>

遵循[建立工作階段管理員偏好設定文件 (命令列)](https://docs.aws.amazon.com/systems-manager/latest/userguide/getting-started-create-preferences-cli.html) 的指示之後，您可以建立 SSM 文件來定義 SSM 工作階段的偏好設定。您可以使用 SSM 文件來設定工作階段選項，包括資料加密、工作階段持續時間和日誌記錄。例如，您可以指定在 Amazon Simple Storage Service (Amazon S3) 儲存貯體或 Amazon CloudWatch Logs 日誌群組中存放工作階段日誌資料的選項。您可以建立定義 AWS 帳戶所有工作階段一般偏好設定的文件 AWS 區域，以及定義個別工作階段偏好設定的文件。

## 從 SSM 檢查錯誤日誌，以對問題進行故障診斷
<a name="train-remote-debugging-checking-ssm-agent-logs"></a>

Amazon SageMaker AI 會從 SSM 代理程式將錯誤上傳至 `/aws/sagemaker/TrainingJobs` 日誌群組中的 CloudWatch Logs。SSM 代理程式日誌串流以下列格式命名：`<job-name>/algo-<n>-<timestamp>/ssm`。例如，如果您建立名為 `training-job-test-remote-debug` 的雙節點訓練任務，訓練任務日誌 `training-job-test-remote-debug/algo-<n>-<timestamp>` 和多個 SSM 代理程式錯誤日誌 `training-job-test-remote-debug/algo-<n>-<timestamp>/ssm` 會上傳至您的 CloudWatch Logs。在此範例中，您可以檢閱 `*/ssm` 日誌串流，以對 SSM 問題進行故障診斷。

```
training-job-test-remote-debug/algo-1-1680535238
training-job-test-remote-debug/algo-2-1680535238
training-job-test-remote-debug/algo-1-1680535238/ssm
training-job-test-remote-debug/algo-2-1680535238/ssm
```

## 考量事項
<a name="train-remote-debugging-considerations"></a>

使用 SageMaker AI 遠端偵錯時，請考慮下列事項。
+ [SageMaker AI 演算法容器](https://docs.aws.amazon.com/sagemaker/latest/dg/algorithms-choose.html)或 SageMaker AI 上的容器不支援遠端偵錯 AWS Marketplace。
+ 您無法為已啟用網路隔離的容器啟動 SSM 工作階段，因為隔離會防止傳出網路呼叫。