我有一个使用torch库的芹菜任务,torch库在内部使用CUDA。当我运行任务时,它失败了"无法在分叉子流程中重新初始化CUDA。要在多处理中使用CUDA,必须使用"派生"启动方法";
当我浏览一下这个时,我得到了这个——https://github.com/celery/celery/issues/6036这个问题说芹菜只支持分叉而不支持产卵。
有什么变通办法/替代方案吗?
您应该加载pytorch模型并将其用作全局变量。模型和任务的实例将在相同的过程中运行
from celery.signals import worker_process_init
# for more information about worker_process_init, read here:
# https://docs.celeryproject.org/en/stable/userguide/signals.html#worker-process-init
pytorch_model = None
@worker_process_init.connect()
def init_worker_process(**kwargs):
"""
load model before running tasks
:param kwargs:
:return:
"""
global pytorch_model
pytorch_model = load_model()
@app.task
def predict_task(image: np.ndarray):
return pytorch_model.predict(image)
你可以用"独奏";池式
celery -A tasks worker --pool=solo --loglevel=info
Solo只创建一个线程,并使用该线程运行芹菜任务。此处无法提供并发编号。
我知道这是一个旧线程,但把它留在这里,以防有人遇到同样的问题。设置--pool=solo
解决了cuda错误,但它使celeni的control.inspect()
返回None。若要避免,请使用celery -A tasks worker --pool=threads
。这为我解决了cuda错误,而control.inspect()
仍然可用。
其他解决方案,如设置torch.multiprocessing('spawn', force=True)
,对我没有任何帮助
(第一个答案不是一个选项,因为cuda错误只有在调用Transformer的TrainingArguments()
时才会弹出。将模型加载为全局模型或在调用TrainingArguments()
后加载并不能解决任何问题。(
(在FastAPI+芹菜+Redis+Flower环境中使用火炬和变压器(