Caffe在不同的環(huán)境中進(jìn)行移植的時(shí)候需要重新編譯袍嬉,所以在TK1板上安裝caffe時(shí)需要在此armv7(uname -a查詢)和cuda及cudnn環(huán)境下進(jìn)行授嘀〈蠡牵可搜索到的教程最好的為發(fā)明Caffe工具的Yangqing Jia所寫的Jetson TK1教程賈揚(yáng)清寫的TK1上安裝caffe的教程给郊。根據(jù)教程我們可以一步步的來配置Caffe開發(fā)環(huán)境菩浙。
(1)run Nvidia’s installer
sudo NVIDIA-INSTALLER/installer.sh
sudo shutdown -r now
當(dāng)Reboot成功之后就可以開始安裝一些Caffe環(huán)境所需要的軟件包:
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包纹安,并配置環(huán)境變量:
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的版本有對應(yīng)的關(guān)系尤辱,所以需要小心的選擇和配置。 可以根據(jù)caffe版本和cudnn版本的對應(yīng)關(guān)系下載
caffe versions
cudnn下載
cudnn安裝教程
此處Cuda和Cudnn工具就都配置好了厢岂,可以使用命令nvcc -V
查詢安裝的cuda版本光督。
(3)opencv安裝
接著要配置Tegra版本的opencv工具,在上面的cuda6.0工具包 和cuda6.5工具包中都有對應(yīng)的opencv的工具包塔粒,可以根據(jù)需要安裝结借。此處由于我們安裝的是cuda6.0工具,所以下載兩個(gè)opencv工具包 libopencv4tegra_2.4.8.2_armhf.deb
和libopencv4tegra-dev_2.4.8.2_armhf.deb
,然后安裝這兩個(gè)軟件包,這樣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
但是這樣存在一個(gè)問題,就是上面提到的cudnn和caffe工具存在一定的對應(yīng)關(guān)系圃酵,如果直接下載最新的caffe工具包柳畔,有些編譯的軟件包不能向下兼容或者有可能函數(shù)缺失,這樣在安裝和編譯的過程中會帶來不少的問題郭赐。因此還是在上面提到的對應(yīng)關(guān)系處手工下載caffe工具包薪韩。當(dāng)下載好之后進(jìn)入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ìn)行編譯(-j 4表示采用的cpu核數(shù)為4)
make clean //每一次make失敗之后重新make都需要該命令進(jìn)行清除
make -j 4 all
make -j 4 runtest
當(dāng)編譯成功之后會出現(xiàn)一串的RUN OK 和 PASSED,即為編譯成功捌锭。
(5)安裝過程中遇到的一些問題及解決方法
- Cudnn報(bào)錯(cuò)俘陷,這是因?yàn)閏affe采用的是最新的版本而cudnn采用的是舊版本里面有些核函數(shù)有變動(dòng)所以不能編譯成功,所以需要安裝適合arm核的最新版的cudnn工具观谦,可以參考NVIDIA Jetson TK1學(xué)習(xí)與開發(fā)——安裝cudnn與caffe拉盾,更換cudnn工具以及其相對應(yīng)的lib庫后(注意backup)就可以成功執(zhí)行make all命令了。
- 在編譯過程中遇到了
unsupported gpu architecture compute_60
這個(gè)問題坎匿,這是由于安裝的cuda版本的計(jì)算能力不能達(dá)到要求(在新版本的caffe中可能會出現(xiàn))。此時(shí)可以編輯Makefile.config文件雷激,在CUDA_ARCH選項(xiàng)中替蔬,注釋掉
CUDA_ARCH = ...
...
# -gencode arch=compute_60,code=sm_60 \
# -gencode arch=compute_61,code=sm_61 \
# -gencode arch=compute_61,code=sm_61
此時(shí)重新執(zhí)行make all -j2就可以重新編譯了∈合荆可參考Error when Building GPU docker image for caffe: Unsupported gpu architecture 'compute_60'
- 如果在執(zhí)行make runtest時(shí)出現(xiàn)
undefined symbol: _ZN6google16SetVersionStringERKSs
的錯(cuò)誤承桥,如下所示:
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的包進(jìn)行編譯(此處我根據(jù)建議下載和編譯的是gflags-2.0版本)根悼,然后再次運(yùn)行make runtest凶异。如果不通過make runtest則在執(zhí)行examples庫中的例子時(shí)就會出現(xiàn)上面同樣的錯(cuò)誤而不能夠再執(zhí)行下去蜀撑。如果安裝了gflags-2.0版本的還是出現(xiàn)這個(gè)問題,則安裝gflags-1.4版本的剩彬,重新編譯酷麦,然后在make runtest時(shí)不會再報(bào)這個(gè)錯(cuò)誤。如果安裝了gflags-1.4版后make runtest雖然通過但是在轉(zhuǎn)換數(shù)據(jù)類型以及訓(xùn)練時(shí)遇到了如下所示flag缺失的問題喉恋,再更新成gflags-2.0版本的即可(這是gflag版本太低 此時(shí)又安裝gflag2.0版本沃饶,然后重新編譯,passed轻黑。)糊肤。
//
Creating lmdb...
ERROR: unknown command line flag 'backend'
ERROR: unknown command line flag 'backend'
Done.
- 安裝新版本的protobuf時(shí)首先要執(zhí)行make clean清除掉以前的編譯信息重新編譯∶ケ桑可以參考深度學(xué)習(xí)工具caffe詳細(xì)安裝指南中的protobuf安裝方法馆揉。
- 安裝了新的protobuf后出現(xiàn)
error while loading shared libraries: libprotoc.so.9: cannot open shared object file: No such file or directory
的錯(cuò)誤,證明是lib路徑的缺失抖拦,可以參考Ubuntu14.04編譯caffe問題記錄升酣。注意在autogen.sh文件中需要從google下載一個(gè)文件gtest-1.5.0.tar.bz2
,注釋掉curl行,并可能需要修改壓縮文件內(nèi)的文件名以保證正確的解壓和拷貝蟋座。 - 重新編譯make all時(shí)又遇到了新的問題
error while loading shared libraries: libcudart.so.6.5: cannot open shared object file: No such file
拗踢,這是lib庫中某些lib文件缺失,此時(shí)可以參考error while loading shared libraries: libcudart.so.6.5: cannot open shared object file: No such file向臀。一共遇到了四個(gè)lib文件缺失libcudart.so.6.5巢墅,libcublas.so.6.5,libcurand.so.6.5券膀,libcudnn.so.4只需要copy到對應(yīng)的lib文件夾下并執(zhí)行l(wèi)dconfig即可君纫。 - 在執(zhí)行make runtest時(shí)又出現(xiàn)新的問題
Check failed: status == CUDNN_STATUS_SUCCESS (6 vs. 0) CUDNN_STATUS_NOT_INITIALIZED
此問題可能是cudnn和caffe的版本不對應(yīng),參考:Digits Error (code 11) #223以及CUDNN_STATUS_NOT_INITIALIZED when using Caffe with cuDNN暫時(shí)修改Makefile.config文件芹彬,將USE_CUDNN:=1注釋掉蓄髓,不采用CUDNN加速。此時(shí)再重新make一次舒帮。 - 當(dāng)出現(xiàn)
warning:clock skew detected. Your build may be incomplete
時(shí)会喝,可按照lock skew detected. Your build may be incomplete的方法解決。
find . -type f | xargs -n 5 touch
make clean
make all -j4
- 當(dāng)出現(xiàn)
has modification time in xxxs the future
時(shí)表示系統(tǒng)時(shí)間被修改過了 過去修改時(shí)的系統(tǒng)時(shí)間和現(xiàn)在的系統(tǒng)時(shí)間不統(tǒng)一所以會報(bào)出warning玩郊。此問題的出現(xiàn)是由于TK1板沒有接入wifi信號肢执,此時(shí)的系統(tǒng)時(shí)鐘和上一次編譯時(shí)記錄的系統(tǒng)時(shí)鐘發(fā)生沖突而形成的。 - 當(dāng)出現(xiàn)
caffe: libgflags.so.0 missing (error while loading shared libraries)
的錯(cuò)誤時(shí),通過搜索(whereis libgflags.so.0)可以看到該文件其實(shí)是存在的译红,所以只需要將其所在目錄添加到所需的環(huán)境變量即可预茄。
export LD_LIBRARY_PATH=/usr/local/lib
- 當(dāng)出現(xiàn)
error while loading shared libraries: libcudart.so.6.0: cannot open shared object file: No such file
的問題以及其他三個(gè)lib文件也找不到的問題時(shí),按照上面的方法copy或者添加到環(huán)境變量即可侦厚。 - 當(dāng)出現(xiàn)
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
時(shí)耻陕,這是因?yàn)閏affe中db.cpp中設(shè)置的MDB_MAP_FULL變量的值為1TB遠(yuǎn)大于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執(zhí)行的時(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,重新執(zhí)行一篇編譯,記得之前要make clean梧田。
最后再重新走一遍編譯流程:
make clean
make -j 4 all
make -j 4 runtest
//出現(xiàn)一串RUN OK以及最后的PASSED即為成功淳蔼!
此時(shí)如果出現(xiàn)一串RUN OK以及最后的PASSED即為成功!通過以下命令可以測試cpu訓(xùn)練和開啟cudnn加速的gpu訓(xùn)練所用時(shí)長對比,可以從Average時(shí)間看出gpu訓(xùn)練比使用cpu訓(xùn)練縮短了很多時(shí)間裁眯!
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 ***