Ubuntu 15.04 下编译Caffe2

深度学习大神贾扬清在四月底发布了最新框架Caffe2,最近在Ubuntu15.04下编译了它的源代码,遇到一些坑,记录下来以供参考。

基本安装次序如官网所述。https://caffe2.ai/docs/getting-started.html?platform=ubuntu&configuration=compile

大概就是先装一些底层支持库,装GPU显卡驱动,装CUDA支持,装cuDNN,再装一些依赖库,然后就可以去GitHub下载源代码编译了。 

前几步问题不大,原来的Caffe一代在装显卡和CUDA时有很多问题 ,这里直接装一个连驱动带CUDA环境的deb文件,很简练。cuDNN装的也很快。但最后一步遇到些麻烦。

首先就是GitHub的访问太慢了,经常是10k/s这样的速度,还是用 git clone 坚持走下来了,大概用了半天的时间。后来发现这样更好:先下载zip文件,然后手动下载third_party里的目录文件(zip里不带,另有些如android,ios环境下的不用可以不管),就可以编译了。

make这个过程问题最多,整理了一下,一一道来。

1. 首先就是速度较慢,应该像之前的习惯,加 -j4或-j8这样的并行加速,官网没有说。在多核CPU的机器上,会快好几倍。

2. 环境依赖最好用最新的。我后来在一台新机器上又装了一次就很顺利,基本就是官网的次序走下来。Ubuntu14.04 + CUDA8.0 + cuDNN8.0v5.1 + OpenCV3.2 ,如果是初学者我建议按照这个配置走,坑少。中间apt-get 各种依赖库时,有一次错误提示:
ValueError: ('Expected version spec in', 'widgetsnbextension ~=2.0.0', 'at', ' ~=2.0.0')
......
更新一下pip就好了:pip install --upgrade pip

3. 如果是现有的机器。比如我的机器上已经装过Caffe,依赖库有些较旧,结果带来一堆问题。

首先CUDA本是7.5,按照Caffe2的说法是支持的,但是中间的make过程中,就出现error提示:
 [ 73%] Building NVCC (Device) object caffe2/CMakeFiles/Caffe2_GPU.dir/sgd/./Caffe2_GPU_generated_adagrad_op_gpu.cu.o
/home/sherif/caffe2/caffe2/utils/conversions.h(137): warning: variable "r" was declared but never referenced
/home/sherif/caffe2/caffe2/utils/math_gpu.cu(136): error: identifier "CUDA_R_16F" is undefined
/home/sherif/caffe2/caffe2/utils/math_gpu.cu(312): error: identifier "CUDA_R_16F" is undefined
/home/sherif/caffe2/caffe2/utils/math_gpu.cu(496): error: identifier "CUDA_R_16F" is undefined
......
一时找不到原因,百度一下也没有。还是要翻Google,先看到一个日文的博客,大概说要把CUDA8.0的路径加上。又看到GitHub上也在讨论这个问题,贾扬清也出现了,讨论的结果说是因为Caffe2用到FP16类型,需要CUDA8.0的支持。(这个讨论还带出另一个问题,有人装了8.0编译时又提示要7.5,后面我也遇到了。)

安装CUDA8.0(同时还必须装cuDNN8.0v5.1版),把默认的cuda路径 /usr/local/cuda 改为 /usr/local/cuda-8.0目录:
添加路径:(直接拷日文,汉字都懂)
gedit ~/.bashrc &
# .bashrcの末尾に追記
 
export  PATH=/usr/ local/cuda-8.0/bin: ${PATH}
 
export  LD_LIBRARY_PATH=/usr/ local/cuda-8.0/lib64: ${LD_LIBRARY_PATH} 

make编译成功,但运行python测试仍然不对,提示找不到Moudle。这是老问题,重新设置PYTHONPATH,还是在 ~/.bashrc加入
export PYTHONPATH=$PYTHONPATH:/home/jasper/code/caffe2/build/python

又出了新的error:加载libcudart.so.7.5时出错,可明明是安装了CUDA8.0,这时才注意到,make的时候,提示CUDA的版本就是7.5,实在找不到原因,只好卸载了CUDA7.5。可这么一折腾,再make时出现如下错误:
Could NOT find CUDA: Found unsuitable version "8.0", but required is exact
version "7.5" (found /usr/local/cuda-8.0)

中间走过一段弯路,以为编译需要gcc5 ,装了以后make就失败了,又听说CUDA8.0不支持gcc5,于是又改回来。实际还是用的gcc4.9.2编译。
 

再找原因,发现github上有人指出解决方法:
sudo rm -rf /usr/local/share/OpenCV
大概是因为以前曾经用CUDA7.5+OpenCV2.4.9配置编译了Caffe,导致CMake发现系统中存在一个指向OpenCV的配置,进而引发了CUDA的版本冲突。所以要删去此目录。然而删除后make,快结束时又出现错误:
[ 92%] Building CXX object caffe2/CMakeFiles/math_gpu_test.dir/utils/math_gpu_test.cc.o
......
CMakeFiles/make_image_db.dir/binaries/make_image_db.cc.o:在函数‘caffe2::ConvertImageDataset(std::string const&, std::string const&, std::string const&, bool)’中:
make_image_db.cc:(.text+0x9e4):对‘cv::imread(cv::String const&, int)’未定义的引用
......
这是没有找到OpenCV的环境,可以CMake怎么没发现?硬着头皮直接去掉OPENCV依赖: 
cmake .. -DUSE_OPENCV=OFF
可以编译通过,但是如此一来就没有 OpenCV支持了,对于图像的测试可能不方便。电脑里以前也有一个手动编译的OpenCV3.1,不过是CUDA7.5的,这次还要用CUDA8.0重新编译。

于是在CMakeLists.txt中修改,第二行加入
set (OpenCV_DIR "/xxx/OpenCV3.1编译后的build目录") 
然后编译,就行了。

以上部分写的很罗嗦,简单说就是这样: 
新机器推荐 Ubuntu14.04 + CUDA8.0 + cuDNN8.0v5.1 + OpenCV3.2。
如果是旧机器,先装CUDA8.0,再cuDNN8.0,然后在此基础上编译OpenCV,配置CMake文件,最后 make(Caffe2的make也是先调用CMake)
 。

这次得到的一些经验是:
依赖库尽量用官方文档里给出的新版本,它是经过较多的测试的。 
新技术新问题查询还是要用Google,国外的技术交流比较频繁开放,国内会晚一段时间,质量也不如国外。 但国内有一点好,中文阅读效率高。所以成熟的技术或常见问题可以用百度。

还没有测试Caffe2的功能,先写到这。

你可能感兴趣的:(深度学习)