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
相关产品推荐
相关产品推荐

