

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

# 预检查模型容器
<a name="clarify-online-explainability-precheck"></a>

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

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

## 模型容器输入
<a name="clarify-online-explainability-input"></a>

------
#### [ CSV ]

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


| 模型容器输入（字符串表示） | 评论 | 
| --- | --- | 
|  '1,2,3,4'  |  使用四个数字特征的单个记录。  | 
|  '1,2,3,4\$1n5,6,7,8'  |  两条记录，用换行符“\$1n”分隔。  | 
|  '"This is a good product",5'  |  包含文本特征和数字特征的单个记录。  | 
|  ‘"This is a good product",5\$1n"Bad shopping experience",1'  |  两个记录。  | 

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

SageMaker AI 还支持以 [JSON 行密集格式](https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-inference.html#cm-jsonlines)输入，MIME 类型为:`application/jsonlines`，如下表所示。


| 模型容器输入 | 评论 | 
| --- | --- | 
|  '\$1"data":\$1"features":[1,2,3,4]\$1\$1'  |  单条记录；可以通过 JMESPath 表达式提取特征列表`data.features`。  | 
|  '\$1"data":\$1"features":[1,2,3,4]\$1\$1\$1n\$1"data":\$1"features":[5,6,7,8]\$1\$1'  |  两个记录。  | 
|  '\$1"features":["This is a good product",5]\$1'  |  单条记录；可以通过 JMESPath 表达式提取特征列表`features`。  | 
|  '\$1"features":["This is a good product",5]\$1\$1n\$1"features":["Bad shopping experience",1]\$1'  |  两个记录。  | 

------

## 模型容器输出
<a name="clarify-online-explainability-output"></a>

您的模型容器输出也应采用 CSV 或 JSON 行密集格式。此外，模型容器应包括输入记录的概率，Clarify 使用这些 SageMaker 概率来计算要素属性。

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

------
#### [ Probability only ]

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


| 模型容器输入 | 模型容器输出（字符串表示） | 
| --- | --- | 
|  单个记录  |  '0.6'  | 
|  两个记录（结果位于一行）  |  '0.6,0.3'  | 
|  两个记录（结果分为两行）  |  '0.6\$1n0.3'  | 
|  多分类模型的单个记录（三个分类）  |  '0.1,0.6,0.3'  | 
|  多分类模型的两个记录（三个分类）  |  '0.1,0.6,0.3\$1n0.2,0.5,0.3'  | 

------
#### [ Predicted label and probabilities ]

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


| 模型容器输入 | 模型容器输出 | 
| --- | --- | 
|  单个记录  |  '1,0.6'  | 
|  两条记录  |  '1,0.6\$1n0,0.3'  | 

------
#### [ Predicted labels header and probabilities ]

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


| 模型容器输入 | 模型容器输出 | 
| --- | --- | 
|  单个记录  |  '"[\$1'cat\$1',\$1'dog\$1',\$1'fish\$1']","[0.1,0.6,0.3]"'  | 
|  两个记录  |  '"[\$1'cat\$1',\$1'dog\$1',\$1'fish\$1']","[0.1,0.6,0.3]"\$1n"[\$1'cat\$1',\$1'dog\$1',\$1'fish\$1']","[0.2,0.5,0.3]"'  | 

------

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

------
#### [ Probability only ]

在此示例中，模型容器会输出可通过 **JSON 行**格式的 [https://jmespath.org/](https://jmespath.org/) 表达式 `score` 提取的概率。


| 模型容器输入 | 模型容器输出 | 
| --- | --- | 
|  单个记录  |  '\$1"score":0.6\$1'  | 
|  两个记录  |  '\$1"score":0.6\$1\$1n\$1"score":0.3\$1'  | 

------
#### [ Predicted label and probabilities ]

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


| 模型容器输入 | 模型容器输出 | 
| --- | --- | 
|  单个记录  |  '\$1"predicted\$1labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]\$1'  | 
|  两个记录  |  '\$1"predicted\$1labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]\$1\$1n\$1"predicted\$1labels":["cat","dog","fish"],"probabilities":[0.2,0.5,0.3]\$1'  | 

------
#### [ Predicted labels header and probabilities ]

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


| 模型容器输入 | 模型容器输出 | 
| --- | --- | 
|  单个记录  |  '\$1"predicted\$1labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]\$1'  | 
|  两个记录  |  '\$1"predicted\$1labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]\$1\$1n\$1"predicted\$1labels":["cat","dog","fish"],"probabilities":[0.2,0.5,0.3]\$1'  | 

------

## 模型容器验证
<a name="clarify-online-explainability-container-validation"></a>

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

以下命令显示如何使用 AWS CLI请求响应。已预先安装在 SageMaker Studio Classic 和 SageMaker 笔记本实例中。 AWS CLI 如果您需要安装，请按照本[安装指南](https://aws.amazon.com/cli/)进行操作。 AWS 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) 参数的格式。对于 AWS CLI v1，此参数应保留为空。对于 v2，此参数应设置为 `--cli-binary-format raw-in-base64-out`。

**注意**  
AWS CLI [v2 默认将二进制参数作为 base64 编码的字符串传递。](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html#cliv2-migration-binaryparam)

以下示例使用 AWS 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`

------

验证完成后，[删除](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints-delete-resources.html)测试端点。