在使用 Tensorflow 時,一直有一個奇怪的警告: 您的 中央處理器 支持 說明 那 這個 TensorFlow 二進制 是 不 編譯 至 使用: AVX2 FMA ,雖然不影響使用,但看著很煩,你可以用這個命令關閉它: 該.關於[“TF_CPP_MIN_LOG_LEVEL”] = '2' 。
不過,你有註意到嗎? “ 可以 速度 向上 中央處理器 計算”……嗯?!
背景
總之,根據官方所述,Tensorflow 默認不支持這些高級功能是為了增強 Tensorflow 框架的兼容性,讓它能夠盡可能地在更多平台使用,從而避免不必要的編譯操作。但這樣的代價就是只能使用各個 CPU 平台都有的指令集,而高級命令就不能添加,畢竟不同的 CPU 平台它們有不同的高級指令集技術。
由於我使用 macOS,GPU 是 AMD,所以使用 Tensorflow 就別想用 GPU 進行加速了,用 CPU 又很慢,就只能跑測試數據(體積小),但我還是希望它能快一點。
所以 Tensorflow 提示我,針對我的 CPU 來說,有更高級的功能可以開啟以加速訓練——但怎麼開啟呢?答案肯定是用源碼重新編譯 Tensorflow。
AVX2 和 FMA
FMA 是現代 CPU 支持的一種高級指令集,中文叫“積和熔加運算”;
AVX 是現代 CPU 支持的“高級向量擴展指令集“,顯然,這個 AVX2 的意思就是 AVX 進階版的意思,它引入了上文的 FMA 運算,並將浮點性能提升 2 倍。
總之,如果 Tensorflow 能夠直接使用這些高級功能,那訓練速度一定能快上不少,接下來,我們就試試從頭開始編譯一個 Tensorflow。
準備工作
蟒蛇
顯然,我們要用 Python 來使用 Tensorflow,所以你需要有 Python 環境:
1 2 3 |
/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 |
這裡我們使用 Brew 安裝 Python3.
接下來是安裝必要的依賴包:
1 2 3 |
pip3 install -U --user pip six numpy wheel setuptools mock 'future>=0.17.1' pip3 install -U --user keras_applications --no-deps pip3 install -U --user keras_preprocessing --no-deps |
如果你使用 pip 有問題,不妨參考一下我的這一篇文章:正確使用 PIP 安裝 Python 包 避免 TypeError: ‘模’ 對象是不可調用
源碼
要從源碼編譯 Tensorflow,就肯定要下載它的源碼,找到一個你喜歡的目錄位置,執行列命令獲取 Tensorflow 項目源碼: 混帳 克隆 HTTPS://github.com/tensorflow/tensorflow.git ,進入目錄 光盤 tensorflow ,我們要切換到穩定版分枝,首先到https://github.com/tensorflow/tensorflow/releases查找最新的穩定版標籤,就本文撰寫之時,穩定版標籤是 V2.1.0 ,這裡我們切換到穩定版: 混帳 查看 V2.1.0 .
巴塞爾
Tensorflow 是要使用 Bazel 來編譯的,整體編譯過程輕鬆簡單,但安裝 Bazel 卻需要一點點小技巧。
首先,檢查你的 Tensorflow 源代碼文件 tensorflow/配置.PY ,在其中大概 53 行的位置,有一行 _TF_MAX_BAZEL_VERSION = “0.29.1” ,這就是我們要用的 Bazel 版本。
請注意:Bazel 最新版是 2.0,直接使用 brew 安裝 bazel 是無法編譯 Tensorflow 的。
首先要確保你的 macOS 安裝了最新版的 Xcode,然後執行命令: 須藤 xcodebuild聯編 -執照 接受 ,然後到https://github.com/bazelbuild/bazel/releases下載 Bazel 安裝包,注意文件名應該是這樣的: 巴塞爾-0.29.1-installer-達爾文-x86_64的.sh 。
點擊上文文件名鏈接直接下載指定版本的 bazel 安裝包,將來 Tensorflow 源代碼編譯要求可能會變,到時候讀者請自行對應 bazel 版本號。
由於 macOS 10.15 加強了系統安全措施,所以如果你直接執行腳本, bazel 是無法完成安裝的,會提示類似“bazel 是有未知開發者發布,可能有害”之類的警告,從而拒絕運行。
使用命令: 須藤 SPCTL --主-禁用 暫時關閉這個警告,允許運行任意開發者的程序。
關閉警告後,就可以安裝和使用 Bazel 了: sh 巴塞爾-0.29.1-installer-達爾文-x86_64的.sh --用戶 ,安裝完成後使用 巴塞爾 --版 查看,結果應該是: 巴塞爾 0.29.1
編譯 Tensorflow
最終,我們可以進行編譯了,回到 tensorflow 目錄,執行 ./配置 進行配置,它會詢問你 Python 及其庫的位置,如果你不是用 brew 安裝的,那麼可以用如下命令找到你 Python 的位置:
1 2 3 |
$ where python3 /usr/local/bin/python3 /usr/bin/python3 |
如果有多個結果,就選第一個即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
$ ./configure WARNING: --batch mode is deprecated. Please instead explicitly shut down your Bazel server using the command "bazel shutdown". You have bazel 0.29.1 installed. Please specify the location of python. [Default is /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python]: /usr/local/bin/python3 Found possible Python library paths: /usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages Please input the desired Python library path to use. Default is [/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages] Do you wish to build TensorFlow with XLA JIT support? [Y/n]: n No XLA JIT support will be enabled for TensorFlow. Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: n No OpenCL SYCL support will be enabled for TensorFlow. Do you wish to build TensorFlow with ROCm support? [y/N]: n No ROCm support will be enabled for TensorFlow. Do you wish to build TensorFlow with CUDA support? [y/N]: n No CUDA support will be enabled for TensorFlow. Do you wish to download a fresh release of clang? (Experimental) [y/N]: n Clang will not be downloaded. Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native -Wno-sign-compare]: Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: n Not configuring the WORKSPACE for Android builds. Do you wish to build TensorFlow with iOS support? [y/N]: y iOS support will be enabled for TensorFlow. Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details. --config=mkl # Build with MKL support. --config=monolithic # Config for mostly static monolithic build. --config=ngraph # Build with Intel nGraph support. --config=numa # Build with NUMA support. --config=dynamic_kernels # (Experimental) Build kernels into separate shared objects. --config=v2 # Build TensorFlow 2.x instead of 1.x. Preconfigured Bazel build configs to DISABLE default on features: --config=noaws # Disable AWS S3 filesystem support. --config=nogcp # Disable GCP support. --config=nohdfs # Disable HDFS support. --config=nonccl # Disable NVIDIA NCCL support. Configuration finished |
接下來的參數配置幾乎無需設定,全部默認即可,我們不需要 GPU 支持(添加了也沒用),不過最後有個 iOS 支持,這裡我選擇了 y,全部通過後,配置完成,就可以進行編譯了。
使用命令 巴塞爾 建立 --配置=選擇 //tensorflow /工具/ pip_package:build_pip_package 編譯 Tensorflow 安裝包,默認編譯命令就是針對本地 CPU 進行編譯,也就是啟用所有當前 CPU 支持的指令集,這樣編譯出來的 Tensorflow 就是加速的啦!
編譯過程很慢,在我 16G 內存 2.5 GHz四核Intel Core i7處理器下要 36301 秒能完成,整整 10 小時(給錯了參數,10小時完全浪費了)要54219.95秒才能完成,整整15個小時(15 年中款 15寸rmbp)!
1 2 3 |
INFO: Elapsed time: 54219.950s, Critical Path: 1802.92s INFO: 22004 processes: 22004 local. INFO: Build completed successfully, 22776 total actions |
另,我在編譯時看到了這個警告:
1 |
external/eigen_archive/unsupported/Eigen/CXX11/../../../Eigen/src/Core/util/ConfigureVectorization.h:300:10: warning: "Disabling AVX support: clang compiler shipped with XCode 11.[012] generates broken assembly with -macosx-version-min=10.15 and AVX enabled. " [-W#warnings] |
我還以為無法支持 AVX 要再來一遍呢……但似乎並不影響最終效果。
生成安裝包
使用命令 ./巴塞爾-箱子/tensorflow/工具/pip_package/build_pip_package /tmp/tensorflow_pkg 來生成 .WHL 安裝包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ ./bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg Sat Jan 18 03:59:17 AEST 2020 : === Preparing sources in dir: /var/folders/dn/p_qzcyss2m3gdnkkyl_bw_d00000gn/T/tmp.XXXXXXXXXX.MxFJDO4r ~/Downloads/tensorflow ~/Downloads/tensorflow ~/Downloads/tensorflow /var/folders/dn/p_qzcyss2m3gdnkkyl_bw_d00000gn/T/tmp.XXXXXXXXXX.MxFJDO4r/tensorflow/include ~/Downloads/tensorflow ~/Downloads/tensorflow Sat Jan 18 03:59:32 AEST 2020 : === Building wheel warning: no files found matching 'README' warning: no files found matching '*.pyd' under directory '*' warning: no files found matching '*.pd' under directory '*' warning: no files found matching '*.so.[0-9]' under directory '*' warning: no files found matching '*.dll' under directory '*' warning: no files found matching '*.lib' under directory '*' warning: no files found matching '*.csv' under directory '*' warning: no files found matching '*.h' under directory 'tensorflow_core/include/tensorflow' warning: no files found matching '*' under directory 'tensorflow_core/include/third_party' Sat Jan 18 04:00:00 AEST 2020 : === Output wheel file is in: /tmp/tensorflow_pkg |
然後我們用 pip 安裝它: 果仁 安裝 /tmp/tensorflow_pkg/tensorflow-2.1.0-CP37-cp37m-macosx_10_15_x86_64.WHL
最後,可別忘了開啟之前關閉了的安全警告: 須藤 SPCTL --主-啟用
測試安裝結果
1 2 3 4 5 6 7 8 |
$ python3 Python 3.7.6 (default, Dec 30 2019, 19:38:26) [Clang 11.0.0 (clang-1100.0.33.16)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow as tf >>> t = tf.constant('logcg') 2020-01-18 20:04:43.088104: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fefdc983db0 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2020-01-18 20:04:43.088134: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version |
現在已經不再提示 您的 中央處理器 支持 說明 那 這個 TensorFlow 二進制 是 不 編譯 至 使用: AVX2 FMA了,嘗試跑個模型,終於達到了可以忍耐的時長。
:)
參考文獻
本文由 落格博客 原創撰寫:落格博客 » 在 macOS 上編譯 Tensorflow 以開啟 AVX2 和 FMA
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3283.html