Всплески задержки XGBoost во время вывода

#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.