Skip to content

Instantly share code, notes, and snippets.

@wangruohui
Last active February 28, 2023 09:36
Show Gist options
  • Save wangruohui/679b05fcd1466bb0937f to your computer and use it in GitHub Desktop.
Save wangruohui/679b05fcd1466bb0937f to your computer and use it in GitHub Desktop.
Compile and run Caffe on Ubuntu 15.10

Ubuntu 15.10 have been released for a couple of days. It is a bleeding-edge system coming with Linux kernel 4.2 and GCC 5. However, compiling and running Caffe on this new system is no longer as smooth as on earlier versions. I have done some research related to this issue and finally find a way out. I summarize it here in this short tutorial and I hope more people and enjoy this new system without breaking their works.

Install NVIDIA Driver

The latest NVIDIA driver is officially included in Ubuntu 15.10 repositories. One can install it directly via apt-get.

sudo apt-get install nvidia-352-updates nvidia-modprobe

The nvidia-modprobe utility is used to load NVIDIA kernel modules and create NVIDIA character device files automatically everytime your machine boots up.

Reboot your machine and verify everything works by issuing nvidia-smi or running deviceQuery in CUDA samples.

References
  1. How to do it manually
  2. Understanding character special file

More infomation related to NVIDIA driver and CUDA installation can be found here.

Install CUDA 7.5

CUDA 7.5 is provided by neither Ubuntu official nor CUDA repositories for Ubuntu 15.10. But we can still install it using .run file.

cd ~
wget http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_linux.run
chmod +x cuda_7.5.18_linux.run
./cuda_7.5.18_linux.run --extract=/home/$USER
sudo ./cuda-linux64-rel-7.5.18-19867135.run

Follow the instructions there and configure runtime library after the installation finishes.

sudo bash -c "echo /usr/local/cuda/lib64/ > /etc/ld.so.conf.d/cuda.conf"
sudo ldconfig

Install all other dependencies

Follow instructions here

Download Caffe

cd ~
git clone https://github.com/BVLC/caffe.git

By now you should be unable to compile it due to serveral incompatibility problems. Let's fix them one by one.

Hack CUDA to support GCC 5

By default, CUDA 7.5 does not support compling with GCC 4.10 or later versions. It will report the following errors when compiling Caffe.

In file included from /usr/local/cuda/include/cuda_runtime.h:76:0,
                 from <command-line>:0:
/usr/local/cuda/include/host_config.h:115:2: error: #error -- unsupported GNU version! gcc versions later than 4.9 are not supported!
 #error -- unsupported GNU version! gcc versions later than 4.9 are not supported!
  ^

You can try install gcc-4.9 and g++-4.9 to solve this problem temporarily. But the linker will report undefined references errors later because all other libraries (protobuf,leveldb,opencv) in Ubuntu 15.10 are compiled with GCC version 5.2. They are not compatible.

To solve this problem we have to "hack" the CUDA toolkit by editing /usr/local/cuda/include/host_config.h. Comment line 115.

--- #error -- unsupported GNU version! gcc versions later than 4.9 are not supported!
+++ //#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!

Fix hdf5 naming problem

Your machine may report the following error when compiling Caffe even though libhdf5-serial-dev package has been already installed in it.

./include/caffe/util/hdf5.hpp:6:18: fatal error: hdf5.h: No such file or directory

This is because of change of default path and name of hdf5 head files and libraries in Ubuntu 15.10. To solve this problem, we can simply modify Makefile files.

Append /usr/include/hdf5/serial/ to INCLUDE_DIRS at line 85 in Makefile.config.

--- INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
+++ INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/

Modify hdf5_hl and hdf5 to hdf5_serial_hl and hdf5_serial at line 173 in Makefile

--- LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
+++ LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

Compile and Test Caffe

By now, all incompatibility issues should have been solved. We can start to compile and test Caffe.

cd ~/caffe
make -j8
make test -j8
make runtest -j8

Hopefully all tests pass.

Notes

  1. Running sudo make runtest once may help you fix a lot of runtime errors until next reboot, although it is not a recommended way.
  2. You might need to append LC_ALL="en_US.UTF-8" to /etc/environment and reboot your machine if there are runtime errors related to locale::facet::_S_create_c_locale name not valid.
@IcedDoggie
Copy link

You deserve a star!

@mzaradzki
Copy link

I wish I could give you 5 stars, not just 1, clearly saved me a lot of time.

@kyuhyong
Copy link

I am still getting build error. Why my ubuntu 14.04 cannot locate the libary correctly?

CXX examples/cifar10/convert_cifar_data.cpp
CXX examples/mnist/convert_mnist_data.cpp
CXX .build_release/src/caffe/proto/caffe.pb.cc
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0-rc3
/usr/bin/ld: cannot find -lhdf5_serial_hl
/usr/bin/ld: cannot find -lhdf5_serial
/usr/bin/ld: cannot find -lopenblas
collect2: error: ld returned 1 exit status
make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1

@herleeyandi
Copy link

Nice post. It help me a lot with hdf5 problem. However I am still facing this problem.

.build_release/lib/libcaffe.so: undefined reference to `google::protobuf::internal::WireFormatLite::WriteBytes(int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, google::protobuf::io::CodedOutputStream*)'
.build_release/lib/libcaffe.so: undefined reference to `google::protobuf::DescriptorPool::FindFileByName(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'

Anybody know how to fix this?
-Thank you-

@jackroos
Copy link

This guild helps me solve the hdf5 naming problem! Thanks a lot!

@ShangruiNie
Copy link

thank you!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

@AmpereurZeg
Copy link

Thank you a lot guy you save my day

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment