Caffe:CPU模式下使用openblas-openmp(多線程版本)

從所周知,所有的深度學習框架使用GPU運行是最快的,但是在不具備Nvidia顯卡的環境下只使用CPU來運行,慢就慢點吧,對於學習階段還是夠用的。

Caffe用到的Blas可以選擇Altas,OpenBlas,Intel MKL,Blas承擔了大量了數學工作,所以在Caffe中Blas對性能的影響很大。 
MKL要收費,Altas略顯慢(在我的電腦上運行Caffe自帶的example/mnist/lenet_solver.prototxt,大概需要45分鐘。。。) 
根據網上資料的介紹使用OpenBlas要快一些,於是嘗試安裝使用OpenBlas來加速訓練過程。

我用的系統是CentOS6.5 64位,雙至強處理器(24核),CPU是夠強悍的,只是沒有Nivdia顯卡

安裝OpenBlas的過程有兩個辦法,最簡單的就是安裝yum源提供的編譯好的二進制版本。另一個是自己下載源碼去編譯。現在先講最簡單的yum安裝

yum 安裝

執行

sudo yum install openblas-devel

安裝瞭如下軟件

openblas.x86_64 0.2.18-5.el6 @epel 
openblas-devel.x86_64 0.2.18-5.el6 @epel 
openblas-openmp.x86_64 0.2.18-5.el6 @epel 
openblas-threads.x86_64 0.2.18-5.el6 @epel

OpenBlas這就算安裝好了,簡單吧? 
然後,如下編譯Caffe,

#!/bin/sh
# 執行cmake生成Makefile
mkdir build && cd build
cmake -DBLAS=Open -DCPU_ONLY=ON -DBUILD_python=OFF -DBUILD_python_layer=OFF -DBoost_INCLUDE_DIR=/usr/include/boost148 -DBoost_LIBRARY_DIR=/usr/lib64/boost148 ..
# 開始編譯 24線程
make install -j 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

-DBLAS=Open用於指定BLAS使用OpenBlas,也可以用cmake-gui修改,如下圖

這裏寫圖片描述

關於CentOS6.5下編譯Caffe的過程參見我的另一篇博客《CentOS6.5編譯Caffe過程記錄(系統存在多個編譯器)》

編譯好後,執行ldd查看caffe的依賴庫,指向了/usr/lib64/libopenblas.so.0 
這裏寫圖片描述

mnist測試

再執行mnist訓練,大概耗時13分鐘,比用altas速度快了3倍多。

./build/tools/caffe train –solver=examples/mnist/lenet_solver.prototxt

但運行時我也發現,雖然電腦有24核,實際只用到一個核,也就是說Caffe在運行時基本上是單線程工作的。。。

請注意前面安裝OpenBlas的軟件列表,有一項是openblas-openmp,看到這裏我似乎明白了什麼。到網上一查,果然openblas-openmp是OpenBlas的多線程優化版本。

在/usr/lib64下不僅有libopenblas.so.0(單線程版本),還有一個libopenblasp.so.0,這個就是前面軟件列表中的openblas-openmp的so文件(多線程版本), 
這裏寫圖片描述

於是用cmake-gui打開build目錄如下圖將OpenBLAS_LIB改爲多線程版本,再點”Generate”按鈕重新重新Makefile。 
這裏寫圖片描述 
重新執行make編譯Caffe後再執行ldd,顯示已經依賴/usr/lib64/libopenblasp.so.0 
這裏寫圖片描述 
再執行mnist訓練,CPU立即被佔滿了 
這裏寫圖片描述 
但耗時20分鐘,卻更慢了,爲什麼?現在也沒搞明白。 
於是修改OMP_NUM_THREADS或(OPENBLAS_NUM_THREADS)參數減少OpenBlas的線程數再試

export OMP_NUM_THREADS=4 && ./build/tools/caffe train –solver=examples/mnist/lenet_solver.prototxt

關於OMP_NUM_THREADSOPENBLAS_NUM_THREADS的詳細用法說明參見《OpenBlas github網站》

訓練時間減少到10分鐘,CPU跑滿4核 
這裏寫圖片描述

編譯安裝OpenBlas

https://github.com/xianyi/OpenBLAS/tree/v0.2.18下載0.2.18版本,解壓縮後開始編譯安裝。編譯時使用USE_OPENMP=1選項

#!/bin/sh
unzip OpenBLAS-0.2.18.zip
cd OpenBLAS-0.2.18
make USE_OPENMP=1
sudo make install
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

關於OpenBLAS更詳細的安裝說明參見《OpenBLAS編譯和安裝簡介》 
默認安裝到/opt/OpenBLAS下,cmake生成Caffe的Makefile時會自動找到,剩下的步驟就和前面一樣了。

最後的問題:

用OpenBlas時,OPENBLAS_NUM_THREADS設置爲最大,讓CPU負載跑滿,並不能大幅提高速度,這是爲什麼?一直沒搞明白。 
看到Caffe上有人提交了《Parallel version of caffe for CPU based on OpenMP》,據說在CPU模式下有高達10倍的但似乎爲了減少代碼維護的複雜性,Caffe官方並沒有接受這個PR。根據Caffe的作者Yangqing Jia的回覆,應該會在Caffe2中解決這個問題。

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