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

Celery Worker中无法加载YOLO模型进行图片预测问题排查

问题描述

正常调用inference函数时,YOLO模型加载与图片预测可正常运行;但通过Celery Worker调用该函数时,无任何报错且无法加载模型,日志输出到model_path后便停止,无法执行到_model = YOLO(model_path)之后的步骤。相关代码如下:

import sys
from question_detection.inference_object_detection.check_model import verify_model
from logger import logger
from ultralytics import YOLO


class ModelNotFoundError(Exception):
    pass


def load_model():
    try:
        success, model_path = verify_model()
        logger.info("model loading started")
        if not success:
            raise ModelNotFoundError("Model not found!")
        logger.info("123")
        logger.info(model_path)
        _model = YOLO(model_path)
        logger.info("456")
        if _model is None:
            raise ModelNotFoundError("Model not loaded!")
        logger.info("789")
        return _model, _model.names
    except ModelNotFoundError as e:
        logger.error(e)
        sys.exit(1)  # Exit the system with a non-zero exit code to indicate an error
    except Exception as e:
        logger.error(e)
        return None, None


def inference(images):
    """
    Inference on image
    :param images: It can be a single image, list of images or a directory
    :return: List of results
    """
    logger.info("started inference of images!")
    model, categories = load_model()
    if model is None:
        raise ModelNotFoundError("Model is not loaded!")

    res = model(images), categories
    logger.info("Completed inference of images!")
    return res
可能的原因分析
  • Celery Worker资源限制:Celery Worker进程可能被设置了内存、CPU配额限制,YOLO模型加载需要较大内存,当Worker内存不足时会静默卡住而非抛出异常。可检查Celery启动参数(如--max-memory-per-child),或系统分配给Worker的资源上限。
  • 模型路径权限/有效性问题:verify_model返回的model_path在Celery Worker环境中可能不存在、路径无效或权限不足。本地调用时路径基于当前进程工作目录,而Worker可能运行在不同目录,导致路径失效。可在load_model中加入logger.info(os.getcwd())对比本地与Worker的工作目录,同时确保Worker进程对模型文件有读取权限。
  • YOLO隐式依赖下载卡住:Ultralytics YOLO加载模型时可能自动下载依赖组件,但Celery Worker若处于网络受限环境,下载过程会卡住且无报错。可提前在Worker环境手动下载所有依赖,或检查Worker的网络访问权限。
  • 模型加载的进程隔离冲突:Celery默认prefork模式下,子进程可能无法正确加载YOLO的底层CUDA/CPU加速库,导致卡住。可尝试用--pool=solo参数启动Celery(单进程模式)测试,排除多进程库加载冲突。
  • 异常捕获遗漏:当前load_model的except Exception as e可能未捕获到底层异常(如C++扩展异常、信号中断),导致进程卡住而非抛出错误。可在_model = YOLO(model_path)前后增加更详细的日志,或暂时注释sys.exit(1)改为抛出异常,触发Celery错误日志。
  • 重复加载与序列化问题:若每次调用inference都重复加载模型,可能导致Worker资源耗尽;部分场景下模型对象若被尝试序列化传递,YOLO模型无法被Celery序列化器(如pickle)处理会引发静默失败。可改为全局单例模式,在Worker启动时提前加载模型,避免重复加载。

内容的提问来源于stack exchange,提问作者Danish Bansal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:47:40