Gunicorn部署Flask应用时FastAI模型getImages属性缺失问题求助
Gunicorn部署Flask+FastAI模型时的函数找不到问题解决及规避方案
问题根源
本地运行Flask应用时,__main__指向的是你的app代码模块,FastAI保存模型时会记录依赖函数getImages所在的模块为__main__;但用Gunicorn启动时,__main__变成了gunicorn的主模块(/usr/local/bin/gunicorn),模型加载时自然找不到属于原app模块的getImages函数。
现有部署问题的解决方法
- 把
getImages函数迁移到独立模块,比如新建utils.py文件,将函数定义放在其中,然后在Flask app的主文件里通过from utils import getImages导入使用 - 重新训练并保存模型:训练时确保
getImages是从独立模块导入的,而非写在训练脚本的主作用域内。这样模型保存时会记录函数所属模块为utils,而非__main__,部署时就能正常找到 - 临时修复(不推荐长期使用):在Flask app主文件开头添加以下代码,强制将
__main__映射到当前app模块:import sys sys.modules['__main__'] = sys.modules[__name__]
未来构建FastAI模型的规避方案
- 所有自定义数据处理、模型相关的函数,都放在单独的工具模块(如
data_utils.py、model_utils.py)中,避免直接写在训练脚本的主作用域 - 训练过程中,所有依赖的自定义函数必须从独立模块导入,不要在训练脚本里直接定义主作用域函数
- 保存模型前,检查模型依赖的函数所属模块:可以查看
learn对象的相关属性,确认没有函数关联到__main__模块 - 本地提前模拟部署环境测试:用
gunicorn app:app命令在本地启动服务,验证模型加载和推理是否正常,提前排查问题
内容的提问来源于stack exchange,提问作者AynonT
相关产品推荐
相关产品推荐

