win 10 python 3.7 faster rcnn ninja cuda 10.0 編譯指南

新版的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上,敬請關注。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------未完待續

 

 

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