

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

# 使用推理管道运行实时预测
<a name="inference-pipeline-real-time"></a>

您可以在推理管道中使用经训练的模型直接进行实时预测，无需执行外部预处理。配置管道时，您可以选择使用 Amazon A SageMaker I 中已有的内置功能转换器。或者，您可以使用几行 scikit-learn 或 Spark 代码来实施自己的转换逻辑。

[MLeap](https://combust.github.io/mleap-docs/)，一种用于机器学习管道的序列化格式和执行引擎，支持 Spark、scikit-learn 以及训练管道并将其导出到名 TensorFlow 为 Bundle 的序列化管道。 MLeap 您可以将捆绑包反序列化回 Spark 以进行批处理模式评分，也可以反序列化到 MLeap 运行时以支持实时 API 服务。

管道中的容器侦听由 `SAGEMAKER_BIND_TO_PORT` 环境变量指定的端口（而不是 8080）。在推理管道中运行时， SageMaker AI 会自动向容器提供此环境变量。如果此环境变量不存在，则容器应默认为使用端口 8080。要指示您的容器使用此要求进行编译，请使用以下命令将标签添加到您的 Dockerfile：

```
LABEL com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true
```

如果您的容器需要侦听第二个端口，请在 `SAGEMAKER_SAFE_PORT_RANGE` 环境变量指定的范围中选择端口。将该值指定为包含范围**"XXXX-YYYY"**，格式为，其中`XXXX`和`YYYY`为多位数整数。 SageMaker 当您在多容器管道中运行容器时，AI 会自动提供此值。

**注意**  
要在包含 [SageMaker AI 内置算法](https://docs.amazonaws.cn/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html)的管道中使用自定义 Docker 镜像，您需要[亚马逊弹性容器注册表 (Amazon ECR) Container Reg](https://docs.amazonaws.cn/AmazonECR/latest/userguide/what-is-ecr.html) istry 政策。您的 Amazon ECR 存储库必须向 SageMaker AI 授予提取映像的权限。有关更多信息，请参阅 [推理管道的 Amazon ECR 权限故障排除](inference-pipeline-troubleshoot.md#inference-pipeline-troubleshoot-permissions)。

## 创建和部署推理管道端点
<a name="inference-pipeline-real-time-sdk"></a>

以下代码使用 SparkML 创建和部署实时推理管道模型，并使用 AI SDK 按系列创建和部署 XGBoost 模型。 SageMaker 

```
from sagemaker.model import Model
from sagemaker.pipeline_model import PipelineModel
from sagemaker.sparkml.model import SparkMLModel

sparkml_data = 's3://{}/{}/{}'.format(s3_model_bucket, s3_model_key_prefix, 'model.tar.gz')
sparkml_model = SparkMLModel(model_data=sparkml_data)
xgb_model = Model(model_data=xgb_model.model_data, image=training_image)

model_name = 'serial-inference-' + timestamp_prefix
endpoint_name = 'serial-inference-ep-' + timestamp_prefix
sm_model = PipelineModel(name=model_name, role=role, models=[sparkml_model, xgb_model])
sm_model.deploy(initial_instance_count=1, instance_type='ml.c4.xlarge', endpoint_name=endpoint_name)
```

## 请求从推理管道端点进行实时推理
<a name="inference-pipeline-endpoint-request"></a>

以下示例演示如何通过调用推理端点进行实时预测，并传递 JSON 格式的请求负载：

```
import sagemaker
from sagemaker.predictor import json_serializer, json_deserializer, Predictor

payload = {
        "input": [
            {
                "name": "Pclass",
                "type": "float",
                "val": "1.0"
            },
            {
                "name": "Embarked",
                "type": "string",
                "val": "Q"
            },
            {
                "name": "Age",
                "type": "double",
                "val": "48.0"
            },
            {
                "name": "Fare",
                "type": "double",
                "val": "100.67"
            },
            {
                "name": "SibSp",
                "type": "double",
                "val": "1.0"
            },
            {
                "name": "Sex",
                "type": "string",
                "val": "male"
            }
        ],
        "output": {
            "name": "features",
            "type": "double",
            "struct": "vector"
        }
    }

predictor = Predictor(endpoint=endpoint_name, sagemaker_session=sagemaker.Session(), serializer=json_serializer,
                                content_type='text/csv', accept='application/json')

print(predictor.predict(payload))
```

您从 `predictor.predict(payload)` 中得到的响应是模型的推理结果。

## 实时推理管道示例
<a name="inference-pipeline-example"></a>

您可以使用显示如何部署端点、运行推理请求然后反序列化响应的[ SKLearn 预测变量来运行此示例 noteboo](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/sagemaker-python-sdk/scikit_learn_randomforest/Sklearn_on_SageMaker_end2end.ipynb) k。在 [Amazon 示例 GitHub 存储库中查找此笔记本和更多 SageMaker 示例](https://github.com/awslabs/amazon-sagemaker-examples)。