從所周知,所有的深度學習框架使用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_THREADS
和OPENBLAS_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中解決這個問題。