使用 SageMaker 开发工具包部署已编译的模型 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

使用 SageMaker 开发工具包部署已编译的模型

如果模型是使用 、 或 控制台编译的适用于 Python (Boto3) 的 AWS 软件开发工具包,则必须满足AWS CLI先决条件Amazon SageMaker部分。按照以下使用案例之一,根据您编译模型的方式部署使用 SageMaker Neo 编译的模型。

如果您使用SageMaker开发工具包编译了模型

已编译模型的 sagemaker.Model 对象句柄提供了 deploy() 函数,使您能够创建终端节点来处理推理请求。使用该函数,您可以设置用于终端节点的实例的数量和类型。您必须选择已经为其编译了模型的实例。例如,在 Compile a Model ( Amazon SageMaker SDK) 部分编译的作业中,这是 ml_c5

predictor = compiled_model.deploy(initial_instance_count = 1, instance_type = 'ml.c5.4xlarge') # Print the name of newly created endpoint print(predictor.endpoint_name)

如果您使用 MXNet 或 PyTorch 编译了模型

在框架特定的SageMaker模型 API 下,使用 deploy() APIs 创建模型并进行部署。对于 MXNet它为 MXNetModel对于 PyTorch它为 PyTorchModel。在创建和部署 SageMaker 模型时,您必须将MMS_DEFAULT_RESPONSE_TIMEOUT环境变量设置为 500 ,并将 entry_point 参数指定为推理脚本 (inference.py),并将 source_dir 参数指定为推理脚本的目录位置 (code)。要准备推理脚本 (inference.py),请按照先决条件步骤操作。

以下示例演示如何使用这些函数来通过 部署已编译的模型SageMakerSDK for Python:

MXNet
from sagemaker.mxnet import MXNetModel # Create SageMaker model and deploy an endpoint sm_mxnet_compiled_model = MXNetModel( model_data='insert S3 path of compiled MXNet model archive', role='AmazonSageMaker-ExecutionRole', entry_point='inference.py', source_dir='code', framework_version='1.7.0', py_version='py3', image_uri='insert appropriate ECR Image URI for MXNet', env={'MMS_DEFAULT_RESPONSE_TIMEOUT': '500'}, ) # Replace the example instance_type below to your preferred instance_type predictor = sm_mxnet_compiled_model.deploy(initial_instance_count = 1, instance_type = 'ml.p3.2xlarge') # Print the name of newly created endpoint print(predictor.endpoint_name)
PyTorch 1.4 and Older
from sagemaker.pytorch import PyTorchModel # Create SageMaker model and deploy an endpoint sm_pytorch_compiled_model = PyTorchModel( model_data='insert S3 path of compiled PyTorch model archive', role='AmazonSageMaker-ExecutionRole', entry_point='inference.py', source_dir='code', framework_version='1.4.0', py_version='py3', image_uri='insert appropriate ECR Image URI for PyTorch', env={'MMS_DEFAULT_RESPONSE_TIMEOUT': '500'}, ) # Replace the example instance_type below to your preferred instance_type predictor = sm_pytorch_compiled_model.deploy(initial_instance_count = 1, instance_type = 'ml.p3.2xlarge') # Print the name of newly created endpoint print(predictor.endpoint_name)
PyTorch 1.5 and Newer
from sagemaker.pytorch import PyTorchModel # Create SageMaker model and deploy an endpoint sm_pytorch_compiled_model = PyTorchModel( model_data='insert S3 path of compiled PyTorch model archive', role='AmazonSageMaker-ExecutionRole', entry_point='inference.py', source_dir='code', framework_version='1.5', py_version='py3', image_uri='insert appropriate ECR Image URI for PyTorch', ) # Replace the example instance_type below to your preferred instance_type predictor = sm_pytorch_compiled_model.deploy(initial_instance_count = 1, instance_type = 'ml.p3.2xlarge') # Print the name of newly created endpoint print(predictor.endpoint_name)
注意

AmazonSageMakerFullAccessAmazonS3ReadOnlyAccess 策略必须附加到 AmazonSageMaker-ExecutionRole IAM 角色。

如果您使用 Boto3、SageMaker控制台或适用于 TensorFlow 的 CLI 编译了模型

构建 TensorFlowModel 对象,然后调用 deploy:

role='AmazonSageMaker-ExecutionRole' model_path='S3 path for model file' framework_image='inference container arn' tf_model = TensorFlowModel(model_data=model_path, framework_version='1.15.3', role=role, image_uri=framework_image) instance_type='ml.c5.xlarge' predictor = tf_model.deploy(instance_type=instance_type, initial_instance_count=1)

有关更多信息,请参阅直接从模型构件https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/deploying_tensorflow_serving.html#deploying-directly-from-model-artifacts部署。

您可以从Amazon ECR此列表中选择满足需求的 Docker 映像 URI。

有关如何构造 TensorFlowModel 对象的更多信息,请参阅 SageMaker 开发工具包

注意

如果您在 GPU 上部署模型,则第一个推理请求可能会具有高延迟。这是因为优化的计算内核是根据第一个推理请求发出的。我们建议您在将推理请求的预热文件与模型文件一起存储该文件,然后将其发送到 TFX。这称为“预热”模型。

以下代码段演示了如何为先决条件部分中的图像分类示例生成预热文件:

import tensorflow as tf from tensorflow_serving.apis import classification_pb2 from tensorflow_serving.apis import inference_pb2 from tensorflow_serving.apis import model_pb2 from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_log_pb2 from tensorflow_serving.apis import regression_pb2 import numpy as np with tf.python_io.TFRecordWriter("tf_serving_warmup_requests") as writer: img = np.random.uniform(0, 1, size=[224, 224, 3]).astype(np.float32) img = np.expand_dims(img, axis=0) test_data = np.repeat(img, 1, axis=0) request = predict_pb2.PredictRequest() request.model_spec.name = 'compiled_models' request.model_spec.signature_name = 'serving_default' request.inputs['Placeholder:0'].CopyFrom(tf.compat.v1.make_tensor_proto(test_data, shape=test_data.shape, dtype=tf.float32)) log = prediction_log_pb2.PredictionLog( predict_log=prediction_log_pb2.PredictLog(request=request)) writer.write(log.SerializeToString())

有关如何“预热”模型的更多信息,请参阅 TensorFlow TFX 页面