为何自定义Scikit-learn模型无法在AWS Lambda中运行?
解决AWS Lambda中自定义Scikit-learn模型反序列化失败的问题
核心原因
pickle反序列化时,要求模型类的定义模块路径必须和序列化时完全一致。本地训练序列化时,Modelito类大概率是在__main__模块(比如直接在主脚本里定义的类),但Lambda环境中你的自定义类属于lambda_function.py或其他模块,路径不匹配导致找不到类。
具体解决步骤
1. 统一模型类的模块路径(推荐方案)
- 不要在本地主脚本里定义
Modelito,把它放到单独的模块文件,比如custom_models.py。 - 本地训练保存模型时,从该模块导入类:
# 本地训练代码 from custom_models import Modelito model = Modelito() # 训练逻辑... pickle.dump(model, open("model.pkl", "wb")) - 把
custom_models.py和lambda_function.py一起打包部署到Lambda,在handler里从同一模块导入类:# lambda_function.py from custom_models import Modelito import pickle def handler(event, context): with open("model.pkl", "rb") as file: model = pickle.load(file) # 后续业务逻辑...
2. 修复现有模型的模块映射(无需重新训练)
如果不想重新训练模型,可在Lambda中临时修改模块映射,让pickle能找到类:
# lambda_function.py import pickle import sys # 定义Modelito类(和本地完全一致的实现) class Modelito: # 类的所有方法实现... # 将当前模块映射为序列化时的__main__模块 sys.modules['__main__'] = sys.modules[__name__] def handler(event, context): with open("model.pkl", "rb") as file: model = pickle.load(file) # 后续业务逻辑...
3. 验证部署包结构
确保部署包中所有文件(自定义类模块、模型文件)都在Lambda的/var/task/目录下,可通过Lambda控制台的「代码」标签确认文件结构。
4. 对齐依赖版本
确认Lambda环境的Python、Scikit-learn版本和本地完全一致,版本不匹配也可能引发反序列化异常。可通过requirements.txt或Lambda层指定精确版本。
内容的提问来源于stack exchange,提问作者Gon Alb
相关产品推荐
相关产品推荐

