

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在生成的容器中配置推理输出
<a name="autopilot-automate-model-development-container-output"></a>

Autopilot 生成一个有序 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_ContainerDefinition.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_ContainerDefinition.html) 列表。这可用于构建模型以部署在机器学习管道中。此模型可用于在线托管和推理。

客户可以使用 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_ListCandidateForAutoMLJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_ListCandidateForAutoMLJob.html) API 列出推理容器定义。表示最佳候选模型的推理容器定义列表也在 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeAutoMLJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeAutoMLJob.html) 响应中提供。

## 回归和分类问题类型的推理容器定义
<a name="autopilot-problem-type-container-output"></a>

Autopilot 会生成特定于[训练模式](https://docs.amazonaws.cn/sagemaker/latest/dg/autopilot-model-support-validation.html#autopilot-training-mode)和作业[问题类型的](https://docs.amazonaws.cn/sagemaker/latest/dg/autopilot-datasets-problem-types.html#autopilot-problem-types)推理容器。

### 超参数优化 (HPO) 模式的容器定义
<a name="autopilot-problem-type-container-output-hpo"></a>
+ **回归**：HPO 生成两个容器：

  1. 一个是特征工程容器，它将原始特征转换为回归算法用来进行训练的特征。

  1. 另一个是算法容器，它转换特征并为数据集生成回归分数。
+ **分类**：HPO 生成三个容器：

  1. 一个是特征工程容器，它将原始特征转换为分类算法用来进行训练的特征。

  1. 一个是算法容器，它生成具有最高概率的 `predicted_label`。此容器还可以生成与推理响应中分类结果关联的各种概率。

  1. 一个是特征工程容器，用于对算法预测进行后处理。例如，它可以对预测的标签执行逆变换，然后将其更改为原始标签。

### 组合模式的容器定义
<a name="autopilot-problem-type-container-output-ensemble"></a>

在组合模式下，回归和分类问题类型都只有一个推理容器。此推理容器会转换特征并根据问题类型生成预测。

## 每种问题类型的推理响应
<a name="autopilot-problem-type-inference-response"></a>

### 分类模型的推理响应
<a name="autopilot-problem-type-inference-response-classification"></a>

对于分类推理容器，您可以使用四个预定义的键来选择推理响应的内容：
+ `predicted_label`：预测正确标签的可能性最高的标签，由 Autopilot 确定。
+ `probability`: 
  + **HPO 模型：**二元分类的 `True` 类的概率。`predicted_label` 的多元分类的概率。
  + **组装模型：** `predicted_label` 的二元分类和多元分类的概率。
+ `probabilities`：所有相应类的概率列表。
+ `labels`：所有标签的列表。

例如，对于二元分类问题，如果您传递了推理响应键 `['predicted_label', 'probability', 'probabilities', 'labels']` 并且输出响应显示为 `[1, 0.1, "[0.9, 0.1]", "['1', '0']"]`，则应将其解释如下：

1. `predicted_label` 等于 `1`，因为标签“1”的概率更高（在本例中为 `0.9`）。

1. 对于 HPO 模型，`probability` 等于 `0.1`，这是 Autopilot 选择 `positive_class`（在本例中为 `0`）的概率。

   对于组合模型，`probability` 等于 `0.9`，这是 `predicted_label` 的概率。

1. `probabilities` 列出了 `labels` 中每个标签的 `probability`。

1. `labels` 是数据集中的唯一标签，其中第二个标签（在本例中为“0”）是 Autopilot 选择的 `positive_class`。

默认情况下，推理容器配置为仅由 `predicted_label` 生成。要选择其他推理内容，您可以更新 `inference_response_keys` 参数以包含最多以下三个环境变量：
+ `SAGEMAKER_INFERENCE_SUPPORTED`：设置此项是为了提示您每个容器支持哪些内容。
+ `SAGEMAKER_INFERENCE_INPUT`：此项应设置为容器在输入负载中需要的键。
+ `SAGEMAKER_INFERENCE_OUTPUT`：此项应填充为容器输出的一组键。

### HPO 模式下分类模型的推理响应
<a name="autopilot-problem-type-inference-response-classification-hpo"></a>

此部分介绍如何使用超参数优化 (HPO) 模式，配置来自分类模型的推理响应。

要在 HPO 模式下选择推理响应内容，请执行以下操作：将 `SAGEMAKER_INFERENCE_INPUT` 和 `SAGEMAKER_INFERENCE_OUTPUT` 变量添加到在 HPO 模式下为分类问题生成的第二个和第三个容器中。

第二个容器（算法）支持的键是 predicted\$1label、probability 和 probabilities。请注意，有意不将 `labels` 添加到 `SAGEMAKER_INFERENCE_SUPPORTED` 中。

第三个分类模型容器支持的键是 `predicted_label`、`labels`、`probability` 和 `probabilities`。因此，`SAGEMAKER_INFERENCE_SUPPORTED` 环境包含这些键的名称。

要更新用于接收 `predicted_label` 和 `probability` 的推理容器的定义，请使用以下代码示例。

```
containers[1]['Environment'].update({'SAGEMAKER_INFERENCE_OUTPUT': 'predicted_label, probability'})
containers[2]['Environment'].update({'SAGEMAKER_INFERENCE_INPUT': 'predicted_label, probability'})
containers[2]['Environment'].update({'SAGEMAKER_INFERENCE_OUTPUT': 'predicted_label, probability'})
```

以下代码示例更新用于接收 `predicted_label`、`probabilities` 和 `labels` 的推理容器的定义。请不要将 `labels` 传递到第二个容器（算法容器），因为它由第三个容器独立生成。

```
containers[1]['Environment'].update({'SAGEMAKER_INFERENCE_OUTPUT': 'predicted_label,probabilities'})
containers[2]['Environment'].update({'SAGEMAKER_INFERENCE_INPUT': 'predicted_label,probabilities'})
containers[2]['Environment'].update({'SAGEMAKER_INFERENCE_OUTPUT': 'predicted_label, probabilities,labels'})
```

以下可折叠部分提供了适用于 Python 的 SageMaker SDK 适用于 Python (Boto3) 的 Amazon SDK 和适用于 Python 的开发工具包的代码示例。每个部分都说明了如何在 HPO 模式下为相应的代码示例选择推理响应的内容。

#### 适用于 Python (Boto3) 的 Amazon SDK
<a name="autopilot-problem-type-inference-response-classification-hpo-boto3"></a>

```
import boto3

sm_client = boto3.client('sagemaker', region_name='<Region>')

role = '<IAM role>'
input_data = '<S3 input uri>'
output_path = '<S3 output uri>'

best_candidate = sm_client.describe_auto_ml_job(AutoMLJobName='<AutoML Job Name>')['BestCandidate']
best_candidate_containers = best_candidate['InferenceContainers']
best_candidate_name = best_candidate['CandidateName']

best_candidate_containers[1]['Environment'].update({'SAGEMAKER_INFERENCE_OUTPUT': 'predicted_label, probability'})
best_candidate_containers[2]['Environment'].update({'SAGEMAKER_INFERENCE_INPUT': 'predicted_label, probability'})
best_candidate_containers[2]['Environment'].update({'SAGEMAKER_INFERENCE_OUTPUT': 'predicted_label, probability'})

# create model
reponse = sm_client.create_model(
    ModelName = '<Model Name>',
    ExecutionRoleArn = role,
    Containers = best_candidate_containers
)

# Lauch Transform Job
response = sm_client.create_transform_job(
    TransformJobName='<Transform Job Name>',
    ModelName='<Model Name>',
    TransformInput={
        'DataSource': {
            'S3DataSource': {
                'S3DataType': 'S3Prefix',
                'S3Uri': input_data
            }
        },
        'ContentType': "text/CSV",
        'SplitType': 'Line'
    },
    TransformOutput={
        'S3OutputPath': output_path,
        'AssembleWith': 'Line',
    },
    TransformResources={
        'InstanceType': 'ml.m4.xlarge',
        'InstanceCount': 1,
    },
)
```

#### SageMaker Python 软件开发工具包
<a name="autopilot-problem-type-inference-response-classification-hpo-sdk"></a>

```
from sagemaker import AutoML

aml = AutoML.attach(auto_ml_job_name='<AutoML Job Name>')
aml_best_model = aml.create_model(name='<Model Name>',
                                  candidate=None,
                                  inference_response_keys**=['probabilities', 'labels'])

aml_transformer = aml_best_model.transformer(accept='text/csv',
                                            assemble_with='Line',
                                            instance_type='ml.m5.xlarge',
                                            instance_count=1,)

aml_transformer.transform('<S3 input uri>',
                          content_type='text/csv',
                          split_type='Line',
                          job_name='<Transform Job Name>',
                          wait=True)
```

### 组合模式下分类模型的推理响应
<a name="autopilot-problem-type-inference-response-classification-ensemble"></a>

此部分介绍如何使用组合模式，配置来自分类模型的推理响应。

在**组合模式**下，要选择推理响应的内容，请更新 `SAGEMAKER_INFERENCE_OUTPUT` 环境变量。

分类模型容器支持的键是 `predicted_label`、`labels`、`probability` 和 `probabilities`。这些键包含在 `SAGEMAKER_INFERENCE_SUPPORTED` 环境中。

要更新推理容器定义以接收 `predicted_label` 和 `probability`，请参阅以下代码示例。

```
containers[0]['Environment'].update({'SAGEMAKER_INFERENCE_OUTPUT': 'predicted_label, probability'})
```

以下可折叠部分提供的代码示例，可用于在组合模式下选择推理响应内容。该示例使用 适用于 Python (Boto3) 的 Amazon SDK。

#### 适用于 Python (Boto3) 的 Amazon SDK
<a name="autopilot-problem-type-inference-response-classification-ensembling-boto3"></a>

```
import boto3
sm_client = boto3.client('sagemaker', region_name='<Region>')

role = '<IAM role>'
input_data = '<S3 input uri>'
output_path = '<S3 output uri>' 

best_candidate = sm_client.describe_auto_ml_job(AutoMLJobName='<AutoML Job Name>')['BestCandidate']
best_candidate_containers = best_candidate['InferenceContainers']
best_candidate_name = best_candidate['CandidateName']

*best_candidate_containers[0]['Environment'].update({'SAGEMAKER_INFERENCE_OUTPUT': 'predicted_label, probability'})
*
# create model
reponse = sm_client.create_model(
    ModelName = '<Model Name>',
    ExecutionRoleArn = role,
    Containers = best_candidate_containers
)

# Lauch Transform Job
response = sm_client.create_transform_job(
    TransformJobName='<Transform Job Name>',
    ModelName='<Model Name>',
    TransformInput={
        'DataSource': {
            'S3DataSource': {
                'S3DataType': 'S3Prefix',
                'S3Uri': input_data
            }
        },
        'ContentType': "text/CSV",
        'SplitType': 'Line'
    },
    TransformOutput={
        'S3OutputPath': output_path,
        'AssembleWith': 'Line',
    },
    TransformResources={
        'InstanceType': 'ml.m4.xlarge',
        'InstanceCount': 1,
    },
)
```

以下可折叠部分提供的代码示例与 HPO 的 Python SageMaker 开发工具包示例相同。提供此示例是为了便于您参考。

#### SageMaker Python 软件开发工具包
<a name="autopilot-problem-type-inference-response-classification-ensembling-sdk"></a>

以下 HPO 代码示例使用 SageMaker 适用于 Python 的软件开发工具包。

```
from sagemaker import AutoML

aml = AutoML.attach(auto_ml_job_name='<AutoML Job Name>')
aml_best_model = aml.create_model(name='<Model Name>',
                                  candidate=None,
                                  *inference_response_keys**=['probabilities', 'labels'])*

aml_transformer = aml_best_model.transformer(accept='text/csv',
                                            assemble_with='Line',
                                            instance_type='ml.m5.xlarge',
                                            instance_count=1,)

aml_transformer.transform('<S3 input uri>',
                          content_type='text/csv',
                          split_type='Line',
                          job_name='<Transform Job Name>',
                          wait=True)
```