新版的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上,敬请关注。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------未完待续