Сельдерей с Redis и Django дает WorkerLostError для длительных задач - PullRequest
1 голос
/ 19 сентября 2019

У меня долгая задача Celery, которая вычисляет PDP функции.Ниже приводится общая задача, которая выполняется:

@shared_task
def get_pdp_single(bst, train_df, feature, value, f_id=-1):

    x_temp = train_df.copy()
    x_temp.iloc[:, f_id] = value

    data = xgb.DMatrix(x_temp, feature_names=x_temp.columns.tolist())

    predictions = (bst.predict(data))

    avg_predictions = np.mean(predictions)

    result_dict = {
        "feature": feature,
        "avg_predictions": avg_predictions.item()
    }

    return result_dict

Я вычисляю Hstatistics всех функций, взятых в построенной модели XGBoost.Итак, у нас много таких задач в очереди в Broker (Redis).Для этого в Redis ставится в очередь 12 тыс. Задач.

У меня есть 8-ядерная виртуальная машина 16 ГБ, на которой я создаю экземпляр одного работника Celery для выполнения этой задачи.Каждая отдельная дочерняя задача занимает ~ 40 секунд, потому что метод прогнозирования XGBoost требует своего времени для завершения.

В такой длительной задаче я неизменно получаю WorkerLostErrors, и когда и как это происходит, совершенно непредсказуемопроисходит.Тем не менее, я уверен, что это из-за количества задач, поставленных в очередь в брокере, потому что ~ 4-5k задач нормально работают на одной и той же установке без каких-либо проблем.

Ниже приведена трассировка стека, которую яполучить на Celery.

Restarting celery worker (/~/anaconda3/envs/py35_clone_canary/bin/celery -A ba_tpe_python_service worker -Q staging_celery_queue --loglevel=info)

Traceback (most recent call last):
  File "/~/anaconda3/envs/py35_clone_canary/lib/python3.5/site-packages/celery-4.4.0rc3-py3.5.egg/celery/worker/worker.py", line 205, in start
    self.blueprint.start(self)
  File "/~/anaconda3/envs/py35_clone_canary/lib/python3.5/site-packages/celery-4.4.0rc3-py3.5.egg/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/~/anaconda3/envs/py35_clone_canary/lib/python3.5/site-packages/celery-4.4.0rc3-py3.5.egg/celery/bootsteps.py", line 369, in start
    return self.obj.start()
  File "/~/anaconda3/envs/py35_clone_canary/lib/python3.5/site-packages/celery-4.4.0rc3-py3.5.egg/celery/worker/consumer/consumer.py", line 318, in start
    blueprint.start(self)
  File "/~/anaconda3/envs/py35_clone_canary/lib/python3.5/site-packages/celery-4.4.0rc3-py3.5.egg/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/~/anaconda3/envs/py35_clone_canary/lib/python3.5/site-packages/celery-4.4.0rc3-py3.5.egg/celery/worker/consumer/consumer.py", line 596, in start
    c.loop(*c.loop_args())
  File "/~/anaconda3/envs/py35_clone_canary/lib/python3.5/site-packages/celery-4.4.0rc3-py3.5.egg/celery/worker/loops.py", line 74, in asynloop
    state.maybe_shutdown()
  File "/~/anaconda3/envs/py35_clone_canary/lib/python3.5/site-packages/celery-4.4.0rc3-py3.5.egg/celery/worker/state.py", line 80, in maybe_shutdown
    raise WorkerShutdown(should_stop)
celery.exceptions.WorkerShutdown: 0

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/~/anaconda3/envs/py35_clone_canary/lib/python3.5/site-packages/billiard-3.6.1.0-py3.5.egg/billiard/pool.py", line 1267, in mark_as_worker_lost
    human_status(exitcode)),
billiard.exceptions.WorkerLostError: Worker exited prematurely: exitcode 70.

Я также рассмотрел несколько проблем, о которых сообщалось на страницах Github Celery и Billiard.Решение было упомянуто как взять последнюю версию сельдерея и бильярда.Я взял последнюю ветку master из соответствующего Git и собрал ее в своей среде, но все еще сталкиваюсь с той же проблемой

Используемая версия сельдерея: 4.4.0rc3 Используемая бильярдная версия: 3.6.1.0

Пожалуйстапомогите мне в устранении проблемы.

...