#python #docker #kubernetes #xgboost
Вопрос:
У меня возникла следующая проблема: служба развертывания python (Kubernetes с использованием Docker), содержащая модель XGB, останавливается и приводит к большим задержкам (>1 секунды) — однако это поведение не может быть воспроизведено локально при запуске службы на MacBookPro 2018.
Подробное описание: У меня есть служба python, которая запускает модель XGB при каждом вызове. При инициализации службы я загружаю обученные модели в словарь, откуда затем можно получить доступ к моделям во время прогнозирования. Модели обучаются с использованием API обучения и хранятся в виде файлов JSON (обучаются с версией 1.3.3). Код прогнозирования реализован примерно так:
#Touchdown
td_clf = models['drive_outcome']['touchdown']
td_prob_bin = td_clf.predict(DMatrix(to_predict[:, :-1]))
td_prob = float(td_prob_bin)
На протяжении всей службы существует множество других моделей XGB, используемых аналогичным образом, и, как правило, ожидаемая задержка составляет около 5 мс для всей службы. Проблема возникает, когда эта служба развертывается в кластере Kubernetes для выполнения прогнозов в режиме реального времени. Услуга упакована в следующем окне настройки:
FROM python:3.9.6-slim-buster
EXPOSE 6001
WORKDIR /american_football
ENV PYTHONPATH=..
ARG arg_league
ENV LEAGUE=$arg_league
RUN apt-get update amp;amp; apt-get install make
RUN pip install 'xgboost==1.3.3' 'numpy==1.20.3' grpcio-tools graypy requests
Этот образ докера развертывается в кластере Kubernetes, на котором работают компьютеры AWS с архитектурой amd64. Обнаруженные задержки были сначала измерены с помощью Grafana, а затем проверены с помощью cProfile (таймер по умолчанию) и регистрации времени, затраченного на выполнение службы.
Странными моментами являются:
- это происходит только в службе, работающей под управлением XGB, другие службы, которые работают исключительно на numpy, не страдают от этих задержек, хотя все они работают на одних и тех же узлах в кластере
- это не первый запрос (так что это не проблема инициализации), но любой случайный запрос после того, как данный модуль, исключающий службу, уже ответил на несколько предыдущих запросов с низкой задержкой
- локально мне не удалось воспроизвести эту проблему (те же версии python и xgboost)
- профилировщик сообщает о времени, проведенном в функциях xgb.core:
1126 вызовов функций (1102 примитивных вызова) за 1,337 секунды
Ordered by: internal time ncalls tottime percall cumtime percall filename:lineno(function) 8 0.685 0.086 0.686 0.086 /usr/local/lib/python3.9/site-packages/xgboost/data.py:132(_from_numpy_array) 8 0.647 0.081 0.648 0.081 /usr/local/lib/python3.9/site-packages/xgboost/core.py:1385(predict) 1 0.000 0.000 1.337 1.337 /american_football/model_services/predict_states/predict_states_model.py:28(predict_states) 8 0.000 0.000 0.001 0.000 /usr/local/lib/python3.9/site-packages/xgboost/core.py:192(ctypes2numpy) 8 0.000 0.000 0.686 0.086 /usr/local/lib/python3.9/site-packages/xgboost/core.py:435(__init__) 33 0.000 0.000 0.000 0.000 {built-in method numpy.array} 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.9/site-packages/numpy/lib/arraysetops.py:138(unique) 9 0.000 0.000 0.000 0.000 /american_football/model_services/predict_states/predict_states_model.py:297(construct_lookup_state) 2 0.000 0.000 0.000 0.000 /usr/local/lib/python3.9/site-packages/numpy/lib/arraysetops.py:310(_unique1d) 16 0.000 0.000 0.000 0.000 /usr/local/lib/python3.9/site-packages/numpy/core/_internal.py:249(__init__)
I don’t know if anybody has some tips to what I could try? Improve the profiling somehow to determine what is happening? The service has one worker, two designated CPUs in the cluster and I have already tried limiting the nthread of the os to 1.
Maybe somebody has an idea? Thanks for reading this wall.