预检查模型容器 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

预检查模型容器

本节介绍如何在配置端点之前预先检查模型容器输入和输出的兼容性。SageMaker Clarify 解释器与模型无关,但是对模型容器的输入和输出有要求。

注意

您可以通过将容器配置为支持批处理请求来提高效率,批处理请求支持在单个请求中包含两个或多个记录。例如,一个记录是单行 CSV 数据或一行 JSON 行数据。SageMaker Clarify 将尝试先将一小批记录发送到模型容器,然后再回退到单记录请求。

模型容器输入

CSV

模型容器支持 MIME 类型为 text/csv 的 CSV 格式输入。下表显示了 SageMaker Clarify 支持的示例输入。

模型容器输入(字符串表示) 注释

'1,2,3,4'

使用四个数字特征的单个记录。

'1,2,3,4\n5,6,7,8'

两个记录,用换行符 '\n' 分隔。

'"This is a good product",5'

包含文本特征和数字特征的单个记录。

‘"This is a good product",5\n"Bad shopping experience",1'

两个记录。

JSON Lines

SageMaker 还支持 MIME 类型为 application/jsonlinesJSON 行密集格式的输入,如下表所示。

模型容器输入 注释

'{"data":{"features":[1,2,3,4]}}'

单个记录;可以通过 JMESPath 表达式 data.features 提取的特征列表。

'{"data":{"features":[1,2,3,4]}}\n{"data":{"features":[5,6,7,8]}}'

两个记录。

'{"features":["This is a good product",5]}'

单个记录;可以通过 JMESPath 表达式 features 提取的特征列表。

'{"features":["This is a good product",5]}\n{"features":["Bad shopping experience",1]}'

两个记录。

模型容器输出

您的模型容器输出也应采用 CSV 或 JSON 行密集格式。此外,模型容器应包括输入记录的概率,SageMaker Clarify 使用这些概率来计算特征归因。

以下数据示例适用于 CSV 格式的模型容器输出。

Probability only

对于回归和二进制分类问题,模型容器输出预测标签的单个概率值(分数)。可以使用列索引 0 提取这些概率。对于多分类问题,模型容器会输出概率(分数)列表。对于多分类问题,如果未提供索引,则提取所有值。

模型容器输入 模型容器输出(字符串表示)

单个记录

'0.6'

两个记录(结果位于一行)

'0.6,0.3'

两个记录(结果分为两行)

'0.6\n0.3'

多分类模型的单个记录(三个分类)

'0.1,0.6,0.3'

多分类模型的两个记录(三个分类)

'0.1,0.6,0.3\n0.2,0.5,0.3'

Predicted label and probabilities

模型容器以 CSV 格式输出预测标签,然后输出其概率。可以使用索引 1 提取概率。

模型容器输入 模型容器输出

单个记录

'1,0.6'

两个记录

'1,0.6\n0,0.3'

Predicted labels header and probabilities

可以将由 Autopilot 训练的多分类模型容器配置为以 CSV 格式输出预测标签和概率列表的字符串表示形式。在下面的示例中,可以通过索引 1 提取概率。标签标头可以按索引 1 提取,而标签标题可以使用索引 0 提取。

模型容器输入 模型容器输出

单个记录

'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'

两个记录

'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"\n"[\'cat\',\'dog\',\'fish\']","[0.2,0.5,0.3]"'

以下数据示例适用于 JSON 行格式的模型容器输出。

Probability only

在此示例中,模型容器会输出可通过 JSON 行格式的 JMESPath 表达式 score 提取的概率。

模型容器输入 模型容器输出

单个记录

'{"score":0.6}'

两个记录

'{"score":0.6}\n{"score":0.3}'

Predicted label and probabilities

在此示例中,多分类模型容器会以 JSON 行格式输出标签标头列表以及概率列表。概率可以通过 JMESPath 表达式 probability 提取,并且标签标头可以通过 JMESPath 表达式 predicted labels 提取。

模型容器输入 模型容器输出

单个记录

'{"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}'

两个记录

'{"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}\n{"predicted_labels":["cat","dog","fish"],"probabilities":[0.2,0.5,0.3]}'

Predicted labels header and probabilities

在此示例中,多分类模型容器会以 JSON 行格式输出标签标头和概率的列表。概率可以通过 JMESPath 表达式 probability 提取,并且标签标头可以通过 JMESPath 表达式 predicted labels 提取。

模型容器输入 模型容器输出

单个记录

'{"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}'

两个记录

'{"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}\n{"predicted_labels":["cat","dog","fish"],"probabilities":[0.2,0.5,0.3]}'

模型容器验证

我们建议您将模型部署到 SageMaker 实时推理端点,然后向该端点发送请求。手动检查申请(模型容器输入)和响应(模型容器输出),确保两者都符合模型容器输入部分和模型容器输出部分中的要求。如果您的模型容器支持批处理请求,则可以从单个记录请求开始,然后尝试两个或更多记录。

以下命令显示如何使用 Amazon CLI 请求响应。Amazon CLI 已预先安装在 SageMaker Studio 和 SageMaker 笔记本实例中。如果需要安装 Amazon CLI,请遵循本安装指南操作。

aws sagemaker-runtime invoke-endpoint \ --endpoint-name $ENDPOINT_NAME \ --content-type $CONTENT_TYPE \ --accept $ACCEPT_TYPE \ --body $REQUEST_DATA \ $CLI_BINARY_FORMAT \ /dev/stderr 1>/dev/null

参数定义如下:

  • $ENDPOINT NAME:端点的名称。

  • $CONTENT_TYPE:请求的 MIME 类型(模型容器输入)。

  • $ACCEPT_TYPE:响应的 MIME 类型(模型容器输出)。

  • $REQUEST_DATA:请求的负载字符串。

  • $CLI_BINARY_FORMAT:命令行界面 (CLI) 参数的格式。对于 Amazon CLI v1,此参数应保留为空。对于 v2,此参数应设置为 --cli-binary-format raw-in-base64-out

注意

Amazon CLI v2 将二进制参数作为 base64 编码字符串 default 进行传递。

下面的示例使用 Amazon CLI v1:

Request and response in CSV format
  • 请求由单个记录组成,而响应是其概率值。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-sagemaker-xgboost-model \ --content-type text/csv \ --accept text/csv \ --body '1,2,3,4' \ /dev/stderr 1>/dev/null

    输出:

    0.6

  • 请求由两个记录组成,响应包括其概率,模型用逗号分隔概率。--body 中的 $'content' 表达式告诉命令将内容中的 \n 解释为换行符。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-sagemaker-xgboost-model \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    输出:

    0.6,0.3

  • 请求由两个记录组成,响应包括其概率,模型用换行符分隔概率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-1 \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    输出:

    0.6

    0.3

  • 请求由单个记录组成,响应为概率值(多分类模型,三个分类)。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-1 \ --content-type text/csv \ --accept text/csv \ --body '1,2,3,4' \ /dev/stderr 1>/dev/null

    输出:

    0.1,0.6,0.3

  • 请求由两个记录组成,响应包括其概率值(多分类模型,三个分类)。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-1 \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    输出:

    0.1,0.6,0.3

    0.2,0.5,0.3

  • 请求由两个记录组成,响应包括预测标签和概率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-2 \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    输出:

    1,0.6

    0,0.3

  • 请求由两个记录组成,响应包括标签标头和概率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-3 \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    输出:

    "['cat','dog','fish']","[0.1,0.6,0.3]"

    "['cat','dog','fish']","[0.2,0.5,0.3]"

Request and response in JSON Lines format
  • 请求由单个记录组成,而响应是其概率值。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-jsonlines \ --content-type application/jsonlines \ --accept application/jsonlines \ --body '{"features":["This is a good product",5]}' \ /dev/stderr 1>/dev/null

    输出:

    {"score":0.6}

  • 请求包含两个记录,响应包括预测标签和概率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-jsonlines-2 \ --content-type application/jsonlines \ --accept application/jsonlines \ --body $'{"features":[1,2,3,4]}\n{"features":[5,6,7,8]}' \ /dev/stderr 1>/dev/null

    输出:

    {"predicted_label":1,"probability":0.6}

    {"predicted_label":0,"probability":0.3}

  • 请求包含两个记录,响应包括标签标头和概率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-jsonlines-3 \ --content-type application/jsonlines \ --accept application/jsonlines \ --body $'{"data":{"features":[1,2,3,4]}}\n{"data":{"features":[5,6,7,8]}}' \ /dev/stderr 1>/dev/null

    输出:

    {"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}

    {"predicted_labels":["cat","dog","fish"],"probabilities":[0.2,0.5,0.3]}

Request and response in different formats
  • 请求采用 CSV 格式,响应采用 JSON 行格式:

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-in-jsonlines-out \ --content-type text/csv \ --accept application/jsonlines \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    输出:

    {"probability":0.6}

    {"probability":0.3}

  • 请求采用 JSON 行格式,响应采用 CSV 格式:

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-jsonlines-in-csv-out \ --content-type application/jsonlines \ --accept text/csv \ --body $'{"features":[1,2,3,4]}\n{"features":[5,6,7,8]}' \ /dev/stderr 1>/dev/null

    输出:

    0.6

    0.3

验证完成后,删除测试端点。