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
相关产品推荐
相关产品推荐

