macOS Ventura下Celery运行Torch模型遇WorkerLostError求助
解决方案:Flask+Celery调用Torch模型时Worker崩溃问题
1. 更换Celery Worker启动方式
MacOS(尤其是ARM架构)下,Celery默认的fork进程启动方式与PyTorch、ObjC库存在兼容性冲突,直接触发初始化错误。改为使用spawn或solo模式启动worker:
- Celery 5.x及以上版本:
celery -A 你的Flask应用模块名 worker --pool=spawn --concurrency=2 --loglevel=info - Celery 4.x版本:
(celery -A 你的Flask应用模块名 worker --pool=solo --loglevel=infosolo为单进程模式,适合调试;若需多进程,可安装gevent后用--pool=gevent,需确保Torch兼容协程环境)
2. 延迟Torch模型加载时机
避免在主进程(Flask启动阶段)加载模型,改为在Worker进程启动后或任务首次执行时加载,防止fork后子进程继承未完成初始化的模型状态:
from celery import Celery import torch app = Celery('tasks', broker='你的消息队列地址') # 全局变量存储模型,确保每个Worker进程独立加载 model = None @app.on_after_configure.connect def init_model(sender, **kwargs): """Worker启动时初始化模型""" global model # 根据实际情况调整模型加载逻辑 model = torch.load('模型文件路径', map_location=torch.device('cpu')) model.eval() @app.task def inference_task(input_data): """推理任务""" global model with torch.no_grad(): output = model(input_data) return output.tolist()
3. 解决SIGKILL(内存耗尽)问题
设置OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES后出现的SIGKILL通常是内存不足导致系统强制杀死进程,可通过以下方式优化:
- 减少Worker并发数:启动命令中添加
--concurrency=1或更小值,避免多进程同时加载模型导致内存过载 - 优化模型内存占用:
- 加载模型时指定
map_location=torch.device('cpu')(无需GPU时) - 将模型转为TorchScript格式减少内存占用:
# 提前转换模型 model = torch.load('原模型路径') model.eval() scripted_model = torch.jit.script(model) scripted_model.save('轻量化模型路径') - 推理时使用半精度计算:
model.half()(需确保模型支持)
- 加载模型时指定
4. 环境变量配置
在启动Celery前设置以下环境变量,增强兼容性:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES export PYTHONHASHSEED=1
内容的提问来源于stack exchange,提问作者Ivan Guerrón
相关产品推荐
相关产品推荐

