You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI迁移AWS Lambda:如何部署超400MB深度学习模型?

解决方案

1. 利用Lambda层分离依赖 + S3模型缓存至/tmp目录

Lambda层可将依赖代码与主业务代码拆分,主代码包仅保留核心逻辑,依赖放在层中(单层层解压后最大支持250MB,可拆分多个层)。模型权重存放在S3,在Lambda初始化阶段(handler函数外)下载到/tmp目录,借助Lambda容器复用特性避免重复下载:

  • 步骤1:制作依赖层
    将项目依赖安装到指定目录后打包成层:

    mkdir -p python/lib/python3.11/site-packages
    pip install -r requirements.txt -t python/lib/python3.11/site-packages/
    zip -r dependencies-layer.zip python/
    

    把该zip包上传到Lambda层并关联到你的函数。

  • 步骤2:模型下载逻辑(仅冷启动执行)
    在Lambda handler外编写模型下载代码,仅第一次冷启动时执行,后续容器复用直接读取/tmp中的模型:

    import boto3
    import os
    from fastapi import FastAPI
    from mangum import Mangum
    
    # 初始化S3客户端
    s3 = boto3.client('s3')
    MODEL_PATH = "/tmp/model_weights.pth"
    BUCKET_NAME = "your-model-bucket"
    MODEL_KEY = "model_weights.pth"
    
    # 检查模型是否已存在,不存在则从S3下载
    if not os.path.exists(MODEL_PATH):
        s3.download_file(BUCKET_NAME, MODEL_KEY, MODEL_PATH)
    
    # 加载模型(初始化阶段执行)
    import torch
    model = torch.load(MODEL_PATH)
    
    app = FastAPI()
    
    @app.get("/predict")
    def predict():
        # 推理逻辑
        return {"status": "success"}
    
    handler = Mangum(app)
    

    注:Lambda的/tmp目录当前最大支持10GB空间,完全满足400MB模型的存储需求。

2. 优化Lambda容器镜像(Docker)构建逻辑

你之前遇到的每次调用重装依赖、重下模型的问题,是因为Dockerfile逻辑错误——应把依赖安装、模型下载放在镜像构建阶段,而非运行时。Lambda容器镜像最大支持10GB,完全容纳你的700MB内容:

  • 示例Dockerfile

    # 使用Lambda官方Python镜像
    FROM public.ecr.aws/lambda/python:3.11
    
    # 安装依赖(构建阶段执行)
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    
    # 下载模型到镜像(构建阶段执行,也可本地COPY模型文件)
    RUN aws s3 cp s3://your-model-bucket/model_weights.pth .
    
    # 复制业务代码
    COPY app.py main.py ./
    
    # 设置Lambda handler
    CMD ["main.handler"]
    
  • 主代码(main.py)
    模型加载逻辑放在初始化阶段,容器启动时完成加载:

    from fastapi import FastAPI
    from mangum import Mangum
    import torch
    
    # 加载模型(容器启动时执行)
    model = torch.load("model_weights.pth")
    
    app = FastAPI()
    
    @app.get("/predict")
    def predict():
        # 推理逻辑
        return {"result": "prediction_done"}
    
    handler = Mangum(app)
    

    构建镜像后上传到ECR,再创建Lambda函数即可。容器启动后会复用,后续调用无需重复加载模型。

3. 配置Lambda预置并发(Provisioned Concurrency)

如果业务有稳定流量,可配置预置并发:AWS会提前启动指定数量的Lambda容器,完成模型加载和初始化。用户调用时直接路由到已就绪的容器,彻底消除冷启动带来的模型下载/加载延迟。

4. 可选:模型轻量化优化

若业务允许,可尝试对模型进行轻量化处理:

  • 转换为量化模型(如TensorRT、TorchScript量化),缩小体积同时保持推理性能
  • 使用更小的预训练模型替代大模型
  • 拆分模型为多个子模块,按需加载

内容的提问来源于stack exchange,提问作者Deshwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:20:16