本地正常的Python ML模型部署Heroku时pickle反序列化报错如何解决
问题排查与解决方案
你现有的Procfile配置web: gunicorn app:app没有问题,服务崩溃核心原因是模型反序列化失败,_pickle.UnpicklingError: NEWOBJ class argument isn't a type object错误几乎均由序列化(训练保存模型)和反序列化(部署加载模型)两端的运行环境/依赖版本不匹配触发,可按以下步骤依次排查:
- 对齐xgboost依赖版本
本地执行pip show xgboost获取你训练模型时使用的xgboost精确版本号,在requirements.txt中写死该版本,例如xgboost==1.7.5,不要使用无版本约束的xgboost声明,避免Heroku自动安装的最新版和你本地版本不兼容。 - 对齐Python运行版本
本地执行python --version获取你项目使用的Python精确版本号,在项目根目录新建runtime.txt文件,填写对应版本声明,例如python-3.9.17,强制Heroku使用和本地一致的Python环境,不同Python版本内置的pickle协议存在差异,也会触发反序列化错误。 - 改用xgboost官方序列化方案
原生pickle的跨环境兼容性极差,你可以替换为xgboost官方提供的序列化方法彻底解决该问题:
本地训练完成后,放弃pickle保存方式,改用model.save_model("model/bike_model_xgboost.xgb")生成官方格式模型文件;
部署端加载时替换原有pickle逻辑为:import xgboost as xgb model = xgb.Booster() model.load_model("model/bike_model_xgboost.xgb") - 检查模型文件提交状态
确认你的.gitignore规则没有过滤pkl/xgb格式的模型文件,避免提交到Heroku的模型文件残缺,触发加载错误。
内容的提问来源于stack exchange,提问作者Agustín
相关产品推荐
相关产品推荐

