使用无服务器模板部署AutoGluon模型

Open In Colab Open In SageMaker Studio Lab

在学习了如何使用AWS SageMaker Cloud Training with Amazon SageMaker 训练/部署模型之后,在本节中我们将学习如何使用AWS Lambda部署训练好的模型。

减少模型大小以最小化AWS Lambda启动时间

当Lambda服务通过Lambda API接收到运行函数的请求时,服务首先准备一个执行环境。在此步骤中,服务下载存储在Amazon Elastic Container Registry中的函数代码。然后,它创建一个具有指定内存、运行时和配置的环境。完成后,Lambda在最终运行处理程序代码之前运行事件处理程序之外的任何初始化代码。设置环境和代码的步骤通常被称为“冷启动”。

执行完成后,执行环境会被冻结。为了提高资源管理和性能,Lambda服务会保留执行环境一段不确定的时间。在这段时间内,如果另一个请求到达相同的函数,服务可能会重用该环境。第二个请求通常会更快完成,因为执行环境已经存在,不需要下载代码并运行初始化代码。这被称为“热启动”。

由于AutoGluon容器比典型的Lambda容器大,执行“冷启动”所需的步骤可能需要一些时间(60秒以上)。
当与对延迟敏感的应用程序一起使用时,这可能是一个限制因素。为了减少AWS Lambda的启动时间,重要的是将模型大小减少到最小。 这可以通过应用部署优化的预设来实现,如预测表中的列 - 深入中的“更快的预设或超参数”部分所述:

presets = ['good_quality_faster_inference_only_refit', 'optimize_for_deployment']

如果无法忍受冷启动延迟,建议按照本文所述预留并发容量: Managing Lambda reserved concurrency

有关lambda性能优化的更多详细信息可以在以下文章中找到: Operating Lambda: Performance optimization

创建一个基础项目

要启动项目,请按照教程的设置步骤操作: 使用无服务器模板部署机器学习模型

要部署AutoGluon,需要进行以下调整:

  • 训练好的模型预计会在 ag_models 目录中。

  • Dockerfile 用于打包 AutoGluon 运行时和模型文件

  • 修改服务 app/app.py 脚本以使用 AutoGluon

在构建Docker容器时,可以使用以下优化来减小其大小:

  • 使用CPU版本的pytorch;如果要部署的模型不使用pytorch,则不要安装它。

  • 仅安装推理所需的AutoGluon子模块 - 具体来说,autogluon.tabular[all] 将仅部署所有表格模型,而不包括 textvision 模块及其额外的依赖项。此指令可以进一步细化为以下选项的组合:lightgbmcatboostxgboostfastaiskex

以下 Dockerfile 可以作为起点:

FROM public.ecr.aws/lambda/python:3.8

RUN yum install libgomp git -y \
 && yum clean all -y && rm -rf /var/cache/yum

ARG TORCH_VER=1.9.1+cpu
ARG TORCH_VISION_VER=0.10.1+cpu
ARG NUMPY_VER=1.19.5
RUN python3.8 -m pip --no-cache-dir install --upgrade --trusted-host pypi.org --trusted-host files.pythonhosted.org pip \
 && python3.8 -m pip --no-cache-dir install --upgrade wheel setuptools \
 && python3.8 -m pip uninstall -y dataclasses \
 && python3.8 -m pip --no-cache-dir install --upgrade torch=="${TORCH_VER}" torchvision=="${TORCH_VISION_VER}" -f https://download.pytorch.org/whl/torch_stable.html \
 && python3.8 -m pip --no-cache-dir install --upgrade numpy==${NUMPY_VER} \
 && python3.8 -m pip --no-cache-dir install --upgrade autogluon.tabular[all]"

COPY app.py ./
COPY ag_models /opt/ml/model/

CMD ["app.lambda_handler"]

Lambda 服务脚本 (app/app.py):

import pandas as pd
from autogluon.tabular import TabularPredictor

model = TabularPredictor.load('/opt/ml/model')
model.persist(models='all')


# Lambda handler code
def lambda_handler(event, context):
    df = pd.read_json(event['body'])
    pred_probs = model.predict_proba(df)
    return {
        'statusCode': 200,
        'body': pred_probs.to_json()
    }

一旦对项目进行了必要的修改,请继续按照教程中“将应用程序部署到Lambda”部分描述的步骤进行操作。

Conclusion

在本教程中,我们探讨了如何将AutoGluon模型部署为无服务器应用程序。要了解更多信息,请参考以下文档: