使用无服务器模板部署 AutoGluon 模型¶
学习了如何使用 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]
将仅部署所有表格模型,而不包含text
和vision
模块及其额外依赖项。此指令可以进一步细化为以下选项的组合:lightgbm
、catboost
、xgboost
、fastai
和skex
。
以下 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 模型部署为无服务器应用程序。要了解更多信息,请参阅以下文档: