Intel 的 MKL是能夠用來訓練的——官方的實驗也提到了訓練

TensorFlow如何充分使用全部CPU核數,提升TensorFlow的CPU使用率,以及Intel的MKL加速

轉載 2017年09月07日 16:34:58
 
轉載連接:http://nooverfit.com/wp/tensorflow%E5%A6%82%E4%BD%95%E5%85%85%E5%88%86%E4%BD%BF%E7%94%A8%E6%89%80%E6%9C%89cpu%E6%A0%B8%E6%95%B0%EF%BC%8C%E6%8F%90%E9%AB%98tensorflow%E7%9A%84cpu%E4%BD%BF%E7%94%A8%E7%8E%87%EF%BC%8C%E4%BB%A5/

TensorFlow如何充分使用全部CPU核數,提升TensorFlow的CPU使用率,以及Intel的MKL加速

許多朋友使用服務器時,碰巧服務器沒有安裝GPU或者GPU都被佔滿了。但是,服務器有不少CPU都是空閒的,其實,把這些CPU都充分利用起來,也能夠有不錯的訓練效果。node

可是,若是你是用CPU版的TF,有時TensorFlow並不能把全部CPU核數使用到,這時有個小技巧David 9要告訴你們:git

  1. with tf.Session(config=tf.ConfigProto(
  2. device_count={"CPU":12},
  3. inter_op_parallelism_threads=1,
  4. intra_op_parallelism_threads=1,
  5. gpu_options=gpu_options,
  6. )) as sess:

在Session定義時,ConfigProto中能夠嘗試指定下面三個參數:github

  1. device_count, 告訴tf Session使用CPU數量上限,若是你的CPU數量較多,能夠適當加大這個值
  2. inter_op_parallelism_threads和intra_op_parallelism_threads告訴session操做的線程並行程度,若是值越小,線程的複用就越少,越可能使用較多的CPU核數。若是值爲0,TF會自動選擇一個合適的值。

David 9親自試驗,訓練彷佛有1倍速度的提升。算法

另外,有的朋友的服務器上正好都是Intel的CPU,極可能須要把Intel的MKL包編譯進TensorFlow中,以增長訓練效率。這裏David 9把MKL編譯進TF的關鍵點也指出一下。編程

官方的指導是以下3 步緩存

  1. Run 「./configure」 from the TensorFlow source directory, and it will download latest Intel MKL for machine learning automatically in tensorflow/third_party/mkl/mklml if you select the options to use Intel MKL
  2. Execute the following commands to create a pip package that can be used to install the optimized TensorFlow build.
    • PATH can be changed to point to a specific version of GCC compiler:
      export PATH=/PATH/gcc/bin:$PATH
    • LD_LIBRARY_PATH can also be changed to point to new GLIBC :
      1. export LD_LIBRARY_PATH=/PATH/gcc/lib64:$LD_LIBRARY_PATH.
    • Build for best performance on Intel Xeon and Intel Xeon Phi processors:
      1. bazel build --config=mkl --copt="-DEIGEN_USE_VML" -c opt //tensorflow/tools/pip_package:
      2. build_pip_package

3. Install the optimized TensorFlow wheel性能優化

  1. bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/path_to_save_wheel
  2. pip install --upgrade --user ~/path_to_save_wheel /wheel_name.whl

與官網編譯TF的大體流程相似,就是先./configure,再用bazel編譯TensorFlow。服務器

最後用編譯好的bazel工具生成whl的包,用來安裝pip TensorFlow。網絡

惟一的不一樣要注意用–config=mkl的選項編譯TensorFlow:session

bazel build –config=mkl –copt=」-DEIGEN_USE_VML」 -c opt //tensorflow/tools/pip_package: build_pip_package

這樣,用pip安裝完成TF後,mkl就集成在TF中了。

 

參考文獻:

  1. https://software.intel.com/es-es/articles/tensorflow-optimizations-on-modern-intel-architecture
  2. https://richardstechnotes.wordpress.com/2016/08/09/encouraging-tensorflow-to-use-more-cores/
  3. https://www.tensorflow.org/install/install_sources

現代英特爾® 架構上的 TensorFlow* 優化

英特爾:Elmoustapha Ould-Ahmed-Vall,Mahmoud Abuzaina,Md Faijul Amin,Jayaram Bobba,Roman S Dubtsov,Evarist M Fomenko,Mukesh Gangadhar,Niranjan Hasabnis,Jing Huang,Deepthi Karkada,Young Jin Kim,Srihari Makineni,Dmitri Mishura,Karthik Raman,AG Ramesh,Vivek V Rane,Michael Riera,Dmitry Sergeev,Vamsi Sripathi,Bhavani Subramanian,Lakshay Tokas,Antonio C Valles

谷歌:Andy Davis,Toby Boyd,Megan Kacholia,Rasmus Larsen,Rajat Monga,Thiru Palanisamy,Vijay Vasudevan,Yao Zhang

做爲一款領先的深度學習和機器學習框架,TensorFlow* 對英特爾和谷歌發揮英特爾硬件產品的最佳性能相當重要。本文 向人工智能 (AI) 社區介紹了在基於英特爾® 至強和英特爾® 至強融核™ 處理器的平臺上實施的 TensorFlow* 優化。在去年舉辦的首屆英特爾人工智能日上,英特爾公司的柏安娜和谷歌的 Diane Green 共同宣佈了雙方的合做,這些優化是英特爾和谷歌工程師密切合做取得的成果。

咱們介紹了在優化實踐中遇到的各類性能挑戰以及採用的解決方法,還報告了對通用神經網絡模型示例的性能改進。這些優化帶來了多個數量級的性能提高。例如,根據咱們的測量,英特爾® 至強融核™ 處理器 7250 (KNL) 上的訓練性能提高了高達 70 倍,推斷性能提高了高達 85 倍。基於英特爾® 至強® 處理器 E5 v4 (BDW) 和英特爾至強融核處理器 7250 的平臺爲下一代英特爾產品奠基了基礎。用戶尤爲但願今年晚些時候推出的英特爾至強(代號爲 Skylake)和英特爾至強融合(代號爲 Knights Mill)處理器將提供顯著的性能提高。

在現代 CPU 上優化深度學習模型的性能面臨衆多挑戰,和優化高性能計算 (HPC) 中其餘性能敏感型應用所面臨的挑戰差異不大:

  1. 須要重構代碼,以利用現代矢量指令。這意味着將全部關鍵基元(如卷積、矩陣乘法和批歸一化)被向量化爲最新 SIMD 指令(英特爾至強處理器爲 AVX2,英特爾至強融核處理器爲d AVX512)。
  2. 要想實現最佳性能,須要特別注意高效利用全部內核。這意味着在特定層或操做實施並行化以及跨層的並行化。
  3. 根據執行單元的須要,提供儘量多的數據。這意味着須要平衡使用預取、緩存限制技術和改進空間和時間局部性的數據格式。

爲了知足這些要求,英特爾開發了衆多優化型深度學習基元,計劃應用於不一樣的深度學習框架,以確保通用構建模塊的高效實施。除了矩陣乘法和卷積之外,建立模塊還包括:

  • 直接批量卷積
  • 內積
  • 池化:最大、最小、平均
  • 標準化:跨通道局部響應歸一化 (LRN),批歸一化
  • 激活:修正線性單元 (ReLU)
  • 數據操做:多維轉置(轉換)、拆分、合併、求和和縮放。

請參閱 本文,獲取關於面向深度神經網絡的英特爾® 數學核心函數(英特爾® MKL-DNN)的優化基元的更多詳情。

在 TensorFlow 中,咱們實施了英特爾優化版運算,以確保這些運算能在任何狀況下利用英特爾 MKL-DNN 基元。同時,這也是支持英特爾® 架構可擴展性能的必要步驟,咱們還須要實施大量其餘優化。特別是,由於性能緣由,英特爾 MKL 使用了不一樣於 TensorFlow 默認佈局的另外一種佈局。咱們須要最大限度地下降兩種格式的轉換開銷。咱們還想確保數據科學家和其餘 TensorFlow 用戶不須要改變現有的神經網絡模型,即可使用這些優化。

圖形優化

咱們推出了大量圖形優化通道,以:

  1. 在 CPU 上運行時,將默認的 TensorFlow 操做替換爲英特爾優化版本。確保用戶能運行現有的 Python 程序,在不改變神經網絡模型的狀況下提高性能。
  2. 消除沒必要要且昂貴的數據佈局轉換。
  3. 將多個運算融合在一塊兒,確保在 CPU 上高效地重複使用高速緩存。
  4. 處理支持快速向後傳播的中間狀態。

這些圖形優化進一步提高了性能,沒有爲 TensorFlow 編程人員帶來任何額外負擔。數據佈局優化是一項關鍵的性能優化。對於 CPU 上的某些張量運算而言,本地 TensorFlow 數據格式一般不是最高效的數據佈局。在這種狀況下,未來自 TensorFlow 本地格式的數據佈局轉換運算插入內部格式,在 CPU 上執行運算,並將運算輸出轉換回 TensorFlow 格式。可是,這些轉換形成了性能開銷,應盡力下降這些開銷。咱們的數據佈局優化發現了能利用英特爾 MKL 優化運算徹底執行的子圖,並消除了子圖運算中的轉換。自動插入的轉換節點在子圖邊界執行數據佈局轉換。融合通道是另外一個關鍵優化,它將多個運算自動融合爲高效運行的單個英特爾 MKL 運算。

其餘優化

咱們還調整衆多 TensorFlow 框架組件,以確保在各類深度學習模型上實現最高的 CPU 性能。咱們使用 TensorFlow 中現成的池分配器開發了一款自定義池分配器。咱們的自定義池分配器確保了 TensorFlow 和英特爾 MKL 共享相同的內存池(使用英特爾 MKL imalloc 功能),沒必要過早地將內存返回至操做系統,所以避免了昂貴的頁面缺失和頁面清除。此外,咱們還認真優化了多個線程庫(TensorFlow 使用的 pthread 和英特爾 MKL 使用的 OpenMP),使它們能共存,而不是互相爭奪 CPU 資源。

性能實驗

咱們的優化(如上述優化)在英特爾至強和英特爾至強融核平臺上實現了顯著的性能提高。爲了更好地展現性能改進,咱們提供瞭如下最佳方法(或 BKM)和 3 個通用 ConvNet 性能指標評測的基準和優化性能值。

  1. 如下參數對英特爾至強(代號爲 Broadwell)和英特爾至強融核(代號爲 Knights Landing)的性能很是重要,建議您針對特定的神經網絡模型和平臺優化這些參數。咱們認真優化了這些參數,力求在英特爾至強和英特爾至強融核處理器上得到 convnet 性能指標評測的最佳性能。
    1. 數據格式:建議用戶針對特定的神經網絡模型指定 NCHW 格式,以實現最佳性能。TensorFlow 默認的 NHWC 格式不是 CPU 上最高效的數據佈局,將帶來額外的轉換開銷。
    2. Inter-op / intra-op:建議數據科學家和用戶在 TensorFlow 中試驗 intra-op 和 inter-op 參數,爲每一個模型和 CPU 平臺搭配最佳設置。這些設置將影響某層或跨層的並行性。
    3. 批處理大小 (Batch size):批處理大小是影響可用並行性(以使用所有內核)、工做集大小和整體內存性能的另外一個重要參數。
    4. OMP_NUM_THREADS:最佳性能須要高效使用全部可用內核。因爲該設置控制超線程等級(1 到 4),所以,對英特爾至強融核處理器的性能尤其重要。
    5. 矩陣乘法中的轉置 (Transpose in Matrix multiplication):對於某些矩陣大小,轉置第二個輸入矩陣 b 有助於改進 Matmul 層的性能(改進高速緩存的重複使用)。如下 3 個模型所用的全部 Matmul 運算亦是如此。用戶應在其餘尺寸的矩陣中試驗該設置。
    6. KMP_BLOCKTIME:用戶應試驗各類設置,以肯定每一個線程完成並行區域執行後等待的時間,單位爲毫秒。

英特爾® 至強® 處理器(代號爲 Broadwell - 雙插槽 - 22 個內核)上的示例設置

英特爾® 至強融核™ 處理器(代號爲 Knights Landing - 68 個內核)上的示例設置

  1. 英特爾® 至強® 處理器(代號爲 Broadwell – 雙插槽 – 22 個內核)的性能結果

  2. 英特爾® 至強融核™ 處理器(代號爲 Knights Landing – 68 個內核)的性能結果

  3. 英特爾® 至強® 處理器(代號爲 Broadwell)和英特爾® 至強融核™ 處理器(代號爲 Knights Landing)上不一樣批處理尺寸的性能結果 - 訓練

利用 CPU 優化安裝 TensorFlow

按照「現已推出英特爾優化型 TensorFlow 系統」 中的指令安裝包含 pip 或 conda 的預構建二進制軟件包,或按照如下指令從源構建:

  1. 運行 TensorFlow 源目錄中的 "./configure",若是您選擇了使用英特爾 MKL 的選項,將自動下載 tensorflow/third_party/mkl/mklml 中的面向機器學習的最新版英特爾 MKL。
  2. 執行如下命令建立 pip 程序包,以安裝通過優化的 TensorFlow 建立。
    • 可更改 PATH,使其指向特定 GCC 編譯器版本:
      export PATH=/PATH/gcc/bin:$PATH
    • 也能夠更改 LD_LIBRARY_PATH,使其指向新 GLIBC:
      export LD_LIBRARY_PATH=/PATH/gcc/lib64:$LD_LIBRARY_PATH.
    • 專爲在英特爾至強和英特爾至強融核處理器上實現最佳性能而建立:
      bazel build --config=mkl --copt=」-DEIGEN_USE_VML」 -c opt //tensorflow/tools/pip_package:
      build_pip_package
  3. 安裝優化版 TensorFlow 系統
    1. bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/path_to_save_wheel
      pip install --upgrade --user ~/path_to_save_wheel /wheel_name.whl

系統配置

對人工智能意味着什麼

優化 TensorFlow 意味着高度可用、普遍應用的框架建立的深度學習應用如今能更快速地運行於英特爾處理器,以擴大靈活性、可訪問性和規模。例如,英特爾至強融核處理器能以近乎線性的方式跨內核和節點橫向擴展,可顯著減小訓練機器學習模型的時間。咱們不斷加強英特爾處理器的性能,以處理更大、更困難的人工智能工做負載,TensorFlow 也能隨着性能的進步而升級。

英特爾和谷歌共同優化 TensorFlow 的合做體現了雙方面向開發人員和數據科學家普及人工智能的不懈努力,力求在從邊緣到雲的全部設備上隨時運行人工智能應用。英特爾相信這是建立下一代人工智能算法和模型的關鍵,有助於解決最緊迫的業務、科學、工程、醫學和社會問題。

本次合做已經在基於英特爾至強和英特爾至強融核處理器的領先平臺上實現了顯著的性能提高。這些優化現已在谷歌的 TensorFlow GitHub 存儲庫中推出。咱們建議人工智能社區嘗試這些優化,並期待得到基於優化的反饋與貢獻。

相關文章
相關標籤/搜索