ensorflow和Caffe是機器學習初學者常用的2種深度學習框架。相對于Tensorflow有簡單的python pip一鍵安裝包,Caffe的安裝更考驗開發者的計算機編譯水平,需要自己下載源碼編譯。盡管caffe的配置教程網上很多,但是網上caffe的各個分支版本也很多,所以初學者在編譯時總是會碰到各種奇怪的問題。本文會針對初學者常用的Windows* + Intel CPU的平臺上安裝配置Caffe做一個較為完整的總結。
Caffe的各個版本簡介
官方版本:伯克利BVLC(Berkeley Vision And Learning Center) 版
https://github.com/BVLC/caffe
這個是Caffe的主版本,由伯克利大學維護。其他所有的Caffe版本都是由這個版本分支出去的。這個版本Caffe可以編譯出Linux和Windows*版本,支持Nvidia的CUDA加速,但是對CPU的優化不好,而且有關安裝和配置的文檔很少。從這個版本編譯Caffe,需要很強的自我學習和解決問題能力。
微軟的Windows*版本
https://github.com/Microsoft/caffe
微軟自己維護的一個版本。這個版本簡化了Caffe在Windows*下的步驟,自帶了一個VS的Solution項目。這個版本同樣支持基于CPU和CUDA的算法實現。
Intel Caffe優化版
https://github.com/intel/caffe
Intel維護的版本,這個版本優化了Intel CPU的實現算法,同時提供對Intel Xeon CPU多核和多節點的支持。這個版本里有些算法庫對Windows*支持不太好,所以這個分支編譯出的Caffe主要還是運行在Linux的服務器平臺上做訓練工作。
Intel clCaffe 核顯OpenCL優化版
https://github.com/01org/caffe
Intel維護的另一個版本,相對于官網BVLC Caffe上的OpenCL分支,優化了基于Intel 核顯GPU的OpenCL加速算法。這個版本同時支持Windows* 和Linux平臺,適合在有Intel核顯的CPU上做一些推理(Inference)場景的工作。
BVLC caffe的編譯
安裝編譯所需要的軟件
配置Windows*的環境變量
為了避免等會CMAKE生成編譯腳本的時候找不到一些依賴關系,有的沒的路徑都加一些,包括Cmake, Git, Ananconda以及Python的路徑。
Checkout 官網Caffe的代碼
運行以下代碼,用git從官網caffe上下載Windows*分支。
git clone https://github.com/BVLC/caffe.git cd caffe git checkout windows
修改caffe源碼代碼里的一些編譯參數
if !PYTHON_VERSION! EQU 2 ( set CONDA_ROOT=C:\Miniconda-x64 ) :: Set python 3.5 with conda as the default python if !PYTHON_VERSION! EQU 3 ( set CONDA_ROOT=C:\Miniconda35-x64 ) set PATH=!CONDA_ROOT!;!CONDA_ROOT!\Scripts;!CONDA_ROOT!\Library\bin;!PATH!
然后根據Windows*環境設置下圖中紅色方框的部分
1. 編譯器是VS2015,設置MSVC_VERSION=14
2. 不需要NINJA來編譯,設置WITH_NINJA=0
3. 沒有NVDIA GPU,設置CPU_ONLY=1
4. Python版本為3.X,設置PYTHON_VERSION=3
5. 需要pyCaffe支持,設置BUILD_PYTHON=1
如果希望使用自己編譯VS2015加python3.6的caffe-builder,除了要加入上段說到的2行修改外,還需要注釋掉下圖中WindowsDownloadPrebuiltDependencies.cmake的下圖所示的綠色部分,這部分代碼是負責從網上下載依賴包并且解壓縮到本地目錄的。同時要把caffe-builder編譯出的libraries目錄拷貝到C:\Users\[user name]\.caffe\dependencies這個目錄下。(具體caffe-builder的編譯,將在本文第3節詳細介紹)
開始編譯
在caffe的目錄下輸入scripts\build_win.cmd
開始編譯,一切順利的話,大約10分鐘后就編譯好了
驗證一下編譯的結果
接下來運行一下caffe項目自帶的examples里的00-classification的代碼來驗證一下caffe是否能夠正常運行
打開anaconda的命令行,進入caffe的examples目錄,運行jupyter notebook
在打開的notebook中打開caffe自帶的例子 00-calssification.ipynb
這是用一個訓練好的Caffe模型來預測動物圖片的例子,圖片默認是使用Caffe項目里examples\image\cat.jpg。
一路Shift+Enter運行下去,看到第8步predicted輸出
predicted class is: 281
第9步輸出
output label: n02123045 tabby, tabby cat
預測結果是貓,說明caffe已經正確編譯而且能運行了。
大功告成,開始你的Caffe學習之旅吧
Caffe依賴庫Caffe Builder的編譯
主要介紹怎么編譯Caffe-Builder項目
安裝編譯所需要的軟件
編譯軟件的需求同2.1部分
配置Windows*的環境變量
環境變量的配置同2.2部分
下載Caffe-Builder源碼
Caffe-Builder的開源項目位于 https://github.com/willyd/caffe-builder
目前最新的release為1.1版,可以從這里下載最新的release 1.1.0版的源碼
https://github.com/willyd/caffe-builder/releases
修改caffe-builder源碼代碼里的一些編譯參數
修改主要基于2個方面:
首先在Windows*下Ninja編譯系統不容易配置好,所以這里選擇了Visual Studio 2015作為編譯器。修改build_v140_x64.cmd,將紅色部分的’Ninja’改為’Visual Studio 14 2015 Win64’
其次是這個Release 1.1.0發布有點時間了,caffe-builder很多依賴的開源項目都搬家或者版本更新了,需要做相應的修改。
1) 修改packages\protobuf\CmakeLists.txt
將圖中所示部分protobuf包的Hash值從原來的
14a532a7538551d5def317bfca41dace
修改為
39d6a4fa549c0cce164aa3064b1492dc
2) 修改packages\hdf5\CmakeLists.txt
將圖中所示部分的URL從https://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.16/src/CMkae-hdf5-1.8.16.zip 修改為 https://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.16/src/CMkae-hdf5-1.8.16.zip
編譯
進到caffe-builder-1.1.0目錄下,運行build_v140_x64.cmd開始編譯
屏幕輸出
最終編譯生產的caffe依賴庫文件放在build\libraries目錄下,你可以將這個libraries目錄拷貝到caffe所需要的目錄下。
小結
主要介紹了官方BVLC Caffe在Windows*下的編譯設置過程。BVLC Caffe提供CPU和Nvidia GPU版本的實現,但是在實際學習工作中,初級開發者的電腦平臺通常不會裝備昂貴的Nvidia顯卡,而CPU版本的Caffe因為執行效率不高,只能用來做一些小型的”玩具”實驗項目。
最近因工作原因需要編譯caffe框架,因此又重新撿起來搞一遍,結果發現編譯過程中有不少爛坑,發出來跟大伙共享一下。
先說PC環境:
ubuntu 18.04 LTS
2080Ti x 4 + i9 10990
OpenCV 4.2.0 (從源碼自行編譯)
anaconda3 (可用可不用)
caffe (github上最新版本)
caffe編譯方式一:不使用anaconda3
首先,關閉.bashrc中所有與anaconda有關的環境變量選項,不讓anaconda參與編譯,并把caffe源碼目錄下的Makefile.config.example改為Makefile.config,然后打開并編輯:
改動不大,把cuda選項打開即可。 caffe編譯默認帶opencv,如果不是特殊需要,不用指定opencv的版本(此處我們用自己編譯安裝的4.2.0版本,而不是opencv3)。python用的是系統自帶的2.7版本,如果沒有安裝numpy的話,記著sudo apt install python-numpy。其它的一些依賴的庫都可以通過apt install 去安裝,比如glog,gflags,lmdb等等,此處略去不表。
接下來執行cmake ../ 和 make -j,第一個編譯錯誤來了,cmake會報告說CUDA_cublas_device_LIBRARY 這個符號找不到。 明明cuda工作正常,別的訓練都能跑的妥妥的,為啥這里就不行? 答案來了,你的cmake版本太低。caffe官方推薦3.12及以上版本。
https://github.com/BVLC/caffe/issues/6665
此時你只能卸載然后從cmake官網下載所需要的版本。
這個問題解決完后,繼續編譯,會遇到 CV_LOAD_IMAGE_COLOR 符號找不到的bug,這是因為opencv的版本導致的,caffe已經很久不更新了,當年它是配合著opencv3編寫的,opencv升級到4.x時代后,部分符號有變化,不過還好,要改的地方不多,涉及三個文件5處代碼:
modified: src/caffe/layers/window_data_layer.cpp
modified: src/caffe/test/test_io.cpp
modified: src/caffe/util/io.cpp
caffe編譯方式二:使用anaconda3
首先,啟用anaconda,即在.bashrc中啟用相關環境變量。然后配置Makefile.config,跟上面一樣,打開cuda,然后配置python對應的參數:
另外,需要注意的是,caffe目錄下還有一個CMakelist文件,注意,里面關于python版本的,默認是2,此處要改為3,因為我的anaconda里面,python版本是3.7。如果不改,編譯的時候,caffe還是會用老的那一套python2的環境變量。
提醒,此處檢查一下protobuf的版本(protoc --version),caffe需要3.6.1版本的protobuf,否則一樣是報錯。
此時,大的問題解決的差不多了,但是最后的鏈接階段,系統會提示libopencv_imgproc無法識別很多TIFF相關的函數。這個就有點奇怪了,我編譯opencv的時候是開了tiff=on的,檢查系統,系統也apt install過tiff,此時,你可以ldd一下報錯的那個opencv的庫文件,搜一下里面tiff:
ldd /usr/local/lib/libopencv_imgcodecs.so.4.2.0 |grep tiff
此處的tiff版本是5。然后再執行一下conda list | grep tiff,你會發現conda里用的是tiff 4.1,也就是說,編譯opencv4的時候,我們用了tiff5的庫文件,但是編譯caffe的時候,系統錯誤的把opencv的庫去鏈接了conda里的tiff4.1的動態庫,因版本不同,因此會有接口函數找不到。
處理方式也比較簡單粗暴,直接卸載conda里的tiff即可。
至此,caffe的編譯算是告一段落。