有時候我們在使用TensorFlow進行運行代碼時,會出現如下信息
Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
這裏說我們的電腦是支持AVX AVX2的,但是並沒有使用。
爲什麼出現AVX警告?
TensorFlow 運行二進制文件需要使用AVX指令
首先了解一下 AVX AVX2 是什麼,對程序起到什麼作用呢?
AVX 簡介
是Intel在2008年3月提出的針對Intel和AMD微處理器的x86指令集體系結構的擴展,並由Intel首先在2011年第一季度及以後發佈的Sandy Bridge處理器中提供支持。由AMD隨Bulldozer處理器一起在2011年第三季度上市。AVX提供了新功能,新指令和新編碼方案。
AVX引入了融合乘法累加(FMA)運算,從而加快了線性代數的計算速度,即點積,矩陣乘法,卷積等。幾乎每個機器學習訓練都涉及大量這些運算,因此將在支持AVX和FMA(最高300%)的CPU上速度更快
AVX AVX2僅與CPU有關 。
tensorflow爲什麼不使用 AVX AVX2 呢?
1)tensorflow默認發行版是在沒有CPU擴展(SSE4.1,SSE4.2,AVX,AVX2,FMA)情況下構建的;默認構建(從中爲pip install tensorflow
)旨在與儘可能多的CPU兼容。
2)而且即使有了這些擴展,CPU也比GPU慢很多,並且tensorflow期望在GPU上進行中型和大型的機器學習訓練。
解決方案1
使用背景
我們電腦沒有GPU,同時不在意AVX的支持;或者不想買昂貴的GPU,只想使用CPU執行就可以了。
這種情況下,通過以下方式忽略此警告
# Just disables the warning, doesn't enable AVX/FMA
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
命令解析:在的主程序代碼中導入OS模塊,併爲其設置映射對象。
哈哈這樣就不會看到這些煩人的警告啦。
如果使用是Unix的朋友
在bash shell中使用export命令
export TF_CPP_MIN_LOG_LEVEL=2
解決方案2
使用背景
電腦沒有GPU,但是我們的電腦CPU挺爭氣的(支持AVX),想使用AVX去加速運行程序
這時需要從源代碼編譯 TensorFlow pip 軟件包,然後安裝。
適用系統: Ubuntu Linux 和 macOS (不支持windows有點尷尬啊)
Ubuntu Linux 和 macOS 經過測試的構建配置(tensorflow 版本、Python 版本、編譯器、編譯工具)在文章最後補充了。
Ubuntu 系統
步驟目錄
安裝 Python 和 TensorFlow 軟件包依賴項
sudo apt install python-dev python-pip
如果是使用python3的朋友,請用下面的命令:
sudo apt install python3-dev python3-pip
安裝 TensorFlow pip 軟件包依賴項(如果使用虛擬環境,需要省略 --user
參數):
pip install -U --user pip six numpy wheel setuptools mock future>=0.17.1
pip install -U --user keras_applications==1.0.6 --no-deps
pip install -U --user keras_preprocessing==1.0.5 --no-deps
這些依賴項列在 setup.py
文件中的 REQUIRED_PACKAGES
下。
安裝 Bazel 安裝 Bazel,它是用於編譯 TensorFlow 的編譯工具。將 Bazel 可執行文件的位置添加到 PATH
環境變量中。
下載 TensorFlow 源代碼
使用 Git 克隆 TensorFlow 代碼庫
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
代碼庫默認爲 master
開發分支。我們也可以檢出要編譯的版本分支
git checkout branch_name # r1.9, r1.10, etc.
配置編譯系統
通過在 TensorFlow 源代碼樹的根目錄下運行以下命令來配置編譯系統:
./configure
此腳本會提示我們指定 TensorFlow 依賴項的位置,並要求指定其他編譯配置選項(例如,編譯器標記)。以下代碼展示了 ./configure
的示例運行會話(會話可能會有所不同):
編譯 pip 軟件包
使用 bazel
構建支持 CPU 的 TensorFlow 軟件包編譯器:
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
命令解析:
1)從源代碼編譯 TensorFlow 可能會消耗大量內存。如果系統內存有限,請使用以下命令限制 Bazel 的內存消耗量:--local_ram_resources=2048;
這裏限制爲2GB的內存去編譯。
2)官方 TensorFlow 軟件包是使用 GCC 4 編譯的,並使用舊版 ABI。對於 GCC 5 及更高版本,爲了使編譯系統與舊版 ABI 兼容,請使用 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
。
編譯軟件包
bazel build
命令會創建一個名爲 build_pip_package
的可執行文件,此文件是用於編譯 pip
軟件包的程序。請如下所示地運行該可執行文件,以在 /tmp/tensorflow_pkg
目錄中編譯 .whl
軟件包。
要從某個版本分支編譯,請使用以下目錄:
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
要從 master 編譯,請使用 --nightly_flag
獲取正確的依賴項:
./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg
儘管可以在同一個源代碼樹下編譯 CUDA 和非 CUDA 配置,但建議在同一個源代碼樹中的這兩種配置之間切換時運行 bazel clean
。
安裝軟件包
生成的 .whl
文件的文件名取決於 TensorFlow 版本和我們的平臺。例如,使用 pip install
安裝軟件包:
pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl
如果看到提示:TensorFlow 現已安裝完畢;那恭喜呀。
macOS 系統
目錄
安裝 Python 和 TensorFlow 軟件包依賴項
注意:需要 Xcode 9.2 或更高版本。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
brew install python@2 # or python (Python 3)
安裝 TensorFlow pip 軟件包依賴項(如果使用虛擬環境,請省略 --user
參數):
pip install -U --user pip six numpy wheel setuptools mock future>=0.17.1
pip install -U --user keras_applications==1.0.6 --no-deps
pip install -U --user keras_preprocessing==1.0.5 --no-deps
這些依賴項列在 setup.py
文件中的 REQUIRED_PACKAGES
下。
安裝 Bazel
安裝 Bazel,它是用於編譯 TensorFlow 的編譯工具。將 Bazel 可執行文件的位置添加到 PATH
環境變量中。
下載 TensorFlow 源代碼
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
代碼庫默認爲 master
開發分支。也可以檢出要編譯的版本分支:
git checkout branch_name # r1.9, r1.10, etc.
配置編譯系統
通過在 TensorFlow 源代碼樹的根目錄下運行以下命令來配置編譯系統:
./configure
此腳本會提示我們指定 TensorFlow 依賴項的位置,並要求指定其他編譯配置選項(例如,編譯器標記)。以下代碼展示了 ./configure
的示例運行會話(會話可能會有所不同):
編譯 pip 軟件包
使用 bazel
構建支持 CPU 的 TensorFlow 軟件包編譯器:
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
命令解析:
1)從源代碼編譯 TensorFlow 可能會消耗大量內存。如果系統內存有限,請使用以下命令限制 Bazel 的內存消耗量:--local_ram_resources=2048
。這裏限制爲2GB的內存去編譯。
2)官方 TensorFlow 軟件包是使用 GCC 4 編譯的,並使用舊版 ABI。對於 GCC 5 及更高版本,爲了使編譯系統與舊版 ABI 兼容,請使用 --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0"
。兼容 ABI 可確保針對官方 TensorFlow pip 軟件包編譯的自定義操作繼續支持使用 GCC 5 編譯的軟件包。
編譯軟件包
bazel build
命令會創建一個名爲 build_pip_package
的可執行文件,此文件是用於編譯 pip
軟件包的程序。請如下所示地運行該可執行文件,以在 /tmp/tensorflow_pkg
目錄中編譯 .whl
軟件包。
要從某個版本分支編譯,請使用以下目錄:
./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
要從 master 編譯,請使用 --nightly_flag
獲取正確的依賴項:
./bazel-bin/tensorflow/tools/pip_package/build_pip_package --nightly_flag /tmp/tensorflow_pkg
安裝軟件包
生成的 .whl
文件的文件名取決於 TensorFlow 版本和您的平臺。例如,使用 pip install
安裝軟件包:
pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl
如果看到提示:TensorFlow 現已安裝完畢;那恭喜呀。
好了,願你順順利利安裝,愉快使用TensorFlow,專心高效打代碼。如果有錯誤的地方,歡迎支持。
希望對你有幫助。
補充
Ubuntu Linux 和 macOS 經過測試的構建配置(tensorflow 版本、Python 版本、編譯器、編譯工具)如下:
Linux(CPU版)
macOS(CPU版)