如何在Railway平台部署含pickle模型的Django项目?
在Railway部署含Pickle模型的Django项目:解决文件找不到问题
问题重现
在Railway部署Django项目时,加载pickle格式的机器学习模型时持续报错FileNotFoundError,即使模型文件已存在于GitHub仓库中:
- 尝试直接加载根目录模型:
报错:binary_clf = joblib.load(os.path.abspath('binary_classifier.pkl'))No such file or directory: '/app/binary_classifier.pkl' - 尝试放入static目录加载:
报错:binary_clf = joblib.load("static/binary_classifier.pkl")No such file or directory: 'static/binary_classifier.pkl'
项目结构如下:
baby_cry_proj/ ├── baby_cry/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ ├── models.py │ ├── tests.py │ ├── urls.py │ ├── views.py │ └── __init__.py ├── core/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ ├── models.py │ ├── templates/ │ │ ├── base.html │ │ ├── index.html │ │ └── ... │ ├── tests.py │ ├── urls.py │ ├── views.py (调用binary_classifier.pkl的文件) │ └── __init__.py ├── env ├── manage.py ├── Procfile ├── requirements.txt ├── settings.py ├── static/ │ ├── binary_classifier.pkl ├── staticfiles/ ├── admin/ │ ├── binary_classifier.pkl └── binary_classifier.pkl
解决方案
核心问题是依赖相对路径导致部署环境路径不匹配,Railway的容器工作目录可能和本地开发环境不一致,必须用Django内置的路径常量来构建绝对路径。
1. 规范模型文件存放位置
不建议将机器学习模型放入static目录(该目录专为CSS/JS/图片等前端静态资源设计),推荐两种存放方式:
- 方式一:在项目根目录新建
ml_models文件夹,将模型放入其中 - 方式二:将模型直接放在调用它的
coreapp目录下
2. 使用Django的BASE_DIR构建绝对路径
在core/views.py中,通过settings.BASE_DIR(项目根目录的绝对路径)来拼接模型文件路径,确保在任何环境下都能正确找到文件:
若模型放在项目根目录的ml_models文件夹:
from django.conf import settings import os import joblib # 构建模型绝对路径 model_path = os.path.join(settings.BASE_DIR, 'ml_models', 'binary_classifier.pkl') binary_clf = joblib.load(model_path)
若模型放在core app目录下:
import os import joblib # 基于当前views.py文件的路径构建模型路径 model_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'binary_classifier.pkl') binary_clf = joblib.load(model_path)
3. 检查.gitignore规则
确保模型文件没有被Git忽略:
- 打开项目根目录的
.gitignore文件,删除*.pkl、static/等可能排除模型文件的规则 - 执行
git add binary_classifier.pkl(或对应路径的模型文件),提交并推送到GitHub,确保Railway能拉取到该文件
4. 验证部署环境路径(可选调试)
如果仍有问题,可在views.py中添加调试代码,查看Railway容器中的实际路径:
import os from django.conf import settings print("当前工作目录:", os.getcwd()) print("项目根目录BASE_DIR:", settings.BASE_DIR)
查看Railway的部署日志,确认路径是否与预期一致,进一步排查问题。
内容的提问来源于stack exchange,提问作者Galym
相关产品推荐
相关产品推荐

