win 10 python 3.7 faster rcnn ninja cuda 10.0 编译指南

11 篇文章 0 订阅
9 篇文章 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上,敬请关注。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------未完待续

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值