[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
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 ***
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容