You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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=info
    
    (solo为单进程模式,适合调试;若需多进程,可安装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:12:34