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

AWS Lambda加载facebook/bart-large-cnn模型出现OSError求助

解决方案

方法1:构建镜像时预打包模型

在Docker镜像构建阶段就把模型下载到镜像内,避免Lambda运行时再去下载模型(受限于只读文件系统或网络)。

修改Dockerfile

# 基础镜像
FROM public.ecr.aws/lambda/python:3.9

# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 预下载模型到镜像的/tmp目录
RUN python -c "from transformers import BartTokenizer, BartForConditionalGeneration; \
    tokenizer = BartTokenizer.from_pretrained('facebook/bart-large-cnn'); \
    model = BartForConditionalGeneration.from_pretrained('facebook/bart-large-cnn'); \
    tokenizer.save_pretrained('/tmp/bart-large-cnn'); \
    model.save_pretrained('/tmp/bart-large-cnn');"

# 复制业务代码
COPY app.py ${LAMBDA_TASK_ROOT}

# 设置Lambda执行入口
CMD ["app.lambda_handler"]

调整代码中的模型加载路径

from transformers import BartTokenizer, BartForConditionalGeneration

def lambda_handler(event, context):
    # 直接加载镜像内预存的模型
    tokenizer = BartTokenizer.from_pretrained('/tmp/bart-large-cnn')
    model = BartForConditionalGeneration.from_pretrained('/tmp/bart-large-cnn')
    
    # 后续新闻摘要逻辑...

方法2:指定模型缓存到Lambda可读写目录

Lambda仅/tmp目录具备可读写权限,通过环境变量让transformers将模型下载到该目录。

修改业务代码

import os
from transformers import BartTokenizer, BartForConditionalGeneration

def lambda_handler(event, context):
    # 设置transformers缓存目录为/tmp下的路径
    os.environ['TRANSFORMERS_CACHE'] = '/tmp/huggingface_cache'
    
    # 加载模型,自动下载到指定缓存目录
    tokenizer = BartTokenizer.from_pretrained('facebook/bart-large-cnn')
    model = BartForConditionalGeneration.from_pretrained('facebook/bart-large-cnn')
    
    # 后续新闻摘要逻辑...

注:首次运行Lambda会触发模型下载,耗时较长;/tmp目录在函数冷启动或资源回收时可能被清空,长期稳定运行优先选方法1。

方法3:从S3加载模型

将模型文件上传至AWS S3,Lambda启动时从S3下载到/tmp目录再加载,适合模型体积过大不想打包进镜像的场景。

代码示例

import boto3
import os
from transformers import BartTokenizer, BartForConditionalGeneration

# 配置S3信息
S3_BUCKET = '你的存储桶名称'
MODEL_S3_PREFIX = 'models/bart-large-cnn/'
LOCAL_MODEL_DIR = '/tmp/bart-large-cnn'

def lambda_handler(event, context):
    # 创建本地模型目录
    os.makedirs(LOCAL_MODEL_DIR, exist_ok=True)
    
    # 从S3下载所有模型文件
    s3 = boto3.client('s3')
    for obj in s3.list_objects_v2(Bucket=S3_BUCKET, Prefix=MODEL_S3_PREFIX)['Contents']:
        file_name = obj['Key'].split('/')[-1]
        if file_name:
            s3.download_file(S3_BUCKET, obj['Key'], f"{LOCAL_MODEL_DIR}/{file_name}")
    
    # 加载模型
    tokenizer = BartTokenizer.from_pretrained(LOCAL_MODEL_DIR)
    model = BartForConditionalGeneration.from_pretrained(LOCAL_MODEL_DIR)
    
    # 后续新闻摘要逻辑...

需给Lambda执行角色添加S3对象读取权限。

错误原因说明

Lambda运行环境中,除/tmp外的文件系统均为只读状态,而transformers默认将模型下载到用户主目录缓存(如~/.cache/huggingface/hub),该路径不可写导致OSError;此外Lambda网络环境可能无法直接访问Hugging Face模型仓库,也会引发下载失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:18:25