如何在AWS Lambda中借助pkl文件调用线性回归模型?
解决AWS Lambda中加载S3存储的Pickle模型报错问题
错误根源
你碰到的TypeError: expected str, bytes or os.PathLike object, not _io.BytesIO,是因为open()函数要求传入文件路径字符串,而你传了一个BytesIO对象。而且完全没必要用open(),pickle.load()可以直接读取BytesIO这类类文件对象。
修正方案
- 删掉多余的
open()调用,直接把seek后的BytesIO对象传给pickle.load() - 注意:如果之前调用过
data.read(),文件指针会移到末尾,后续pickle.load()会读取空数据,所以要么在load前别调用data.read(),要么调用后重新执行data.seek(0)重置指针
修正后的完整代码
from io import BytesIO import pickle import boto3 import json s3_client = boto3.client('s3') def lambda_handler(event, context): # 获取S3桶名和对象键 source_bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] data = BytesIO() s3_client.download_fileobj(source_bucket, key, data) data.seek(0) # 重置文件指针到开头 # 直接用BytesIO对象加载模型 load_model = pickle.load(data) print("load_model", load_model) y_pred = load_model.predict([[140000]]) # 可按需添加结果返回逻辑 return { 'statusCode': 200, 'body': json.dumps({'prediction': y_pred.tolist()}) }
额外注意点
- 如果模型依赖scikit-learn这类第三方库,要确保Lambda运行环境安装了对应依赖,可通过Lambda层(Layer)添加
- 确认Lambda执行角色拥有目标S3桶的
s3:GetObject权限
内容的提问来源于stack exchange,提问作者user19153469
相关产品推荐
相关产品推荐

