排查PythonAnywhere中模型文件加载失败问题
解决PythonAnywhere部署中joblib加载模型的KeyError: 0问题
我在PythonAnywhere部署的应用中,尝试读取训练好的模型文件并在最终流程中使用时,遇到了如下错误。我已经多次更新依赖库、修正文件路径,但部署仍未成功,恳请协助解决:
2024-11-04 21:12:35,262: Exception on /sonucum [GET] Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2077, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1525, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1523, in full_dispatch_request rv = self.dispatch_request() File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1509, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "/home/mypersonalityinventory/mysite/flask_app.py", line 1260, in sonucum genel_sonuc() File "/home/mypersonalityinventory/mysite/flask_app.py", line 792, in genel_sonuc model = joblib.load(lfk_model_path) File "/usr/local/lib/python3.9/site-packages/joblib/numpy_pickle.py", line 587, in load obj = _unpickle(fobj, filename, mmap_mode) File "/usr/local/lib/python3.9/site-packages/joblib/numpy_pickle.py", line 506, in _unpickle obj = unpickler.load() File "/usr/local/lib/python3.9/pickle.py", line 1212, in load dispatch[key[0]](self) KeyError: 0
解决方法
检查模型文件完整性
上传到PythonAnywhere的模型文件可能因传输中断损坏,导致加载时解析失败。重新上传文件,上传时确保使用二进制传输模式(如FTP的binary模式,或PythonAnywhere文件管理器直接拖拽时确认文件上传完成)。可以在代码中添加文件存在性检查:import os lfk_model_path = "/home/mypersonalityinventory/mysite/your_model_file.joblib" if not os.path.exists(lfk_model_path): raise FileNotFoundError(f"模型文件不存在:{lfk_model_path}") model = joblib.load(lfk_model_path)统一训练与部署环境的依赖版本
训练模型时使用的joblib、scikit-learn等依赖版本必须和PythonAnywhere部署环境完全一致,版本不匹配会导致序列化/反序列化失败。- 在训练环境执行
pip freeze > requirements.txt,导出所有依赖的精确版本。 - 在PythonAnywhere的虚拟环境中执行
pip install -r requirements.txt,安装完全匹配的依赖。 - 若只想单独指定关键依赖版本,例如:
pip install joblib==1.3.2 scikit-learn==1.2.2
- 在训练环境执行
适配Pickle协议版本
如果训练模型的Python版本(如3.10+)高于PythonAnywhere的版本(这里是3.9),会因Pickle协议版本不兼容引发错误。- 方案一:在Python 3.9环境中重新训练并保存模型。
- 方案二:保存模型时指定兼容的协议版本(Python 3.4+支持协议4,兼容3.9):
joblib.dump(model, "model.joblib", protocol=4)
再次验证文件路径
即使已修正路径,仍可以在代码中打印路径和当前工作目录,确认路径正确性:import os print("模型文件路径:", lfk_model_path) print("当前工作目录:", os.getcwd())确保使用的是绝对路径,且文件确实存在于该位置。
内容的提问来源于stack exchange,提问作者Özge Üstüner
相关产品推荐
相关产品推荐

