本文介紹Tensorlfow 針對 CPU SSE4.1 SSE4.2 AVX AVX2 FMA 的編譯優化,以提升Tensorflow在CPU上的計算速度,實測可以提升兩倍以上的速度。
1、問題
在用 pip 安裝tensorflow的CPU版本後,在運行的時候通常會出現如下提示:Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
該提示說明你的CPU支持AVX擴展,但是你安裝的TensorFlow版本無法編譯使用。而AVX的利用可以大大提升線性代數運算。
由於AVX不是所有CPU都支持(實際上08年以後的intel CPU都支持...),所以通過 pip install 安裝的 tensorflow CPU 版本是不支持AVX的。
---------------
所謂AVX,全稱爲高級矢量擴展(Advanced Vector eXtensions,AVX)是英特爾在2008年3月提出的英特爾和AMD微處理器的x86指令集體系結構的擴展,英特爾首先通過Sandy Bridge處理器在2011年第一季度推出,隨後由AMD推出Bulldozer處理器在2011年第三季度.AVX提供了新功能,新指令和新編碼方案。
特別是,AVX引入了融合乘法累加(FMA)操作,加速了線性代數計算,即點積,矩陣乘法,卷積等。幾乎所有機器學習訓練都涉及大量這些操作,因此將會支持AVX和FMA的CPU(最高達300%)更快。該警告指出您的CPU確實支持AVX。
---------------
2、AVX編譯優化
Tensorflow使用谷歌開源的 Bazel 自動化構建工具編譯項目,有一定的學習成本。
但是可以藉助github上編譯好的版本進行安裝。
(1)linux/Mac OS 編譯
github地址: https://github.com/lakshayg/tensorflow-build
下表爲開源項目中的一部分,根據Tensorflow、Ubuntu、GCC、和python版本選擇對應的下載鏈接。
實際上版本並沒有表中那麼嚴格的限制,比如tensorflow版本,版本 1.4.0~1.13.0的主要API變動不大,假如表格中沒有對應版本的話,可以選最近的版本,實測是可以通過的。
同樣的,GCC版本假如高於表中的版本,也選最近的低版本即可
操作系統也不一定是Ubuntu,應該Debian系的都可以。
TF | HW | OS | GCC | Python | Supports | |
1.9.0 | CPU | Ubuntu 16.04 | 5.4 | 3.6.6 | FMA, AVX, AVX2, SSE4.1, SSE4.2 | Download |
1.9.0 | CPU | Ubuntu 16.04 | 5.4 | 3.5.2 | FMA, AVX, AVX2, SSE4.1, SSE4.2 | Download |
1.9.0 | CPU | Ubuntu 16.04 | 5.4 | 2.7.12 | FMA, AVX, AVX2, SSE4.1, SSE4.2 | Download |
1.9.0 | CPU | Ubuntu 18.04 | 7.3 | 3.6.5 | FMA, AVX, AVX2, SSE4.1, SSE4.2 | Download |
1.10.0 | CPU | Ubuntu 18.04 | 7.3 | 3.6.5 | FMA, AVX, AVX2, SSE4.1, SSE4.2 | Download |
1.10.0 | CPU | Ubuntu 18.04 | 7.3 | 2.7.15rc1 | FMA, AVX, AVX2, SSE4.1, SSE4.2 | Download |
下載後得到 tensorflow-1.9.0-cp36-cp36m-linux_x86_64.whl 類似的文件,然後直接在對應的環境中:
pip install tensorflow-1.9.0-cp36-cp36m-linux_x86_64.whl
或者:
conda install tensorflow-1.9.0-cp36-cp36m-linux_x86_64.whl
然後再運行項目,AVX 相關的警告就消失了,而且模型訓練和測試速度應該有大幅提升。
(2)windows 編譯
github 地址:https://github.com/fo40225/tensorflow-windows-wheel
方法同上,找到對應的版本 pip install 或者conda install 即可