CPU .......TensorFlow binary was not compiled to use: AVX AVX2

有時候我們在使用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 軟件包依賴項

下載 TensorFlow 源代碼 

配置編譯系統

編譯 pip 軟件包 

編譯軟件包

安裝軟件包


安裝 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 軟件包依賴項

安裝 Bazel

下載 TensorFlow 源代碼

配置編譯系統

編譯 pip 軟件包

編譯軟件包

安裝軟件包


安裝 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版)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章