1.系统Ubuntu18.04
我一开始安装的是cuda9.1,后来发现tensorflow目前较大支持到cuda9.0,不支持cuda9.1。如果用cuda9.1需要自己编译整个tensorflow工程,因为我接下来还打算安装tensorflow,所以想了想,决定重新将cuda和cudnn升级到cuda9.0+cudnn7.0。
2.cuda安装查看:
https://blog.csdn.net/u010801439/article/details/80483036
3.cuda卸载查看:
https://blog.csdn.net/wanzhen4330/article/details/81704474
4.caffe安装过程遇到的BUG
-
protoc
错误:
.build_release/src/caffe/proto/caffe.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
#error This file was generated by a newer version of protoc which is
修改:
命令 whereis protoc 可以查看哪些路径下安装了protoc
命令which protoc 可以查看默认选用protoc的路径
命令 protoc --version 可以查看当前protoc版本
选定2.6.1的版本来编译caffe,如果没有2.6.1自行重装一下
(https://blog.csdn.net/xocoder/article/details/9155901)
(https://blog.csdn.net/lwplwf/article/details/76532804)
指定protoc的版本可以在 Makefile文件内修改
在Makefile 中修改这两句:
$(Q)protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
$(Q)protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $<
为
$(Q)/usr/bin/protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
$(Q)/usr/bin/protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $<
即把开头的"protoc"补全路径即可 (/usr/bin/protoc即为自己向指定给的版本路径)
-
caffe.pb.g
错误:
fatal error: caffe/proto/caffe.pb.h: 没有那个文件或目录?
修改:
解决方法在/caffe/src/caffe/proto下打开终端输入 protoc --cpp_out=/home/lanxiao/caffe/include/caffe/ caffe.proto
不要忘记要在include/caffe下新建一个proto文件夹,且在文件夹下将caffe.pb.h复制进去。
-
compute_20
错误:
cuda9.0 caffe编译的时候报上述错误
修改:
CUDA_ARCH := #-gencode arch=compute_20,code=sm_20 \
#-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61
-
opencv
错误:
cv::imread(cv::String const&, int)’未定义的引用
修改:
在 Makefile文件的最后添加:
LIBRARIES += glog gflags protobuf leveldb snappy \
lmdb boost_system boost_filesystem hdf5_hl hdf5 m \
opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs opencv_videoio
-
与c++11或gnu++11相关的问题
解决方法:
Makefile 中定位到
##############################
# Configure build
##############################
再找到
# Linux
添加:CXXFLAGS += -std=c++11
这句的作用就是将编译时用到的g++加上编译选项“ -std=c++11”,加上此编译选项后用的就是11标准,不加貌似默认的是98标准
-
make runtest
[==========] 2199 tests from 285 test cases ran. (453917 ms total)
[ PASSED ] 2197 tests.
[ FAILED ] 2 tests, listed below:
[ FAILED ] BatchReindexLayerTest/2.TestGradient, where TypeParam = caffe::GPUDevice<float>
[ FAILED ] BatchReindexLayerTest/3.TestGradient, where TypeParam = caffe::GPUDevice<double>
2 FAILED TESTS
Makefile:532: recipe for target 'runtest' failed
make: *** [runtest] Error 1
解决办法:You have to add NVCCFLAG += -G to Makefile and do
make clean & make all & make test & make runtest
也就是从
# Debugging
ifeq ($(DEBUG), 1)
COMMON_FLAGS += -DDEBUG -g -O0
NVCCFLAGS += -G
else
COMMON_FLAGS += -DNDEBUG -O2
endif
改成
# Debugging
ifeq ($(DEBUG), 1)
COMMON_FLAGS += -DDEBUG -g -O0
NVCCFLAGS += -G
else
COMMON_FLAGS += -DNDEBUG -O2
NVCCFLAGS += -G
endif
(感谢https://blog.csdn.net/u013848769/article/details/80026602)
-
caffe编译报错 cudnn.hpp:127:41: error: too few arguments to function ‘cudnnStatus_t cudnnSetPooling2dDescriptor
-
这是因为当前版本的caffe的cudnn实现与系统所安装的cudnn的版本不一致引起的。
解决办法:
1.将./include/caffe/util/cudnn.hpp 换成最新版的caffe里的cudnn的实现,即相应的cudnn.hpp.
2. 将./include/caffe/layers里的,所有以cudnn开头的文件,例如cudnn_conv_layer.hpp。 都替换成最新版的caffe里的相应的同名文件。
3.将./src/caffe/layer里的,所有以cudnn开头的文件,例如cudnn_lrn_layer.cu,cudnn_pooling_layer.cpp,cudnn_sigmoid_layer.cu。
都替换成最新版的caffe(可以从github上找一个最新的,替换本地的)里的相应的同名文件。