< >
Home » TX1入门教程软件篇 » TX1入门教程软件篇-安装Caffe

TX1入门教程软件篇-安装Caffe

TX1入门教程软件篇-安装Caffe

说明:

  • 介绍如何在TX1上安装caffe

步骤:

  • 建立dl目录,下载安装脚本:
mkdir dl
cd dl
git clone https://github.com/jetsonhacks/installCaffeJTX1.git
cd installCaffeJTX1
  • 设置CPU and GPU clocks为最大:
$ sudo ./jetson_clocks.sh
  • jetson_clocks.sh脚本内容为:
#!/bin/bash
# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#  * Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#  * Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#  * Neither the name of NVIDIA CORPORATION nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

CONF_FILE=${HOME}/l4t_dfs.conf
RED='\e[0;31m'
GREEN='\e[0;32m'
BLUE='\e[0;34m'
BRED='\e[1;31m'
BGREEN='\e[1;32m'
BBLUE='\e[1;34m'
NC='\e[0m' # No Color

usage()
{
    if [ "$1" != "" ]; then
        echo -e ${RED}"$1"${NC}
    fi

        echo "usage:"

        cat >& 2 <<EOF
        jetson_max_l4t.sh [options]
        options,
        --show                display current settings
        --store [file]        store current settings to a file (default: /home/ubuntu/l4t_dfs.conf)
        --restore [file]      restore saved settings from a file (default: /home/ubuntu/l4t_dfs.conf)
EOF

    exit 0
}

restore()
{
    for conf in `cat $CONF_FILE`; do
        file=`echo $conf | cut -f1 -d :`
        data=`echo $conf | cut -f2 -d :`
        case $file in
            /sys/devices/system/cpu/cpu*/online |\
            /sys/kernel/debug/clock/override*/state )
                if [ `cat $file` -ne $data ]; then
                    echo $data > $file
                fi
                ;;
            *)
                echo $data > $file
                ret=$?
                if [ ${ret} -ne 0 ]; then
                    echo "Error: Failed to restore $file"
                fi
                ;;
        esac
    done
}

store()
{
    for file in $@; do
        if [ -e "${file}" ]; then
            echo "$file:`cat $file`" >> $CONF_FILE
        fi
    done
}

do_fan()
{
    # Jetson-TK1 CPU fan is always ON.
    if [ -e /sys/devices/soc0/machine ]; then
        machine=`cat /sys/devices/soc0/machine`
        if [ "${machine}" = "jetson-tk1" ] ; then
            return
        fi
    fi

    if [ ! -w /sys/kernel/debug/tegra_fan/target_pwm ]; then
        echo "Can't access Fan!"
        return
    fi

    case $ACTION in
        show)
            echo "Fan: speed=`cat /sys/kernel/debug/tegra_fan/target_pwm`"
            ;;
        store)
            store /sys/kernel/debug/tegra_fan/target_pwm
            ;;
        *)
            FAN_SPEED=255
            echo $FAN_SPEED > /sys/kernel/debug/tegra_fan/target_pwm
            ;;
    esac
}

do_clusterswitch()
{
    case $ACTION in
        show)
            if [ -d /sys/kernel/cluster ]; then
                ACTIVE_CLUSTER=`cat /sys/kernel/cluster/active`
                echo "CPU Cluster Switching: Active Cluster ${ACTIVE_CLUSTER}"
            else
                echo "CPU Cluster Switching: Disabled"
            fi
            ;;
        store)
            if [ -d /sys/kernel/cluster ]; then
                store "/sys/kernel/cluster/immediate"
                store "/sys/kernel/cluster/force"
                store "/sys/kernel/cluster/active"
            fi
            ;;
        *)
            if [ -d /sys/kernel/cluster ]; then
                echo 1 > /sys/kernel/cluster/immediate
                echo 0 > /sys/kernel/cluster/force
                echo G > /sys/kernel/cluster/active
            fi
            ;;
    esac
}

do_hotplug()
{
    CPU_HOTPLUG_STAT=`cat /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable`

    case $ACTION in
        show)
            echo "CPU HOTPLUG: $CPU_HOTPLUG_STAT"
            echo "Online CPUs: `cat /sys/devices/system/cpu/online`"
            for folder in /sys/devices/system/cpu/cpu[0-9]; do
                if [ -e "${folder}/cpufreq/scaling_cur_freq" ]; then
                    CPU=`echo ${folder} | cut -c 25-`
                    echo "$CPU: `cat ${folder}/cpufreq/scaling_cur_freq`"
                fi
            done
            ;;
        store)
            store "/sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable"
            for file in /sys/devices/system/cpu/cpu*/online; do
                store $file
            done
            ;;
        *)
            echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable
            for file in /sys/devices/system/cpu/cpu*/online; do
                if [ `cat $file` -eq 0 ]; then
                    echo 1 > $file
                fi
            done
    esac
}

do_cpu()
{
    FRQ_GOVERNOR=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor`
    CPU_MIN_FREQ=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq`
    CPU_MAX_FREQ=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq`
    CPU_CUR_FREQ=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq`

    case $ACTION in
        show)
            echo "CPU frequency Governor: $FRQ_GOVERNOR"
            echo "CPU MinFreq=$CPU_MIN_FREQ MaxFreq=$CPU_MAX_FREQ CurrentFreq=$CPU_CUR_FREQ"
            ;;
        store)
            store "/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"

            if [ -d /sys/devices/system/cpu/cpufreq/$FRQ_GOVERNOR ]; then
                store `find /sys/devices/system/cpu/cpufreq/$FRQ_GOVERNOR -type f -perm -g+r`
            fi
            ;;
        *)
            echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
            echo $CPU_MAX_FREQ >  /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
            ;;
    esac
}

do_gpu()
{
    GPU_MIN_FREQ=`cat /sys/kernel/debug/clock/override.gbus/min`
    GPU_MAX_FREQ=`cat /sys/kernel/debug/clock/override.gbus/max`
    GPU_CUR_FREQ=`cat /sys/kernel/debug/clock/override.gbus/rate`
    GPU_FREQ_OVERRIDE=`cat /sys/kernel/debug/clock/override.gbus/state`

    case $ACTION in
        show)
            echo "GPU MinFreq=$GPU_MIN_FREQ MaxFreq=$GPU_MAX_FREQ CurrentFreq=$GPU_CUR_FREQ FreqOverride=$GPU_FREQ_OVERRIDE"
            ;;
        store)
            store /sys/kernel/debug/clock/override.gbus/rate
            store /sys/kernel/debug/clock/override.gbus/state
            ;;
        *)
            echo $GPU_MAX_FREQ > /sys/kernel/debug/clock/override.gbus/rate
            echo 1 > /sys/kernel/debug/clock/override.gbus/state
            ret=$?
            if [ ${ret} -ne 0 ]; then
                echo "Error: Failed to max GPU frequency!"
            fi
            ;;
    esac
}

do_emc()
{
    EMC_MIN_FREQ=`cat /sys/kernel/debug/clock/override.emc/min`
    EMC_MAX_FREQ=`cat /sys/kernel/debug/clock/override.emc/max`
    EMC_CUR_FREQ=`cat /sys/kernel/debug/clock/override.emc/rate`
    EMC_FREQ_OVERRIDE=`cat /sys/kernel/debug/clock/override.emc/state`

    case $ACTION in
        show)
            echo "EMC MinFreq=$EMC_MIN_FREQ MaxFreq=$EMC_MAX_FREQ CurrentFreq=$EMC_CUR_FREQ FreqOverride=$EMC_FREQ_OVERRIDE"
            ;;
        store)
            store /sys/kernel/debug/clock/override.emc/rate
            store /sys/kernel/debug/clock/override.emc/state
            ;;
        *)
            echo $EMC_MAX_FREQ > /sys/kernel/debug/clock/override.emc/rate
            echo 1 > /sys/kernel/debug/clock/override.emc/state
            ;;
    esac
}

check_uptime()
{

if [ -e "/proc/uptime" ]; then
    uptime=`cat /proc/uptime | cut -d '.' -f1`

    if [ $((uptime)) -lt 90 ]; then
        printf "Error: Please run the script after $((90 - uptime)) Seconds, \
\notherwise ubuntu init script may override the clock settings!\n"
        exit -1
    fi
else
    printf "Warning: Could not check system uptime. Please make sure that you run the script 90 Seconds after bootup, \
\notherwise ubuntu init script may override the clock settings!\n"
fi
}

main ()
{
    check_uptime
    while [ -n "$1" ]; do
        case "$1" in
            --show)
                ACTION=show
                ;;
            --store)
                [ -n "$2" ] && CONF_FILE=$2
                ACTION=store
                shift 1
                ;;
            --restore)
                [ -n "$2" ] && CONF_FILE=$2
                ACTION=restore
                shift 1
                ;;
            -h|--help)
                usage
                exit 0
                ;;
            *)
                usage "Unknown option: $1"
                exit 1
                ;;
        esac
        shift 1
    done

    [ `whoami` != root ] && echo Error: Run this script\($0\) as a root user && exit 1

    case $ACTION in
        store)
            if [ -e "${CONF_FILE}" ]; then
                echo "File $CONF_FILE already exists. Can I overwrite it? Y/N:"
                read answer
                case $answer in
                    y|Y)
                        rm -f $CONF_FILE
                        ;;
                    *)
                        echo "Error: file $CONF_FILE already exists!"
                        exit 1
                        ;;
                esac
            fi
            ;;
        restore)
            if [ ! -e "${CONF_FILE}" ]; then
                echo "Error: $CONF_FILE file not found !"
                exit 1
            fi
            restore
            exit 0
            ;;
    esac

    do_cpu
    do_hotplug
    do_clusterswitch
    do_gpu
    do_emc
    do_fan
}

main $@
exit 0

安装Caffe

  • 安装Caffe脚本
$ ./installCaffe.sh
  • installCaffe.sh脚本内容为:
#!/bin/sh
# Script for installing Caffe support on Jetson TX1 Development Kitls
# 9-15-16 JetsonHacks.com
# MIT License
# Install and compile Caffe on NVIDIA Jetson TX1 Development Kit
# Prerequisites (which can be installed with JetPack 2):
# L4T 24.2 (Ubuntu 16.04)
# OpenCV4Tegra
# CUDA 8.0
# cuDNN v5.1
# Tested with last Github Caffe commit: 80f44100e19fd371ff55beb3ec2ad5919fb6ac43
sudo add-apt-repository universe
sudo apt-get update -y
/bin/echo -e "\e[1;32mLoading Caffe Dependencies.\e[0m"
sudo apt-get install cmake -y
# General Dependencies
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev \
libhdf5-serial-dev protobuf-compiler -y
sudo apt-get install --no-install-recommends libboost-all-dev -y
# BLAS
sudo apt-get install libatlas-base-dev -y
# Remaining Dependencies
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev -y
sudo apt-get install python-dev python-numpy -y

sudo usermod -a -G video $USER
/bin/echo -e "\e[1;32mCloning Caffe into the home directory\e[0m"
# Place caffe in the home directory
cd $HOME
# Git clone Caffe
git clone https://github.com/BVLC/caffe.git 
cd caffe 
cp Makefile.config.example Makefile.config
# Regen the makefile; On 16.04, aarch64 has issues with a static cuda runtime
cmake -DCUDA_USE_STATIC_CUDA_RUNTIME=OFF
# Include the hdf5 directory for the includes; 16.04 has issues for some reason
echo "INCLUDE_DIRS += /usr/include/hdf5/serial/" >> Makefile.config
/bin/echo -e "\e[1;32mCompiling Caffe\e[0m"
make -j4 all
# Run the tests to make sure everything works
/bin/echo -e "\e[1;32mRunning Caffe Tests\e[0m"
make -j4 test
make -j4 runtest
# The following is a quick timing test ...
# tools/caffe time --model=models/bvlc_alexnet/deploy.prototxt --gpu=0 

安装Caffe带有CUDNN支持

  • 安装installCaffeCuDNN.sh
$ ./installCaffeCuDNN.sh
  • installCaffeCuDNN.sh脚本内容为:
#!/bin/sh
# Script for installing Caffe with cuDNN support on Jetson TX1 Development Kitls
# 9-15-16 JetsonHacks.com
# MIT License
# Install and compile Caffe on NVIDIA Jetson TX1 Development Kit
# Prerequisites (which can be installed with JetPack 2):
# L4T 24.2 (Ubuntu 16.04)
# OpenCV4Tegra
# CUDA 8.0
# cuDNN v5.1
# Tested with last Github Caffe commit: 80f44100e19fd371ff55beb3ec2ad5919fb6ac43
sudo add-apt-repository universe
sudo apt-get update -y
/bin/echo -e "\e[1;32mLoading Caffe Dependencies.\e[0m"
sudo apt-get install cmake -y
# General Dependencies
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev \
libhdf5-serial-dev protobuf-compiler -y
sudo apt-get install --no-install-recommends libboost-all-dev -y
# BLAS
sudo apt-get install libatlas-base-dev -y
# Remaining Dependencies
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev -y
sudo apt-get install python-dev python-numpy -y

sudo usermod -a -G video $USER
/bin/echo -e "\e[1;32mCloning Caffe into the home directory\e[0m"
# Place caffe in the home directory
cd $HOME
# Git clone Caffe
git clone https://github.com/BVLC/caffe.git 
cd caffe 
cp Makefile.config.example Makefile.config
# Enable cuDNN usage
sed -i 's/# USE_CUDNN/USE_CUDNN/g' Makefile.config
# Regen the makefile; On 16.04, aarch64 has issues with a static cuda runtime
cmake -DCUDA_USE_STATIC_CUDA_RUNTIME=OFF
# Include the hdf5 directory for the includes; 16.04 has issues for some reason
echo "INCLUDE_DIRS += /usr/include/hdf5/serial/" >> Makefile.config
/bin/echo -e "\e[1;32mCompiling Caffe\e[0m"
make -j4 all
# Run the tests to make sure everything works
/bin/echo -e "\e[1;32mRunning Caffe Tests\e[0m"
make -j4 test
make -j4 runtest
# The following is a quick timing test ...
# tools/caffe time --model=models/bvlc_alexnet/deploy.prototxt --gpu=0

测试:

Jetson TK1 vs. Jetson TX1 Caffe GPU Example Comparison
10 iterations, times in milliseconds
Machine Average FWD Average BACK Average FWD-BACK
Jetson TK1 (32-bit OS) 234 243 478
Jetson TX1 (32-bit OS) 179 144 324
Jetson TX1
with cuDNN support (32-bit OS)
103 117 224
Jetson TX1 (64-bit OS) 110 122 233
Jetson TX1
with cuDNN support (64-bit)
80 119 200

安装nvcaffe:

问题:

  • 问题1:可能会在runtest卡住

  • 解决:在下载的安装脚本中make -j4 runtest前增加make -j4 test ,在caffe目录下make clean再执行安装命令

  • 问题2:caffe目录下,没有build目录

  • 解决:进入caffe目录执行:

    cd ~/caffe
    mkdir build
    cd build
    cmake ..
    cd ..

参考:

  • https://github.com/dusty-nv/jetson-inference/blob/master/docs/building-nvcaffe.md
  • https://github.com/jetsonhacks/installCaffeJTX1
  • http://www.jetsonhacks.com/2016/09/18/caffe-deep-learning-framework-64-bit-nvidia-jetson-tx1/

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: tx1入门教程软件篇