Blog的Github地址:github.com/liuyan731/b…html
最近上線了兩個機器學習Python服務,可是在線上的性能並非特別好,並且CPU的負載很是高。而後發現是安裝的Tensorflow未使用AVX指令集致使的。今天分享一下調試方法和解決方案。python
最近發現線上Tensorflow python服務CPU消耗太高,服務性能也很是差,而後分析緣由,測試服務器上使用timeline工具查看預測操做的耗時以下圖:c++
發現整個計算過程消耗時間過長(30ms)對比本機(使用GPU加速,服務器機器只用於提供服務,無GPU)耗時差異巨大(1ms,以下圖)git
同時發現兩個timeline上面的op的名稱不同,在測試服務器上操做爲:_MklConv2DWithBias、_MklRelu等,在本機上爲Conv2D、Relu等。github
這時想到在運行Tensorflow的時候,import會warning提示沒有使用intel avx、sse指令集:shell
Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2性能優化
The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.服務器
The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.app
The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.機器學習
由於這個只是warning並不影響程序的運行,因此一直沒有在乎,同時當時在網上查找解決方案,有不少「建議」讓無論或直接把這個warning關掉...
考慮到這個AVX/SSE指令集可能會提升性能,因此着手從新編譯安裝Tensorflow,編譯安裝能夠參考:stackoverflow.com/questions/4… ,過程仍是有點複雜,須要使用bazel。
可是我並無真正去編譯安裝orz,由於發現咱們使用的Tensorflow 1.6.0 已經開始使用AVX指令集進行預編譯了,以下圖:
可是爲什麼仍是會有warning警告呢?
與小組的另外一位同窗討論,發現他使用的tensorflow1.6.0並不會有avx warning,細問之下發現他是使用pip(阿里雲)安裝的,而我是使用conda(清華鏡像)安裝的。
考慮到conda鏡像和pip鏡像的可能不一致,將conda安裝的Tensorflow卸載,從新使用pip安裝,avx warning消失。
從新運行服務並打印timeline,以下圖:
總體時間降低到2ms,性能大大提高,同時CPU負載大大下降!至此性能優化到合理的水平。
因此至少對於Tensorflow 1.6.0版本pip安裝與conda安裝是不一致的。
ps
mkdir .pip
vi .pip/pip.conf
[list]
format=columns
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
複製代碼
程序中的warning也是須要引發你們足夠的重視,說不定裏面就有一個大坑。。。
2018/4/22 done
此文章也同步至我的Github博客