使用Amazon SageMaker多模型端点托管多个TensorFlow计算机视觉模型

源节点: 1853804

亚马逊SageMaker 通过汇集一系列专为 ML 构建的功能,帮助数据科学家和开发人员快速准备、构建、训练和部署高质量的机器学习 (ML) 模型。 SageMaker 通过为 ML 开发的每个步骤(包括标记、数据准备、特征工程、统计偏差检测、AutoML、培训、调整、托管、可解释性、监控和工作流自动化)提供专用工具来加速您组织内的创新。

公司越来越多地根据个人用户数据训练 ML 模型。 例如,旨在支持在互联网上发现信息的图像共享服务根据每个用户上传的图像和浏览历史训练自定义模型,从而为该用户提供个性化推荐。 该公司还可以根据搜索主题训练自定义模型,以便为每个主题推荐图像。 为每个用例构建自定义 ML 模型会提高推理准确性,但会增加部署和管理模型的成本。 当并非所有模型都以相同的速率访问但仍需要始终可用时,这些挑战变得更加明显。

SageMaker 多模型端点 提供一种可扩展且经济高效的方式在云中部署大量 ML 模型。 SageMaker 多模型端点使您能够在单个端点后面部署多个 ML 模型,并使用单个服务容器为它们提供服务。 您的应用程序只需要包含对这个端点的目标模型的 API 调用,即可实现低延迟、高吞吐量的推理。 您可以以单个端点的价格托管多个模型,而不是为每个模型支付单独的端点。 有关 SageMaker 多模型终端节点的更多信息,请参阅 通过使用Amazon SageMaker多模型终端节点节省推理成本.

在这篇文章中,我们演示了如何使用 SageMaker 多模型端点来托管两个具有不同模型架构和数据集的计算机视觉模型以进行图像分类。 在实践中,您可以在多模型端点上部署数以万计的模型。

解决方案概述

SageMaker 多模型端点可与多个框架配合使用,例如 TensorFlow、PyTorch、MXNet 和 sklearn,您可以 使用多模型服务器构建您自己的容器。 以下流行的 SageMaker 内置算法也原生支持多模型端点: XGBoost, 线性学习器, 随机砍伐森林 (RCF),和 K最近邻居 (KNN)。 您可以在使用这些算法的同时直接使用 SageMaker 提供的容器,而无需构建您自己的自定义容器。

下图是您如何使用 SageMaker 多模型端点托管多个(对于本博文为六个)模型的简化说明。 在实践中,多模型端点可以在一个端点后面容纳数百到数万个 ML 模型。 在我们的架构中,如果我们使用存储在 亚马逊简单存储服务 (Amazon S3),多模型终端节点动态卸载一些最少使用的模型以适应较新的模型。

在这篇文章中,我们展示了如何在单个 SageMaker 多模型端点后面托管两个使用 TensorFlow 框架训练的计算机视觉模型。 我们使用 TensorFlow服务 容器为多模型端点启用以托管这些模型。 对于我们的第一个模型,我们训练了一个较小版本的 亚历克斯网 美国有线电视新闻网 对图像进行分类 CIFAR-10 数据集。 对于第二个模型,我们使用 VGG16 CNN模型预训练 影像网 数据集和微调 手语数字数据集 对手符号图像进行分类。 我们还提供功能齐全的 笔记本 演示所有步骤。

模型 1:CIFAR-10 图像分类

CIFAR-10 是计算机视觉和机器学习中图像分类的基准数据集。 CIFAR 图像是彩色的(三个通道),物体的外观变化很大。 它由 32 个类别的 32 × 10 彩色图像组成,每个类别有 6,000 个图像。 它包含 50,000 张训练图像和 10,000 张测试图像。 下图显示了按标签分组的图像示例。

为了构建图像分类器,我们使用了经典 AlexNet CNN 的简化版本。 该网络由五个卷积层和池化层以及三个全连接层组成。 我们的简化架构堆叠了三个卷积层和两个全连接(密集)层。

第一步是将数据集加载到训练和测试对象中。 TensorFlow 框架提供 CIFAR 数据集供我们使用 load_data() 方法加载。 接下来,我们通过将像素值除以 255 来重新缩放输入图像:[0,255] ⇒ [0,1]。 我们还需要使用 one-hot 编码。 一种热编码是将分类变量转换为数字形式的过程。 以下代码片段显示了这些步骤:

from tensorflow.keras.datasets import cifar10 # load dataset
(X_train, y_train), (X_test, y_test) = cifar10.load_data() # rescale input images
X_train = X_train.astype('float32')/255
X_test = X_test.astype('float32')/255 # one hot encode target labels
num_classes = len(np.unique(y_train))
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)

在数据集准备好并准备好进行训练后,它会保存到 Amazon S3 以供 SageMaker 使用。 将图像分类器的模型架构和训练代码组装成训练脚本(cifar_train.py)。 为了为训练过程生成成批的张量图像数据,我们使用 ImageDataGenerator。 这使我们能够将旋转、宽度和高度转换等数据增强转换应用于我们的训练数据。

在下一步中,我们使用训练脚本使用 SageMaker SDK 创建一个 TensorFlow 估计器(参见以下代码)。 我们使用估计器在 CIFAR-10 输入上拟合 CNN 模型。 训练完成后,模型将保存到 Amazon S3。

from sagemaker.tensorflow import TensorFlow model_name = 'cifar-10' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'cifar_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'model_dir': f'/opt/ml/model', 'role': role, 'hyperparameters': hyperparameters, 'output_path': f's3://{BUCKET}/{PREFIX}/cifar_10/out', 'base_job_name': f'mme-cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_1 = TensorFlow(**estimator_parameters) estimator_1.fit(inputs)

稍后,我们将演示如何使用 SageMaker 多模型端点以及我们的第二个模型(手语数字分类器)来托管此模型。

模型二:手语数字分类

对于我们的第二个模型,我们使用手语数字数据集。 该数据集将手语数字从 0 到 9 区分开来。 下图显示了数据集的示例。

该数据集包含 100 x 100 RGB 颜色的图像,有 10 个类别(数字 0-9)。 训练集包含 1,712 张图像,验证集 300 和测试集 50。

这个数据集非常小。 在这个小的数据集上从头开始训练网络并没有取得好的结果。 为了获得更高的精度,我们使用 转让 学习. 迁移学习通常是开始分类项目时的首选方法,尤其是当您没有太多训练数据时。 它将从源数据集学到的知识迁移到目标数据集,以节省训练时间和计算成本。

为了训练这个模型,我们使用在 ImageNet 数据集上训练的预训练 VGG16 CNN 模型,并对其进行微调以处理我们的手语数字数据集。 预训练模型是之前已经在大型数据集上训练过的网络,通常是在大规模图像分类任务上。 我们使用的 VGG16 模型架构总共有 13 个卷积层。 对于手语数据集,由于其域与 ImageNet 数据集的源域不同,我们只对最后几层进行微调。 这里的微调是指冻结一些用于特征提取的网络层,并联合训练预训练模型的非冻结层和新添加的分类器层。

训练脚本(符号_语言_train.py) 封装了手语数字分类器的模型架构和训练逻辑。 首先,我们从在 ImageNet 数据集上训练的 VGG16 网络加载预训练的权重。 接下来,我们冻结部分特征提取器部分,然后添加新的分类器层。 最后,我们编译网络并运行训练过程以优化较小数据集的模型。

接下来,我们使用此训练脚本使用 SageMaker SDK 创建一个 TensorFlow 估计器。 该估计器用于在提供的输入上拟合手语数字分类器。 训练完成后,模型将保存到 Amazon S3 以由 SageMaker 多模型终端节点托管。 请参阅以下代码:

model_name = 'sign-language' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'sign_language_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'hyperparameters': hyperparameters, 'model_dir': f'/opt/ml/model', 'role': role, 'output_path': f's3://{BUCKET}/{PREFIX}/sign_language/out', 'base_job_name': f'cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_2 = TensorFlow(**estimator_parameters) estimator_2.fit({'train': train_input, 'val': val_input})

部署多模型端点

SageMaker 多模型端点为部署大量模型提供了可扩展且经济高效的解决方案。 它使用可以托管多个模型的共享服务容器。 与使用单模型端点相比,这通过提高端点利用率来降低托管成本。 它还减少了部署开销,因为 SageMaker 管理在内存中加载模型并根据流量模式对其进行扩展。

要创建多模型端点,首先我们需要将各个估计器(1 和 2)的训练模型从它们保存的 S3 位置复制到多模型端点可以使用的通用 S3 前缀:

tf_model_1 = estimator_1.model_data
output_1 = f's3://{BUCKET}/{PREFIX}/mme/cifar.tar.gz' tf_model_2 = estimator_2.model_data
output_2 = f's3://{BUCKET}/{PREFIX}/mme/sign-language.tar.gz' !aws s3 cp {tf_model_1} {output_1}
!aws s3 cp {tf_model_2} {output_2}

将模型复制到 S3 前缀指定的公共位置后,我们使用 SageMaker SDK 中的 TensorFlowModel 类创建服务模型。 为要在多模型端点下托管的模型之一创建服务模型。 在这种情况下,我们使用第一个模型(CIFAR-10 图像分类器)。 接下来,我们使用 SageMaker SDK 中的 MultiDataModel 类,使用我们在上一步中创建的模型 1 的服务模型创建多模型数据模型:

from sagemaker.tensorflow.serving import TensorFlowModel
from sagemaker.multidatamodel import MultiDataModel model_1 = TensorFlowModel(model_data=output_1, role=role, image_uri=IMAGE_URI) mme = MultiDataModel(name=f'mme-tensorflow-{current_time}', model_data_prefix=model_data_prefix, model=model_1, sagemaker_session=sagemaker_session)

最后,我们通过调用 deploy() 方法部署 MultiDataModel,提供创建支持多模型端点所需的托管基础​​设施所需的属性:

predictor = mme.deploy(initial_instance_count=2, instance_type='ml.m5.2xlarge', endpoint_name=f'mme-tensorflow-{current_time}')

部署调用返回一个预测器实例,我们可以使用它来进行推理调用。 我们将在下一节中看到这一点。

测试多模型端点以进行实时推理

多模型端点支持跨模型共享内存资源。 如果要引用的模型已经缓存,多模型端点会立即运行推理。 另一方面,如果特定请求的模型未缓存,SageMaker 必须下载该模型,这会增加该初始请求的延迟。 但是,这只是启动全新基础架构(实例)以在 SageMaker 上单独托管模型所需时间的一小部分。 模型缓存到多模型端点后,会实时发起后续请求(除非模型被移除)。 因此,您可以从单个实例运行多个模型,从而有效地将我们的模型数量与我们的部署成本脱钩。 这使得大规模管理 ML 部署变得容易,并通过增加端点及其底层计算实例的使用来降低模型部署成本。 有关 90 个型号示例的更多信息和成本节省超过 1,000% 的演示,请参阅 使用 Amazon SageMaker 多模型终端节点节省推理成本.

当支持端点的实例达到内存容量并且需要将更多模型加载到其容器中时,多模型端点也会从容器中卸载未使用的模型。 当卷达到容量并且需要下载新模型时,SageMaker 会从实例存储卷中删除未使用的模型工件。 首次调用新添加的模型需要更长的时间,因为终端节点需要时间将模型从 Amazon S3 下载到支持多模型终端节点的实例的容器内存中。 卸载的模型保留在实例的存储卷上,稍后可以加载到容器的内存中,而无需从 S3 存储桶再次下载。

让我们看看如何从托管在多模型端点下的 CIFAR-10 图像分类器 (model-1) 进行推断。 首先,我们从其中一个类(飞机)加载样本图像,并准备使用我们在上一步中创建的预测器将其发送到多模型端点。

使用这个预测器,我们可以调用 predict() 方法以及 initial_args 参数,该参数指定要调用的目标模型的名称。 在这种情况下,目标模型是 cifar.tar.gz。 以下代码片段详细演示了此过程:

img = load_img('./data/cifar_10/raw_images/airplane.png', target_size=(32, 32))
data = img_to_array(img)
data = data.astype('float32')
data = data / 255.0
data = data.reshape(1, 32, 32, 3)
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'cifar.tar.gz'})
predicted_label = CIFAR10_LABELS[np.argmax(y_pred)]
print(f'Predicted Label: [{predicted_label}]')

运行前面的代码将预测输出作为标签飞机返回,我们的服务模型可以正确解释它:

Predicted Label: [airplane]

接下来,让我们看看如何通过调用以 sign-language.tar.gz 作为目标模型的端点,将手语数字分类器(model-2)动态加载到多模型端点中。

我们使用以下手势数字 0 的示例图像。

以下片段显示了如何使用示例图像调用多模型端点以获取正确的响应:

test_path = './data/sign_language/test'
img = mpimg.imread(f'{test_path}/0/IMG_4159.JPG') def path_to_tensor(img_path): # loads RGB image as PIL.Image.Image type img = image.load_img(img_path, target_size=(224, 224)) # convert PIL.Image.Image type to 3D tensor with shape (224, 224, 3) x = image.img_to_array(img) # convert 3D tensor to 4D tensor with shape (1, 224, 224, 3) and return 4D tensor return np.expand_dims(x, axis=0) data = path_to_tensor(f'{test_path}/0/IMG_4159.JPG')
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'sign-language.tar.gz'})predicted_label = np.argmax(y_pred)
print(f'Predicted Label: [{predicted_label}]')

以下代码是我们的响应,标签为 0:

Predicted Label: [0]

结论

在这篇文章中,我们演示了 SageMaker 功能 多模型端点 优化推理成本。 当您处理数百到数万个模型并且您不需要将每个模型部署为单独的端点时,多模型端点非常有用。 根据使用情况和端点上可用的内存量动态加载和卸载模型。

这篇文章讨论了如何在一个 SageMaker 多模型端点下托管使用 TensorFlow 框架训练的多个计算机视觉模型。 图像分类模型具有不同的模型架构,并在不同的数据集上进行训练。 这 笔记本 帖子中包含有关训练和托管模型的详细说明。

为您的用例尝试 SageMaker 多模型端点,并在评论中留下您的反馈。


作者简介

阿伦普拉萨特·香卡(Arunprasath Shankar) 是 AWS 的人工智能和机器学习 (AI/ML) 专家解决方案架构师,帮助全球客户在云中有效和高效地扩展他们的 AI 解决方案。 在业余时间,阿伦喜欢看科幻电影和听古典音乐。

马克·罗伊 是 AWS 的首席机器学习架构师,帮助 AWS 客户设计和构建 AI/ML 解决方案。 Mark 的工作涵盖了广泛的 ML 用例,主要兴趣是计算机视觉、深度学习和在整个企业中扩展 ML。 他帮助过许多行业的公司,包括保险、金融服务、媒体和娱乐、医疗保健、公用事业和制造业。 Mark 拥有六项 AWS 认证,包括 ML 专业认证。 在加入 AWS 之前,Mark 曾担任架构师、开发人员和技术领导者 25 年以上,其中包括 19 年的金融服务经验。

来源:https://aws.amazon.com/blogs/machine-learning/host-multiple-tensorflow-computer-vision-models-using-amazon-sagemaker-multi-model-endpoints/

时间戳记:

更多来自 AWS机器学习博客