背景
- 查看响应时间日志,新增加的两台GPU机器服务器响应时间要比老的机器要快3倍
- qps 相似,机型一模一样,同一个服务和同样的模型
排查
-
htop
查看老机器开启了 swap, 新机器关闭了swap,于是将老机器的 swap 关闭,然而并没有效果 -
prometheus 比对两台机器的运行差异,除了老机器CPU使用率和负载都比新机器高以外其余的指标全部都接近,排除磁盘、网络等问题
-
export -p
对比环境变量一样,排除环境变量问题 -
lsof -p 进程ID| grep mem
拿到python3运行环境依赖的库进行比对, 发现运行时类库有些不一样,联系算法同学升级版本和对比原因- opencv 版本不一致,升级版本为一致,
pip3 list|grep opencv
- Pillow 版本不一致,升级版本为一致,
pip3 list|grep Pillow
- 为什么跑的快的机器有用到 onnxruntime_gpu.libs/libz-eb09ad1d.so.1.2.3, 跑的慢的机器没有用这个类库,算法同学找到关键点了
- opencv 版本不一致,升级版本为一致,
解决
在慢的机器上运行 pip3 list
发现有同时安装 onnxruntime 和 onnxruntime-gpu, 于是测试
$ pip3 list|grep onnxruntime
onnxruntime 1.4.0
onnxruntime-gpu 1.4.0
$ python3
>>>import onnxruntime
>>>onnxruntime.get_device();
'CPU'
终于找到原因了,就是因为onnxruntime全部是在CPU上计算的,导致服务器的CPU利用率过高,GPU反而没有怎么利用,于是卸载CPU版本 pip3 uninstall onnxruntime, 然后重启服务,人脸识别模型的服务响应速度由800毫秒提升到250毫秒
原因分析
TODO,我不是搞算法和运维的,求大神解答
- 为什么同时安装onnxruntime和onnxruntime-gpu的时候,onnxruntime默认会使用CPU呢?
- 我们的开发机器上面都有同时安装这两个库,为什么默认使用的就是GPU?