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

为何自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:42:18