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

Open In Colab Open In SageMaker Studio Lab

学习了如何使用 AWS SageMaker 进行模型训练和部署后 (使用 Amazon SageMaker 进行云端训练和部署),本节我们将学习如何使用 AWS Lambda 部署训练好的模型。

减小模型大小以最大限度地缩短 AWS Lambda 启动时间

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

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

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

presets = ['good_quality_faster_inference_only_refit', 'optimize_for_deployment']

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

有关 Lambda 性能优化的更多详细信息,请参阅以下文章:操作 Lambda:性能优化

创建基础项目

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

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

  • 训练好的模型应放在 ag_models 目录中。

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

  • 修改服务脚本 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”部分所述的步骤进行。

结论

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