具有不受支持的内置算法的 Sagemaker 多模型端点
Sagemaker multi-model endpoints with unsupported built-in algorithms
我知道 Sagemaker does not support multi-model endpoints for their built-in image classification algorithm。但是,在文档中,他们暗示构建自定义容器以使用具有多模型端点功能的“任何其他框架或算法”:
To use any other framework or algorithm, use the SageMaker inference toolkit to build a container that supports multi-model endpoints. For information, see Build Your Own Container with Multi Model Server.
理想情况下,我想将我已经训练过的许多(20 多个)图像分类模型部署到单个端点以节省成本。但是,在阅读“构建您自己的容器”指南后,我仍然不太清楚如何为非自定义算法生成的模型构建自定义推理容器。大多数教程和示例笔记本都提到使用 Pytorch 或 Sklearn。我不清楚我是否可以在我使用内置图像分类算法创建的模型上使用这些库进行推断。
是否可以创建一个容器来支持不受支持的内置 Sagemaker 算法的多模型端点?如果是这样,有人可以暗示如何做到这一点吗?
是的,可以将内置图像分类模型部署为 SageMaker 多模型端点。关键是图片分类用的是Apache MXNet。您可以提取模型工件(SageMaker 将它们存储在 S3 中名为 model.tar.gz 的 zip 文件中),然后将它们加载到 MXNet。 SageMaker MXNet 容器支持多模型端点,因此您可以使用它来部署模型。
如果您从该算法中解压 model.tar.gz,您会发现三个文件:
图像分类-****.params
图像分类-symbol.json
型号-shapes.json
MxNet 容器希望将这些文件命名为 image-classification-0000.params、model-symbol.json 和 model-shapes.json .所以我解压缩了 zip 文件,重命名文件并重新压缩它们。有关 MXNet 容器的更多信息,请查看 GitHub repository.
之后,您可以使用带有以下代码的 SageMaker SDK 将模型部署为单个 MXNet 端点:
from sagemaker import get_execution_role
from sagemaker.mxnet.model import MXNetModel
role = get_execution_role()
mxnet_model = MXNetModel(model_data=s3_model, role=role,
entry_point='built_in_image_classifier.py',
framework_version='1.4.1',
py_version='py3')
predictor = mxnet_model.deploy(instance_type='ml.c4.xlarge', initial_instance_count=1)
入口点 Python 脚本现在可以是一个空的 Python 文件。我们将使用 MXNet 容器提供的默认推理处理。
默认的 MXNet 容器只接受 JSON、CSV 和 Numpy 数组作为有效输入。因此,您必须将输入格式设置为这三种格式之一。下面的代码演示了我是如何使用 Numpy 数组的:
import cv2
import io
np_array = cv2.imread(filename=img_filename)
np_array = np_array.transpose((2,0,1))
np_array = np.expand_dims(np_array, axis=0)
buffer = io.BytesIO()
np.save(buffer, np_array)
response = sm.invoke_endpoint(EndpointName='Your_Endpoint_name', Body=buffer.getvalue(), ContentType='application/x-npy')
一旦您有一个使用 MXNet 容器的端点,您应该能够使用 SageMaker MultiDataModel constructor.
在多模型端点中获得它 运行
如果您想使用不同的输入数据类型,这样您就不必在应用程序代码中进行预处理,您可以通过在 entry_point脚本。 See here 获取更多信息。如果这样做,您可以将图像字节直接传递给 SageMaker,而无需格式化 numpy 数组。
我知道 Sagemaker does not support multi-model endpoints for their built-in image classification algorithm。但是,在文档中,他们暗示构建自定义容器以使用具有多模型端点功能的“任何其他框架或算法”:
To use any other framework or algorithm, use the SageMaker inference toolkit to build a container that supports multi-model endpoints. For information, see Build Your Own Container with Multi Model Server.
理想情况下,我想将我已经训练过的许多(20 多个)图像分类模型部署到单个端点以节省成本。但是,在阅读“构建您自己的容器”指南后,我仍然不太清楚如何为非自定义算法生成的模型构建自定义推理容器。大多数教程和示例笔记本都提到使用 Pytorch 或 Sklearn。我不清楚我是否可以在我使用内置图像分类算法创建的模型上使用这些库进行推断。
是否可以创建一个容器来支持不受支持的内置 Sagemaker 算法的多模型端点?如果是这样,有人可以暗示如何做到这一点吗?
是的,可以将内置图像分类模型部署为 SageMaker 多模型端点。关键是图片分类用的是Apache MXNet。您可以提取模型工件(SageMaker 将它们存储在 S3 中名为 model.tar.gz 的 zip 文件中),然后将它们加载到 MXNet。 SageMaker MXNet 容器支持多模型端点,因此您可以使用它来部署模型。
如果您从该算法中解压 model.tar.gz,您会发现三个文件:
图像分类-****.params
图像分类-symbol.json
型号-shapes.json
MxNet 容器希望将这些文件命名为 image-classification-0000.params、model-symbol.json 和 model-shapes.json .所以我解压缩了 zip 文件,重命名文件并重新压缩它们。有关 MXNet 容器的更多信息,请查看 GitHub repository.
之后,您可以使用带有以下代码的 SageMaker SDK 将模型部署为单个 MXNet 端点:
from sagemaker import get_execution_role
from sagemaker.mxnet.model import MXNetModel
role = get_execution_role()
mxnet_model = MXNetModel(model_data=s3_model, role=role,
entry_point='built_in_image_classifier.py',
framework_version='1.4.1',
py_version='py3')
predictor = mxnet_model.deploy(instance_type='ml.c4.xlarge', initial_instance_count=1)
入口点 Python 脚本现在可以是一个空的 Python 文件。我们将使用 MXNet 容器提供的默认推理处理。
默认的 MXNet 容器只接受 JSON、CSV 和 Numpy 数组作为有效输入。因此,您必须将输入格式设置为这三种格式之一。下面的代码演示了我是如何使用 Numpy 数组的:
import cv2
import io
np_array = cv2.imread(filename=img_filename)
np_array = np_array.transpose((2,0,1))
np_array = np.expand_dims(np_array, axis=0)
buffer = io.BytesIO()
np.save(buffer, np_array)
response = sm.invoke_endpoint(EndpointName='Your_Endpoint_name', Body=buffer.getvalue(), ContentType='application/x-npy')
一旦您有一个使用 MXNet 容器的端点,您应该能够使用 SageMaker MultiDataModel constructor.
在多模型端点中获得它 运行如果您想使用不同的输入数据类型,这样您就不必在应用程序代码中进行预处理,您可以通过在 entry_point脚本。 See here 获取更多信息。如果这样做,您可以将图像字节直接传递给 SageMaker,而无需格式化 numpy 数组。