在 macOS 上編譯 Tensorflow 以開啟 AVX2 和 FMA

在使用 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 環境:

這裡我們使用 Brew 安裝 Python3.

接下來是安裝必要的依賴包:

如果你使用 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 的位置:

如果有多個結果,就選第一個即可。

接下來的參數配置幾乎無需設定,全部默認即可,我們不需要 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)!

另,我在編譯時看到了這個警告:

我還以為無法支持 AVX 要再來一遍呢……但似乎並不影響最終效果。

生成安裝包

使用命令 ./巴塞爾-箱子/tensorflow/工具/pip_package/build_pip_package /tmp/tensorflow_pkg 來生成 .WHL 安裝包:

然後我們用 pip 安裝它: 果仁 安裝 /tmp/tensorflow_pkg/tensorflow-2.1.0-CP37-cp37m-macosx_10_15_x86_64.WHL

最後,可別忘了開啟之前關閉了的安全警告: 須藤 SPCTL ---啟用

測試安裝結果

現在已經不再提示 您的 中央處理器 支持 說明 這個 TensorFlow 二進制 編譯 使用: AVX2 FMA了,嘗試跑個模型,終於達到了可以忍耐的時長。

:)

參考文獻

 

本文由 落格博客 原創撰寫:落格博客 » 在 macOS 上編譯 Tensorflow 以開啟 AVX2 和 FMA

轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3283.html

關於作者

R0uter

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

發表評論

您的電子郵件地址不會被公開. 必填字段標 *