在生成的容器中配置推理输出 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在生成的容器中配置推理输出

Autopilot 生成一个有序 ContainerDefinition 列表。这可用于构建模型以部署在机器学习管道中。此模型可用于在线托管和推理。

客户可以使用 ListCandidateForAutoMLJob API 列出推理容器定义。表示最佳候选模型的推理容器定义列表也在 DescribeAutoMLJob 响应中提供。

回归和分类问题类型的推理容器定义

Autopilot 会生成特定于训练模式和作业问题类型的推理容器。

超参数优化 (HPO) 模式的容器定义

  • 回归:HPO 生成两个容器:

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

    2. 另一个是算法容器,它转换特征并为数据集生成回归分数。

  • 分类:HPO 生成三个容器:

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

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

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

组合模式的容器定义

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

每种问题类型的推理响应

分类模型的推理响应

对于分类推理容器,您可以使用四个预定义的键来选择推理响应的内容:

  • 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)。

  2. 对于 HPO 模型,probability 等于 0.1,这是 Autopilot 选择 positive_class(在本例中为 0)的概率。

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

  3. probabilities 列出了 labels 中每个标签的 probability

  4. labels 是数据集中的唯一标签,其中第二个标签(在本例中为“0”)是 Autopilot 选择的 positive_class

默认情况下,推理容器配置为仅由 predicted_label 生成。要选择其他推理内容,您可以更新 inference_response_keys 参数以包含最多以下三个环境变量:

  • SAGEMAKER_INFERENCE_SUPPORTED:设置此项是为了提示您每个容器支持哪些内容。

  • SAGEMAKER_INFERENCE_INPUT:此项应设置为容器在输入负载中需要的键。

  • SAGEMAKER_INFERENCE_OUTPUT:此项应填充为容器输出的一组键。

HPO 模式下分类模型的推理响应

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

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

第二个容器(算法)支持的键是 predicted_label、probability 和 probabilities。请注意,有意不将 labels 添加到 SAGEMAKER_INFERENCE_SUPPORTED 中。

第三个分类模型容器支持的键是 predicted_labellabelsprobabilityprobabilities。因此,SAGEMAKER_INFERENCE_SUPPORTED 环境包含这些键的名称。

要更新用于接收 predicted_labelprobability 的推理容器的定义,请使用以下代码示例。

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_labelprobabilitieslabels 的推理容器的定义。请不要将 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'})

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

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, }, )
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)

组合模式下分类模型的推理响应

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

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

分类模型容器支持的键是 predicted_labellabelsprobabilityprobabilities。这些键包含在 SAGEMAKER_INFERENCE_SUPPORTED 环境中。

要更新推理容器定义以接收 predicted_labelprobability,请参阅以下代码示例。

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

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

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 模式下用于 SageMaker SDK for Python 的代码示例相同。提供此示例是为了便于您参考。

以下 HPO 代码示例使用 SageMaker SDK for 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)