Caffe在不同的环境中进行移植的时候需要重新编译,所以在TK1板上安装caffe时需要在此armv7(uname -a查询)和cuda及cudnn环境下进行。可搜索到的教程最好的为发明Caffe工具的Yangqing Jia所写的Jetson TK1教程贾扬清写的TK1上安装caffe的教程。根据教程我们可以一步步的来配置Caffe开发环境。
(1)run Nvidia’s installer
sudo NVIDIA-INSTALLER/installer.sh
sudo shutdown -r now
当Reboot成功之后就可以开始安装一些Caffe环境所需要的软件包:
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install libprotobuf-dev protobuf-compiler gfortran \
libboost-dev cmake libleveldb-dev libsnappy-dev \
libboost-thread-dev libboost-system-dev \
libatlas-base-dev libhdf5-serial-dev libgflags-dev \
libgoogle-glog-dev liblmdb-dev gcc-4.7 g++-4.7
(2)Cuda和Cudnn工具安装
此处有官方的安装教程Jetson/Installing CUDA可以参考,然后下载Cuda6.0 for Arm。
cuda6.0工具包
cuda6.5工具包
下载deb包成功之后,我们需要接着安装此deb包,并配置环境变量:
sudo dpkg -i cuda-repo-l4t-r19.2_6.0-42_armhf.deb
sudo apt-get update
sudo apt-get install cuda-toolkit-6-0
sudo usermod -a -G video $USER
echo "# Add CUDA bin & library paths:" >> ~/.bashrc
echo "export PATH=/usr/local/cuda/bin:$PATH" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc
Cudnn的版本也和Caffe的版本有对应的关系,所以需要小心的选择和配置。 可以根据caffe版本和cudnn版本的对应关系下载
caffe versions
cudnn下载
cudnn安装教程
此处Cuda和Cudnn工具就都配置好了,可以使用命令nvcc -V
查询安装的cuda版本。
(3)opencv安装
接着要配置Tegra版本的opencv工具,在上面的cuda6.0工具包 和cuda6.5工具包中都有对应的opencv的工具包,可以根据需要安装。此处由于我们安装的是cuda6.0工具,所以下载两个opencv工具包 libopencv4tegra_2.4.8.2_armhf.deb
和libopencv4tegra-dev_2.4.8.2_armhf.deb
,然后安装这两个软件包,这样opencv工具就配置好了。
sudo dpkg -i libopencv4tegra_2.4.8.2_armhf.deb
sudo dpkg -i libopencv4tegra-dev_2.4.8.2_armhf.deb
(4)caffe工具安装
最便捷的方法就是利用git直接下载最新的caffe工具包,如下所示:
sudo apt-get install -y git
git clone https://github.com/BVLC/caffe.git
但是这样存在一个问题,就是上面提到的cudnn和caffe工具存在一定的对应关系,如果直接下载最新的caffe工具包,有些编译的软件包不能向下兼容或者有可能函数缺失,这样在安装和编译的过程中会带来不少的问题。因此还是在上面提到的对应关系处手工下载caffe工具包。当下载好之后进入caffe主目录:
cd caffe && git checkout dev
cp Makefile.config.example Makefile.config
sed -i "s/# CUSTOM_CXX := g++/CUSTOM_CXX := g++-4.7/" Makefile.config
然后使用命令进行编译(-j 4表示采用的cpu核数为4)
make clean //每一次make失败之后重新make都需要该命令进行清除
make -j 4 all
make -j 4 runtest
当编译成功之后会出现一串的RUN OK 和 PASSED,即为编译成功。
(5)安装过程中遇到的一些问题及解决方法
- Cudnn报错,这是因为caffe采用的是最新的版本而cudnn采用的是旧版本里面有些核函数有变动所以不能编译成功,所以需要安装适合arm核的最新版的cudnn工具,可以参考NVIDIA Jetson TK1学习与开发——安装cudnn与caffe,更换cudnn工具以及其相对应的lib库后(注意backup)就可以成功执行make all命令了。
- 在编译过程中遇到了
unsupported gpu architecture compute_60
这个问题,这是由于安装的cuda版本的计算能力不能达到要求(在新版本的caffe中可能会出现)。此时可以编辑Makefile.config文件,在CUDA_ARCH选项中,注释掉
CUDA_ARCH = ...
...
# -gencode arch=compute_60,code=sm_60 \
# -gencode arch=compute_61,code=sm_61 \
# -gencode arch=compute_61,code=sm_61
此时重新执行make all -j2就可以重新编译了。可参考Error when Building GPU docker image for caffe: Unsupported gpu architecture 'compute_60'
- 如果在执行make runtest时出现
undefined symbol: _ZN6google16SetVersionStringERKSs
的错误,如下所示:
ubuntu@tegra-ubuntu:~/work/caffe$ make -j 4 runtest
.build_release/tools/caffe
.build_release/tools/caffe: symbol lookup error: .build_release/tools/caffe: undefined symbol: _ZN6google14FlagRegistererC1IiEEPKcS3_S3_PT_S5_
make: *** [runtest] Error 127
证明gflags还是没有安装正确,可以参考caffe安装指南,在schuhschuh/gflags处下载gflags的包进行编译(此处我根据建议下载和编译的是gflags-2.0版本),然后再次运行make runtest。如果不通过make runtest则在执行examples库中的例子时就会出现上面同样的错误而不能够再执行下去。如果安装了gflags-2.0版本的还是出现这个问题,则安装gflags-1.4版本的,重新编译,然后在make runtest时不会再报这个错误。如果安装了gflags-1.4版后make runtest虽然通过但是在转换数据类型以及训练时遇到了如下所示flag缺失的问题,再更新成gflags-2.0版本的即可(这是gflag版本太低 此时又安装gflag2.0版本,然后重新编译,passed。)。
//
Creating lmdb...
ERROR: unknown command line flag 'backend'
ERROR: unknown command line flag 'backend'
Done.
- 安装新版本的protobuf时首先要执行make clean清除掉以前的编译信息重新编译。可以参考深度学习工具caffe详细安装指南中的protobuf安装方法。
- 安装了新的protobuf后出现
error while loading shared libraries: libprotoc.so.9: cannot open shared object file: No such file or directory
的错误,证明是lib路径的缺失,可以参考Ubuntu14.04编译caffe问题记录。注意在autogen.sh文件中需要从google下载一个文件gtest-1.5.0.tar.bz2
,注释掉curl行,并可能需要修改压缩文件内的文件名以保证正确的解压和拷贝。 - 重新编译make all时又遇到了新的问题
error while loading shared libraries: libcudart.so.6.5: cannot open shared object file: No such file
,这是lib库中某些lib文件缺失,此时可以参考error while loading shared libraries: libcudart.so.6.5: cannot open shared object file: No such file。一共遇到了四个lib文件缺失libcudart.so.6.5,libcublas.so.6.5,libcurand.so.6.5,libcudnn.so.4只需要copy到对应的lib文件夹下并执行ldconfig即可。 - 在执行make runtest时又出现新的问题
Check failed: status == CUDNN_STATUS_SUCCESS (6 vs. 0) CUDNN_STATUS_NOT_INITIALIZED
此问题可能是cudnn和caffe的版本不对应,参考:Digits Error (code 11) #223以及CUDNN_STATUS_NOT_INITIALIZED when using Caffe with cuDNN暂时修改Makefile.config文件,将USE_CUDNN:=1注释掉,不采用CUDNN加速。此时再重新make一次。 - 当出现
warning:clock skew detected. Your build may be incomplete
时,可按照lock skew detected. Your build may be incomplete的方法解决。
find . -type f | xargs -n 5 touch
make clean
make all -j4
- 当出现
has modification time in xxxs the future
时表示系统时间被修改过了 过去修改时的系统时间和现在的系统时间不统一所以会报出warning。此问题的出现是由于TK1板没有接入wifi信号,此时的系统时钟和上一次编译时记录的系统时钟发生冲突而形成的。 - 当出现
caffe: libgflags.so.0 missing (error while loading shared libraries)
的错误时,通过搜索(whereis libgflags.so.0)可以看到该文件其实是存在的,所以只需要将其所在目录添加到所需的环境变量即可。
export LD_LIBRARY_PATH=/usr/local/lib
- 当出现
error while loading shared libraries: libcudart.so.6.0: cannot open shared object file: No such file
的问题以及其他三个lib文件也找不到的问题时,按照上面的方法copy或者添加到环境变量即可。 - 当出现
F0202 10:28:31.158313 14086 db_lmdb.hpp:13] Check failed: mdb_status == 0 (-30792 vs. 0) MDB_MAP_FULL: Environment mapsize limit reached
时,这是因为caffe中db.cpp中设置的MDB_MAP_FULL变量的值为1TB远大于TK1上可接受的范围。因此需要修改该文件,可参考这篇文章。其他的参考:
Environment mapsize limit reached
LMDB map size - double when full
Provide a Caffe package in Debian
Remove all references to LevelDB
mdb_mapp_full error when installing caffe on jetson tk1
caffe+ubuntu 32位+atlas最少配置方法
NVIDIA Jetson TK1 – Caffe Deep Learning Framework - 在creat_mnist.sh执行的时候又遇到了新的问题
F0413 15:08:19.918817 9137 convert_mnist_data.cpp:132] Check failed: mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0) == 0 (-30792 vs. 0) mdb_put failed
,该问题和上面MDB_MAP_FULL的问题一样超出了边界。解决方法:
I am also using Ubuntu 32 bit and got this error. Changing the 1099511627776 to 1073741824 in examples/mnist/convert_mnist_data.cpp fixed it.
可以参考这篇文章Problems with MDB in the mnist example然后需要reboot,重新执行一篇编译,记得之前要make clean。
最后再重新走一遍编译流程:
make clean
make -j 4 all
make -j 4 runtest
//出现一串RUN OK以及最后的PASSED即为成功!
此时如果出现一串RUN OK以及最后的PASSED即为成功!通过以下命令可以测试cpu训练和开启cudnn加速的gpu训练所用时长对比,可以从Average时间看出gpu训练比使用cpu训练缩短了很多时间!
CPU-only test
terminal:./build/tools/caffe time --model=models/bvlc_alexnet/deploy.prototxt
I0413 16:40:36.283255 3707 caffe.cpp:271] Average Forward pass: 6130.44 ms.
I0413 16:40:36.283291 3707 caffe.cpp:273] Average Backward pass: 5817.8 ms.
I0413 16:40:36.283329 3707 caffe.cpp:275] Average Forward-Backward: 11948.8 ms.
I0413 16:40:36.283367 3707 caffe.cpp:277] Total Time: 597442 ms.
I0413 16:40:36.283406 3707 caffe.cpp:278] *** Benchmark ends ***
VS
GPU-only test
terminal:./build/tools/caffe time --model=models/bvlc_alexnet/deploy.prototxt --gpu=0
I0413 16:44:23.592217 6929 caffe.cpp:271] Average Forward pass: 262.872 ms.
I0413 16:44:23.592285 6929 caffe.cpp:273] Average Backward pass: 244.351 ms.
I0413 16:44:23.592348 6929 caffe.cpp:275] Average Forward-Backward: 508.663 ms.
I0413 16:44:23.592429 6929 caffe.cpp:277] Total Time: 25433.1 ms.
I0413 16:44:23.592506 6929 caffe.cpp:278] *** Benchmark ends ***