[Jetson TK1]caffe工具环境搭建

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.deblibopencv4tegra-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 ***

你可能感兴趣的:([Jetson TK1]caffe工具环境搭建)