服務器的環境
Ubuntu18.04,
python3.6
CUDA 10.0,
cuDNN 7.6.3
opencv3.4.6
查看cuda和cudnn版本
nvcc -V
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
基本上都是在普通用戶(caffe)目錄下安裝的,服務器中的CUDA10和CUDNN已經安裝好了(都在正常的位置),python也已經在根目錄下安裝好了,opencv3.4.6我是直接在自己的用戶目錄下(caffe)安裝完成了,具體可以看我的博客
linux下無權限安裝opencv3.4.6
1、源碼下載
到Github直接下載Caffe
unzip caffe-master.zip
mv caffe-master caffe
需要的依賴環境安裝
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
2、配置文件修改
在caffe目錄下
cd caffe
Makefile.config文件的修改
cp Makefile.config.example Makefile.config
vim Makefile.config
對Makefile.config的下面幾處進行修改
將:
#USE_CUDNN := 1
改爲:
USE_CUDNN := 1
將:
# USE_OPENCV := 0
改爲:
USE_OPENCV := 1
將:
#OPENCV_VERSION := 3
改爲:
OPENCV_VERSION := 3
將:
#WITH_PYTHON_LAYER := 1
改爲:
WITH_PYTHON_LAYER := 1
在CUDA_ARCH := 後前兩行即有*_20和*_21的兩行前面添加#,不過我是直接 刪除了:
# For CUDA >= 9.0, comment the *_20 and *_21 lines for compatibility.
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
對於python路徑也是要修改了(我使用的是根目錄下的opencv3.6),還有就是python解釋器下的numpy路徑也要添加進去。
將python2.7的註釋掉
#PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include
下面添加python3.6的路徑
PYTHON_INCLUDE := /usr/include/python3.6 \
/usr/local/lib/python3.6/dist-packages/numpy/core/include
將下面的註釋掉,
#INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
#LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
然後添加
INCLUDE_DIRS := /home/caffe/opencv34/include/ $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
LIBRARY_DIRS := /home/caffe/opencv34/lib/ $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/
注意
我將include和lib中的opencv的安裝路徑放在了最前面,讓編譯器最先尋找這個路徑纔可以找到,我試過,放在後面就失敗了。因爲編譯器比較笨,多個opencv版本容易犯衝突。總是報下面的錯誤
.build_release/lib/libcaffe.so: undefined reference to `cv::imread(cv::String const&, int)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::allocate(unsigned long)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::deallocate()'
.build_release/lib/libcaffe.so: undefined reference to `cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)'
修改Makefile文件
vim Makefile
如下圖()
將下面註釋
#NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
添加
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
將下面註釋
#LIBRARIES += glog gflags protobuf boost_system boost_filesystem m
添加
LIBRARIES += glog gflags protobuf leveldb snappy \
lmdb boost_system boost_filesystem hdf5_hl hdf5 m \
opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
3、編譯安裝
在caffe目錄下,make clean主要作用是清理上次編譯(第一次編譯可以不用執行)。
make clean
make all -j16
成功了
測試
make test -j16
make runtest -j16
出現錯誤
主要原因是/usr/local/lib沒有這個libcudart.so.10.0,現在只需將/usr/local/cuda/lib64文件下的libcudart.so.10.0拷貝一份給/usr/local/lib文件夾下。執行下面的命令就可以了。
sudo cp /usr/local/cuda/lib64/libcudart.so.10.0 /usr/local/lib/ && sudo ldconfig
如果/usr/local/lib文件缺少 libcudart.so.10.0,那估計也缺少libcublas.so.10.0,libcurand.so.10.0,libcudnn.so.7 文件。
sudo cp /usr/local/cuda/lib64/libcublas.so.10.0 /usr/local/lib/ && sudo ldconfig
sudo cp /usr/local/cuda/lib64/libcurand.so.10.0 /usr/local/lib/ && sudo ldconfig
sudo cp /usr/local/cuda/lib64/libcudnn.so.7 /usr/local/lib/ && sudo ldconfig
各種環境ok的話,在caffe目錄下
make runtest -j16
下面配置安裝pycaffe
make pycaffe -j16
基本上caffe編譯安裝就基本完成了
注意
在caffe目錄下輸出python,無法使用pycaffe
但是在caffe用戶目錄下確是可以使用的
4、MNIST 模型訓練和測試
訓練
在caffe目錄下,下載mnist數據集
./data/mnist/get_mnist.sh
轉換數據格式
./examples/mnist/create_mnist.sh
訓練
./examples/mnist/train_lenet.sh
測試
在caffe目錄下
touch test_lenet.sh
vim test_lenet.sh
在文件中添加
./build/tools/caffe.bin test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -iterations 100
chmod +x test_lenet.sh
./test_lenet.sh
測試成功說明caffe的整個環境是ok的。