python - 推理期间的 XGBoost 延迟峰值
问题描述
我遇到了以下问题:包含 XGB 模型的已部署 python 服务(使用 Docker 的 Kubernetes)停止并导致较大的延迟(> 1 秒)-但是无法在 MacbookPro 2018 上本地运行该服务时重现此行为。
详细描述:我有一个 python 服务,它在每次调用时都运行一个 XGB 模型。在初始化服务时,我将训练好的模型加载到字典中,然后可以在预测期间访问模型。这些模型使用 Learning 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 集群以实时执行预测时,就会出现问题。该服务打包在以下 docker 中:
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 && apt-get install make
RUN pip install 'xgboost==1.3.3' 'numpy==1.20.3' grpcio-tools graypy requests
此 docker 映像正在部署到运行具有 amd64 架构的 AWS 机器的 Kubernetes 集群。检测到的延迟首先使用 Grafana 测量,然后使用 cProfile(默认计时器)进行验证,并记录执行服务所花费的时间。
奇怪的地方是:
这仅发生在运行 XGB 的服务中,其他仅运行 numpy 的服务不会受到这些延迟的影响,尽管它们都运行在集群内的相同节点上
这不是第一个请求(因此它不是初始化问题),但是在执行服务的给定 pod 之后的任何随机请求已经以低延迟响应了多个先前的请求
在本地我没有设法复制这个问题(相同的 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__)
我不知道是否有人对我可以尝试的一些提示?以某种方式改进分析以确定发生了什么?该服务在集群中有一个工作人员,两个指定的 CPU,我已经尝试将操作系统的 nthread 限制为 1。也许有人有想法?感谢您阅读这面墙。
解决方案
推荐阅读
- javascript - 在 TypeScript 中使用属性名称将 Map 转换为 JSON
- vue.js - 在父组件中更新数据后,子组件未从父组件接收道具
- python-2.7 - 在列表中搜索多个对象没有抛出正确的输出
- php - 在 vagrant 机器上使用 Xdebug 调试 cli php
- pandas - 如何根据分位数范围对列进行分类
- qt - QUndostack 删除当前索引上方的项目
- php - xdebug 配置显示错误的 php 版本
- angularjs - 仅从 ng-option 的 Select Dropdown 中获取值
- ffmpeg - 使用 tpad 和 adelay 时更改电影的背景颜色
- r - 闪亮的应用程序中的 Rblpapi 订阅功能