У меня долгая задача 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
Пожалуйстапомогите мне в устранении проблемы.