基于transformers的摘要生成模型在Gunicorn服务器加载失败问题
Gunicorn默认超时阈值过低
Gunicorn默认的worker响应超时时间为30秒,google/pegasus-xsum模型体积较大,全量加载通常需要1~5分钟不等,加载耗时超过阈值后,master进程会直接判定worker无响应并将其杀死重启,表现为无限加载。
解决方案:启动Gunicorn时添加超时参数,延长超时时间到足够完成模型加载:gunicorn --timeout 300 你的启动参数多worker重复加载触发OOM
若你配置了多worker启动,默认模式下每个worker会独立加载一份完整模型,TF版pegasus-xsum单份权重占用内存超过2G,多份加载很容易耗尽服务器内存,触发系统OOM主动杀死进程。
解决方案:先将worker数调整为1测试加载是否正常,确认是内存问题后可开启预加载模式,让master进程加载完模型后再fork worker,多worker共享同一份模型权重,大幅降低内存占用:gunicorn --workers 1 --preload --timeout 300 你的启动参数Prefork模式与TensorFlow兼容性冲突
Gunicorn默认使用prefork工作模式,worker进程内部初始化TensorFlow模型时,容易出现底层线程池、资源分配冲突,导致加载流程卡死。
解决方案:优先使用--preload参数在master进程完成模型初始化,也可切换为gthread worker模式规避兼容问题:gunicorn --worker-class gthread --preload --timeout 300 你的启动参数Hugging Face缓存目录权限不足
若Gunicorn运行用户和本地测试的用户不一致,默认的Hugging Face缓存目录~/.cache/huggingface可能对Gunicorn运行用户无读写权限,导致进程卡在静默下载模型的环节无响应。
解决方案:提前将模型下载到公共目录,加载时通过cache_dir参数指定路径,或给缓存目录开放Gunicorn运行用户的读写权限。
内容的提问来源于stack exchange,提问作者DevPy

