亚马逊AWS官方博客
使用 ezsmdeploy Python 程序包和几行代码将机器学习模型部署到 Amazon SageMaker
AWS 上的客户使用 Amazon SageMaker 和其他服务(例如 AWS Lambda、AWS Fargate、AWS Elastic Beanstalk 和 Amazon Elastic Compute Cloud (Amazon EC2))在生产中部署经过训练的机器学习 (ML) 和深度学习 (DL) 模型。Amazon SageMaker 提供开发工具包和仅控制台的工作流来部署经过训练的模型,并包括用于创建或更新终端节点、自动扩展、模型标记、模型监控以及用于创建生产变体和多模型终端节点的功能。
一旦拥有模型,将其部署到终端节点就很简单,只需在控制台上单击创建终端节点,或者使用具有相应输入参数的适用于 Python 的 AWS 开发工具包 (Boto3)。
但是,只有将此开发工具包用于特定框架、第一方容器(如下面的 DeepAR 容器)时,或者如果您已准备好将预构建的容器映像与模型构件一起部署到终端节点,这一说法才正确;此外,该过程中的一个必要步骤是提供包含模型文件的已压缩 tar.gz 文件的路径。
如果您在本地拥有一个或多个模型文件(例如序列化的 scikit-learn pickle 文件、PyTorch .pth 文件等),并且希望以最小的工作量来部署模型,该怎么办? 在本博文中,我们介绍了称为 ezsmdeploy 的基于 Python 的开发工具包,它可让用户通过传入一个或多个用于部署的模型文件、推理脚本以及推理脚本使用的任何其他其他要求来部署模型。
ezsmdeploy 开发工具包简介
Ezsmdeploy Python 开发工具包可帮助您轻松部署机器学习模型,并且提供了丰富的功能集,例如能够传递一个或多个模型文件(是的,通过多模型部署),根据模型大小或预算自动选择实例以及使用直观的 API 来加载-测试终端节点。Ezsmdeploy 使用 Amazon SageMaker Python 开发工具包,它是一个开源库,用于在 Amazon SageMaker 上训练和部署机器学习模型。但是,此开发工具包致力于简化现有模型的部署。因此,此开发工具包适用于以下情况:
- 您拥有序列化的模型(pickle、joblib、JSON、TensorFlow SavedModel、PyTorch .pth 等)文件,并且希望将模型作为 API 终端节点进行部署和测试。
- 您拥有一个或多个模型,其在本地文件夹中存储为本地文件,或者在 Amazon Simple Storage Service (Amazon S3) 中存储为 tar 文件 (model.tar.gz)。
- 您不想创建用于部署的自定义 Docker 容器和/或不想处理 Docker。
- 您想要利用高级功能,例如 AWS Auto Scaling、Amazon Elastic Inference、多模型终端节点、模型推理数据捕获以及基于 locust.io 的负载测试,而无需进行繁重的工作。
- 您仍然希望通过传入 Python 脚本来控制如何执行推理。
请注意,对于某些 SageMaker 估算器而言,从预训练的模型进行部署很容易,例如,考虑 TensorFlow SavedModel 格式。您可以轻松保存 save_model.pb
和变量文件并使用 sagemaker.tensorflow.serving.Model
来注册和部署模型。但是,如果将您的 TensorFlow 模型另存为检查点、HDF5 文件或 TensorFlow Lite 文件,或者如果您需要跨多种类型的序列化模型文件进行部署,则这可能有助于标准化部署管道,并且无需为每个模型构建新容器。
安装 ezsmdeploy
要安装 ezsmdeploy:
pip install ezsmdeploy
要在虚拟环境中安装:
python -m venv env
source env/bin/activate
pip install ezsmdeploy[locust]
ezsmdeploy 的重要功能
首先,让我们看一下最低部署的参数数量。ezsmdeploy 至少需要:
- 一个或多个模型文件。
- 包含两个函数的 Python 脚本:
load_model(modelpath)
:从模型路径加载模型并返回模型对象,然后predict(model,input)
:根据模型对象和输入数据执行推理。
- 要求列表或
requirements.txt
文件。
例如,您可以执行以下操作:
ezonsm = ezsmdeploy.Deploy(model = 'model.pth',
script = 'modelscript_pytorch.py',
requirements = ['numpy','torch','joblib'])
这将创建一个具有 numpy
、torch
和 joblib
附加依赖项的容器,使用您的模型脚本('modelscript_pytorch.py'
)和序列化的 PyTorch 模型('model.pth'
),并将模型部署到终端节点。在这种情况下,由于未指定实例类型,因此 ezsmdeploy 会衡量模型的大小,并按照最佳实践至少运行四个具有此模型大小的工作线程来选择实例。
为了完整起见,这里还提到了一些其他可能有用的功能,并在 ezsmdeploy 的 PyPi 网站上进行了维护。
- 通过传入模型列表来加载多个模型 — 例如,
model = ['model1.pth','model2.pth']
。 - 如果需要为终端节点开启自动扩展,请将
自动扩展
设置为True
。 - 传入附加程序包依赖项的列表或指向
requirements.txt
文件,以自动分析运行模型脚本所需的内容。 - 如果您未传入
instance_type
,则 ezsmdeploy 将根据模型(或传入的多个模型)的总大小选择一个实例,考虑每个终端节点的多个工作线程,并考虑将根据每小时可接受的最大成本选择instance_type
的预算
。您也可以选择实例。 - 传入 ei 或 Elastic Inference(例如,
ml.eia2.medium
)的值,以将加速器添加到部署的实例。有关更多信息,请参阅 Elastic Inference 文档。 - 如果您希望为此终端节点启用数据捕获,请将
监控器
设置为True
。目前,使用的sampling_percentage
为 100。有关更多信息,请参阅 Amazon SageMaker 模型监控器文档。 - 部署模型后,即可使用 locust.io(一种易于使用的分布式用户负载测试工具)对终端节点进行负载测试。要使用 Locust,您可以更改安装步骤,以包含可选
locust
依赖项,如下所示:pip install ezsmdeploy[locust]
如何写入 model_script.py
确保模型脚本具有 load_model()
和 predict()
函数。尽管您仍然可以使用 SageMaker 的序列化器和反序列化器,但假设您将获得负载(以字节为单位),并且必须返回预测值(以字节为单位)。两者之间的操作完全由您决定。例如,您的模型脚本可能类似于:
def load_model(modelpath):
clf = load(os.path.join(modelpath,'model.joblib'))
return clf
def predict(model, payload):
try:
# in remote / container based deployment, payload comes in as a stream of bytes
out = [str(model.predict(np.frombuffer(payload[0]['body']).reshape((1,64))))]
except Exception as e:
out = [type(payload),str(e)] #useful for debugging!
return out
如何手动调整在后台发生的事件
Ezsmdeploy 将为所有部署生成源文件夹 src。您可以编辑该源文件夹,并将其与 ezsmdeploy 或 SageMaker 开发工具包一起使用以部署模型。此外,该开发工具包是开源工具,并且欢迎提出拉取请求。
端到端示例
您可以在 GitHub 存储库中找到 TensorFlow、PyTorch、MXNet 和 scikit-learn 的端到端示例。
结论
在这篇博文中,我们介绍了 ezsmdeploy,它是一种程序包,可通过单个 API 调用来帮助部署自定义机器学习和深度学习模型,并且提供了自动扩展、多模型终端节点、基于 locust 的负载测试、Elastic Inference 和模型监控等功能。请参阅 SageMaker 文档,以了解终端节点托管的工作方式和部署模型的最佳实践。
图片精选自 Pixabay。