我的NVIDIA开发者之旅——Caffe教程(1)[Jetson TK1]Caffe工具环境(Linux)搭建
时间:2023-07-31 23:07:00
Caffe简介
Caffe的作者为UC Berkeley贾扬清大学。caffe是一个c /CUDA架构支持命令行,Python、Matlab接口,可在CPU/GPU上运行。
Caffe可应用于视觉、语音识别、机器人、神经科学和天文学。
Caffe为训练、测试、微调和部署模型提供完整的工具包。
Deep Learning一个流行的原因主要是因为它可以从数据中独立学习有用的东西feature。特别是对于一些不知道如何设计的人feature图像和speech。
Caffe设计:基本上,Caffe follow神经网络的一个简单假设——所有的计算都是基于layer形式表示,layer做的就是take一些数据,然后输出一些计算结果,如卷积,即输入图像,然后与这层参数(filter)卷积,然后输出卷积结果。每一个layer需要做两个计算:forward从输入计算输出backward是从上面给的gradient计算相对于输入gradient,只要这两个函数实现,我们就可以将多层连接到一个网络中。这个网络所做的是输入我们的数据(图像、语音或语音)whatever),然后计算我们需要的输出(例如识别)label),在training根据现有的情况,我们可以label来计算loss和gradient,然后用gradient来update这就是网络的参数。Caffe基本过程。
基本上,使用最简单Caffe开始的方法是先把数据写成Caffe格式,然后设计网络,然后使用Caffe提供的solver如果你的数据是图像,你可以从现有的网络,比如alexnet或者googlenet开始,然后做fine tuning,假如你的数据稍有不同,比如说是直接的float vector,你可能需要做点什么custom的configuration,Caffe的logistic regression example也许会很有帮助。
Fine tune方法:fine tuning想法是,在imagenet这么大的数据集train一个非常好的网络,其他的task一定很好,所以我们可以pretrain把网络拿过来,然后只重新开始train最后几层,重新train这意味着,例如,我以前需要它classify imagenet现在我只想知道是狗还是猫,还是车牌,所以我可以把最后一层softmax从一个40961000的分类器变成一个40962分类器,这个strategy它在应用中很容易使用,所以我们经常先使用它imagenet上pretrain一个网络,因为我们知道imagenet上training大概过程会怎样?
Caffe工具环境(Linux)搭建
Caffe移植在不同的环境中需要重新编译,所以在TK1板上安装caffe时需要在此armv7(uname -a查询)和cuda及cudnn在环境中进行。可搜索的教程索的教程Caffe工具的Yangqing Jia所写的Jetson TK贾扬清写的教程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 ***
参考学习:
-
Caffe学习系列(10):命令行解析 - denny402 - 博客园 (cnblogs.com)
-
[Notes]深度学习——caffe工具使用 - 知乎 (zhihu.com)