新版的caffe 的bnll_layer.cu 文件進行了修改
主要是下面這句
__constant__ float kBNLL_THRESHOLD = 50.;
現在記錄一下CUDA中的常量內存__constant__
突然發現caffe 的源碼是學習與進階C++ 和CUDA編程最好的工具
用ninja 編譯雖然快,但是沒有visual studio 生成解決方案,可以給新手以更多學習的機會。
下面來說BLVC的 caffe 生成的目錄結構
先說這兩個,caffe 這個
--------編譯caffe 對於瞭解一些算法的發展確實是挺有好處的,一旦caffe 編譯成功,很多代碼都可以重複利用。一些層編譯其中的話。這個在win10 上直接複製二進制包就行,方便的很。對於快速復現一些代碼,會很有幫助。
終於功夫不負有心人,編譯成功了,之前就多次弄過caffe。這次終於是前前後後搞懂了caffe的編譯依賴關係,實現了最新版本的編譯。不過耽誤了很多時間。一次熟悉之後,後面再弄一些就很快了。
現在將一些要點記錄一下以免忘記。
首先caffe的版本很多。有官方的,有微軟的,有Intel的還有一些第三方維護的。
官方的caffe 是基底。目前支持最新的cuda 10.0 。這個還是比較良心的。對於想用最新顯卡(RTX 2080TI)的人來說或者想用最新版的偏執狂來說確實是非常不錯。
所以我們這次選擇官方的caffe 版本來進行操作。一步步的解析其中的要點和過程。
git clone https://github.com/BVLC/caffe.git
cd caffe
git checkout windows
假設CAFFE_ROOT 是項目的根目錄
我們發現scripts 文件夾下有build_win.cmd 文件,這個就是利用cmake 來配置這些C++ 的依賴庫的。
caffe編譯也就難在這些C++的依賴庫。感覺理順了CmakeLists 這個文件的關係,會比在Ubuntu下修改makefile 來的方便。
解析build_win.cmd
@echo off
@setlocal EnableDelayedExpansion
if DEFINED APPVEYOR #如果定義了自動化集成工具編譯
下面這個else 是要在我們自己電腦上編譯的選項。修改如下:
else (
:: Change the settings here to match your setup
:: Change MSVC_VERSION to 12 to use VS 2013
if NOT DEFINED MSVC_VERSION set MSVC_VERSION=15 # VC工具集vs 2017
:: Change to 1 to use Ninja generator (builds much faster)
if NOT DEFINED WITH_NINJA set WITH_NINJA=1 # 默認開啓多核編譯,msvc 編譯cuda 代碼的時候只能單核
:: Change to 1 to build caffe without CUDA support
if NOT DEFINED CPU_ONLY set CPU_ONLY=0 # 開啓CUDA支持
:: Change to generate CUDA code for one of the following GPU architectures
:: [Fermi Kepler Maxwell Pascal All]
if NOT DEFINED CUDA_ARCH_NAME set CUDA_ARCH_NAME=Auto
:: Change to Debug to build Debug. This is only relevant for the Ninja generator the Visual Studio generator will generate both Debug and Release configs
if NOT DEFINED CMAKE_CONFIG set CMAKE_CONFIG=Release
:: Set to 1 to use NCCL
if NOT DEFINED USE_NCCL set USE_NCCL=0
:: Change to 1 to build a caffe.dll
if NOT DEFINED CMAKE_BUILD_SHARED_LIBS set CMAKE_BUILD_SHARED_LIBS=1 # 編譯共享庫(dll)
:: Change to 3 if using python 3.5 (only 2.7 and 3.5 are supported)
if NOT DEFINED PYTHON_VERSION set PYTHON_VERSION=3
:: Change these options for your needs.
if NOT DEFINED BUILD_PYTHON set BUILD_PYTHON=1
if NOT DEFINED BUILD_PYTHON_LAYER set BUILD_PYTHON_LAYER=1
if NOT DEFINED BUILD_MATLAB set BUILD_MATLAB=0
:: If python is on your path leave this alone
if NOT DEFINED PYTHON_EXE set PYTHON_EXE=python
:: Run the tests
if NOT DEFINED RUN_TESTS set RUN_TESTS=0
:: Run lint
if NOT DEFINED RUN_LINT set RUN_LINT=0
:: Build the install target
if NOT DEFINED RUN_INSTALL set RUN_INSTALL=0
)
:: Set the appropriate CMake generator
:: Use the exclamation mark ! below to delay the
:: expansion of CMAKE_GENERATOR
if %WITH_NINJA% EQU 0 (
if "%MSVC_VERSION%"=="15" (
set CMAKE_GENERATOR=Visual Studio 15 2017 Win64 # 適配Vs 2017
)
if "%MSVC_VERSION%"=="12" (
set CMAKE_GENERATOR=Visual Studio 12 2013 Win64
)
if "!CMAKE_GENERATOR!"=="" (
echo ERROR: Unsupported MSVC version
exit /B 1
) else (
set CMAKE_GENERATOR=Ninja
)
說明:用ninja 和vs 2017 都試過了,ninja 速度確實驚人啊,尤其是編譯過程還需要調錯的階段。很省時間。
以後如果要魔改caffe的話,我們需要用ninja 編譯。現在配置好了,以後應該直接弄就行
修改如下:
調用vs 2017 命令行工具
set batch_file=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat
# 這裏是關鍵,本來都快要放棄了。由於我們要進行適配python 3.7 ,所以要定製化boost 。caffe的python接口就是由boost來實現的。我們這裏選擇的是Windows下的boost二進制包,默認安裝位置C:\local\boost_1_69_0
安裝之後效果:
所以修改下面的cmake 語句
cmake -G"!CMAKE_GENERATOR!" ^
-DBLAS=Open ^
-DCMAKE_BUILD_TYPE:STRING=%CMAKE_CONFIG% ^
-DBUILD_SHARED_LIBS:BOOL=%CMAKE_BUILD_SHARED_LIBS% ^
-DBUILD_python:BOOL=%BUILD_PYTHON% ^
-DBUILD_python_layer:BOOL=%BUILD_PYTHON_LAYER% ^
-DBUILD_matlab:BOOL=%BUILD_MATLAB% ^
-DCPU_ONLY:BOOL=%CPU_ONLY% ^
-DCOPY_PREREQUISITES:BOOL=1 ^
-DINSTALL_PREREQUISITES:BOOL=1 ^
-DUSE_NCCL:BOOL=!USE_NCCL! ^
-DCUDA_ARCH_NAME:STRING=%CUDA_ARCH_NAME% ^
-DBOOST_NO_BOOST_CMAKE=TRUE ^
-DBOOST_ROOT=C:/local/boost_1_69_0 ^
-DBOOST_LIBRARYDIR=C:/local/boost_1_69_0/lib64-msvc-14.1 ^
"%~dp0\.."
在執行的時候,會自動下載依賴文件到C:\Users\zhao\.caffe\dependencies 目錄下,然後解壓,
這個時候需要修改WindowsDownloadPrebuiltDependencies.cmake 文件,
set(DEPENDENCIES_NAME_1916_37 libraries_v141_x64_py37_${DEPENDENCIES_VERSION})
set(DEPENDENCIES_URL_1916_37 "${DEPENDENCIES_URL_BASE}/v${DEPENDENCIES_VERSION}/${DEPENDENCIES_NAME_1900_35}${DEPENDENCIES_FILE_EXT}")
set(DEPENDENCIES_SHA_1916_37 "f060403fd1a7448d866d27c0e5b7dced39c0a607")
這樣就能匹配好我們的需要的庫。
其實這裏要感謝大神提供好了編譯的庫。也可以自己編譯,嘗試了一下,挺麻煩的。可以參考Intel-caffe, 給出了一個在win下的腳本。很棒,可以構建自己的caffe依賴。
等下載完成之後,我們需要修改一下caffe-builder-config.cmake 這個文件
# # BOOST config
# set(BOOST_ROOT ${CMAKE_CURRENT_LIST_DIR} CACHE PATH "")
# set(BOOST_INCLUDEDIR ${BOOST_ROOT}/include/boost-1_61 CACHE PATH "")
# set(BOOST_LIBRARYDIR ${BOOST_ROOT}/lib CACHE PATH "")
# set(Boost_USE_MULTITHREADED ON CACHE BOOL "")
# set(Boost_USE_STATIC_LIBS OFF CACHE BOOL "")
# set(Boost_USE_STATIC_RUNTIME OFF CACHE BOOL "")
因爲我們是自定義庫,所以我們要將原本的boost的內容註釋掉。
還要修改一下opencv的內容,由於默認這個庫是opencv 3.1 沒有預編譯的vc 15 所以我們要修改一點內容
修改OpenCVConfig.cmake 對應內容如下:
if(MSVC_VERSION EQUAL 1400)
set(OpenCV_RUNTIME vc8)
elseif(MSVC_VERSION EQUAL 1500)
set(OpenCV_RUNTIME vc9)
elseif(MSVC_VERSION EQUAL 1600)
set(OpenCV_RUNTIME vc10)
elseif(MSVC_VERSION EQUAL 1700)
set(OpenCV_RUNTIME vc11)
elseif(MSVC_VERSION EQUAL 1800)
set(OpenCV_RUNTIME vc12)
elseif(MSVC_VERSION EQUAL 1900)
set(OpenCV_RUNTIME vc14)
elseif(MSVC_VERSION EQUAL 1916)
set(OpenCV_RUNTIME vc14)
這樣當MSVC工具集是1916 的時候,要默認runtime 是vc 14。他倆通用的,不用再編譯。
接下來,再次執行的scripts\build_win.cmd 的時候,會出現找不到boost 的錯誤。
打開cmake/Dependence.cmake 文件 修改對應位置如下
if(BUILD_python)
# disable Python 3 search
find_package(PythonInterp 3.7)
find_package(PythonLibs 3.7)
find_package(NumPy 1.7.1)
find_package(Boost 1.69 COMPONENTS python37)
set(Boost_PYTHON_FOUND True)
if(PYTHONLIBS_FOUND AND NUMPY_FOUND AND Boost_PYTHON_FOUND)
set(HAVE_PYTHON TRUE)
if(Boost_USE_STATIC_LIBS AND MSVC)
list(APPEND Caffe_DEFINITIONS PUBLIC -DBOOST_PYTHON_STATIC_LIB)
endif()
後面應該就不會出什麼錯了,然後就開始編譯
由於protobuf 版本的問題,應該會出一個錯,F:\caffe-windows\caffe-windows\build\include\caffe\proto\caffe.pb.cc
和caffe.pb.h 這兩個文件會出一個錯。百度一下就能解決、
隨後應該編譯過程比較順暢。ninja 編譯成功。之前用vs 編譯一直鏈接錯誤。
至此--------------------------------------------------------------------------------------------------------
到目前爲止官方的caffe 應該是安裝成功了。可能會有一些C++的小問題。網上都能找到解決方案。
接下來,我們要定製化caffe。
根據博客https://blog.csdn.net/ap1005834/article/details/79251066
中提到的。要擴展caffe的操作,需要寫層。還有一些規則,今天先不討論這些。
先看看現成的大神實現的caffe 加層。
在caffe的微軟的分支中,提供了像faster rcnn rfcn 的一些定製化的層,並且支持cuda 8.0 ,實測也支持10.0,我們將其和caffe 官方的這個文件夾進行對照。\src\caffe\layers ,將原本caffe官方的一些沒有的文件複製過去,相應的下面的文件夾也要複製過去。
\include\caffe
。接下來,要註冊這些新層,我們需要修改
\src\caffe\proto\caffe.proto 這個文件,建議兩個版本的這個文件相互對應,各取所需。
修改完成之後,再進行編譯就沒有什麼問題了 。在每次修改完成caffe.proto 這個文件之後,都會重新生成caffe.pb.cc 和相應的文件,所以最好能一次就解決所有問題,否則會很麻煩。
然後再按照之前 的方法進行編譯。不出錯就編譯成功了。
接下來就可以爽快的進行faster rcnn的編譯了。需要用2to3 這個工具將這個項目裏面的所有代碼轉換成python3 適配
之前有提及一些注意事項。這裏就不再多說了,注意是lib裏面的幾個庫還有一些因版本變化的細節問題。
後面再做一個系統性的補充。
至此----------------------------------------------------------------------------------------------------------------------------------------
終於實現了,在win10 下 python 3.7 cuda 10.0 來訓練faster rcnn的目標了,可是真不容易。
之前由於基礎很薄弱,出錯了往往就放棄了,也缺乏一些解決問題的基本知識,現在時機終於成熟了,我們終於可以實現了當時的想法了。
其實這種解決方案早就存在,也早就兼容。只是很多時候沒有搞明白具體原理。
編譯好的文件和一些修改的文件,後面會整理放到github上,敬請關注。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------未完待續