Table of Contents

Jetson TK1 (Tegra-Board)

Alternativen zum Booten des TK1

Da der Flashspeicher von tegra03 nach ca. 500 Dienststunden den Status Eichhörnchen hat, hier ein Rezept um die Boards von SD-Karte zu booten und den fest verlöteten Speicher zu schonen. Der Speicher auf dem Bord wird trotzdem für Bootloader und Boot-Config benötigt, aber nicht mehr so stark beansprucht.

Auf picalike@sg01:/mnt/storage/var/jetson-tk1 befinden sich die Dateien:

Tegra124_Linux_R21.5.0_armhf.tbz2
Tegra_Linux_Sample-Root-Filesystem_R21.5.0_armhf.tbz2
remove_desktop [sg01:/mnt/storage/var/jetson-tk1]

lade diese auf deinen Rechner.

Jetzt die Dateien entpacken und das flashen des Boards vorbereiten:

sudo tar xpf Tegra124_Linux_R21.5.0_armhf.tbz2
cd Linux_for_Tegra/rootfs/
sudo tar xpf ../../Tegra_Linux_Sample-Root-Filesystem_R21.5.0_armhf.tbz2
cd ../
sudo ./apply_binaries.sh

Das Board an die Stromversorgung anschließen und via USB-Kabel mit dem Rechner verbinden. Den Knopf “force recovery” gedrückt halten, “reset” drücken und “force recovery” wieder loslassen. Das Board flashen (dauert ein paar Minuten) mit:

sudo ./flash.sh jetson-tk1 mmcblk0p1

Das Board startet anschließend neu. Per ssh mit ubuntu@<ip> und pw(ubuntu) einloggen. In /etc/hostname einen sinnigen Hostnamen eintragen und eine sd-Karte einsetzen. Indem man das remove_desktop Skript auf das Board kopiert und dort ausführt wird man den Ubuntu-Desktop wieder los. Das System startet ohne Desktop neu.

Per ssh mit ubuntu@<hostname> einloggen und die Dateien von picalike@sg01:/mnt/storage/var/jetson-tk1 auf das Board laden. Als nächstes wird die sd-Karte für das Booten vorbereitet.

sudo mkfs.ext4 /dev/mmcblk1p1
sudo tar xpf Tegra124_Linux_R21.5.0_armhf.tbz2
cd Linux_for_Tegra/rootfs/
sudo tar xpf ../../Tegra_Linux_Sample-Root-Filesystem_R21.5.0_armhf.tbz2
cd ../
sudo ./apply_binaries.sh

Die sd-Karte mounten und das rootfs schreiben (dauert ein paar Minuten):

sudo mkdir /mnt/sd
sudo mount /dev/mmcblk1p1 /mnt/sd
cd Linux_for_Tegra/rootfs/
sudo cp -a * /mnt/sd

Dem Bootloader sagen das er von sd-Karte booten soll:

cd /boot/extlinux/
sudo cp jetson-tk1_extlinux.conf.sdcard extlinux.conf

Das tk1 neu starten:

sudo reboot

Danach wieder den Hostnamen anpassen und den Ubuntu-Desktop entfernen mit dem remove_desktop Skript.

Das tk1 bootet jetzt von sd-Karte und kann eingerichtet werden.

SD-Karte von Image erzeugen

dd if=sdcard.image of=/dev/<> bs=1M status=progress

Nach dem dd-Befehl unbedingt prüfen, ob man die Karte mounten kann. Wenn es einen Fehler der Form “EXT4-fs (mmcblk0p1): bad geometry: block count 3947264 exceeds size of device (3888512 blocks)” gibt, könnten die folgenden zwei Befehle helfen:

e2fsck -f /dev/mmcblk0p1  # ggf. device anpassen
resize2fs /dev/mmcblk0p1  # ggf. device anpassen

Danach noch den Hostnamen in /etc/hostname ändern. (t<gpuBoard>of<Cluster>)

alt:

via Ethernet (NFS)

Geignete Stichworte: PXE https://devtalk.nvidia.com/default/topic/744908/jetson-tk1-boot-over-nfs/?offset=2

via SATA

https://devtalk.nvidia.com/default/topic/774120/jetson-tk1-sata3-support/

https://devtalk.nvidia.com/default/topic/750678/jetson-tk1/jetson-tk1-boot-from-sata-/

via USB

https://demotomohiro.github.io/hardware/jetson_tk1/setup/external_storage.html

https://devtalk.nvidia.com/default/topic/747933/is-it-possible-to-boot-from-sd-or-usb-hdd-and-how-jetson-tk1-/

(uboot) http://demotomohiro.github.io/hardware/jetson_tk1/setup/sdcard.html

(recovery mode) https://demotomohiro.github.io/hardware/jetson_tk1/setup/recovery_mode.html

http://developer.download.nvidia.com/embedded/L4T/r21_Release_v5.0/l4t_quick_start_guide.txt?autho=1469187153_19e21052ec3e54440769c65fc640e1b3&file=l4t_quick_start_guide.txt

Cluster im RZ

In der Süderstrasse steht ein Cluster aus 4 Tegraboards

tegra{01..04}.picalike.corpex-kunden.de  

Diese sind nur im VPN zu erreichen, dürfen aber selbst aufs Web zugreifen (wg. Download der Bilder von Urls)

Status der Boards

tegra01

cpp interface

tegra02

python interface

tegra03

for testing

tegra04

for testing

Rezept für ein neues Board

Dauer ca. 2,5-3h (incl. Zeiten fürs Compilieren)

sudo apt-add-repository universe
sudo apt-get update
sudo apt-get install ssh lm-sensors htop curl python-pip cmake
sudo dpkg -i cuda-repo-l4t-r21.3-6-5-prod_6.5-42_armhf.deb
sudo dpkg -i libopencv4tegra-repo_l4t-r21_2.4.10.1_armhf.deb
sudo apt-get update
sudo apt-get install cuda-toolkit-6-5
sudo apt-get install libopencv4tegra libopencv4tegra-dev
sudo apt-get install libboost-all-dev libblas-dev protobuf-compiler g++-4.7 libprotobuf-dev libgflags-dev libhdf5-dev libleveldb-dev libsnappy-dev liblmdb-dev libatlas-dev liblapack-dev libatlas-base-dev libjsoncpp-dev gfortran python-numpy python-matplotlib python-networkx
wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz
tar zxvf glog-0.3.3.tar.gz
./configure
make 
sudo make install
Cython
scipy
scikit-image
scikit-learn
ipython
h5py
leveldb
nose
pyyaml
pandas
python-dateutil
protobuf
python-gflags
dev01.picalike.corpex-kunden.de:/home/picalike-dev/pvt-dev/picalikeCaffe/caffeHomeMade 
git clone ssh://picalike-dev@dev01.picalike.corpex-kunden.de/home/picalike-dev/pvt-dev/tee.git
make all -j 4

export LD_LIBRARY_PATH=../caffeHomeMade/caffe/.build_release/lib:/usr/local/cuda/lib

make test -j 4
make runtest
make pycaffe
cmake .
make

Performance Mode

Der arm-Prozessor hat unterschiedliche Betriebsmodi. Abfrage des aktuellen Modus via:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Als default ist 'interactive' eingestellt, sehr ähnlich zu 'ondemand'. Optimale Laufzeiten für ConvNets erhält man mit 'performance'. Wechsel in den Performance Mode via:

$ sudo su
$ tee/scripts/maxCPU.sh 

Alternativ direkt den governor einstellen:

$ echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Feature-Extraction testen

(siehe auch Features mit caffe für Bilder bekommen) FIXME wird schrittweise hierher überführt und aktuallisiert

export LD_LIBRARY_PATH=../caffeHomeMade/caffe/.build_release/lib:/usr/local/cuda/lib

cpp Dienst

./feat_from_img models/bvlc_reference_caffenet.caffemodel settings/imagenet_val.prototxt ./socket 1 GPU
python scripts/featServer.py ./socket

python Dienst

export PYTHONPATH=/home/ubuntu/caffeHomeMade/caffe/python
python ./scripts/pyFeatServer.py

Testen

curl localhost:3141/?url=http://petattack.com/wp-content/uploads/2014/07/little_cute_cat_1920x1080.jpg\&blobNames=fc7

Globale Konfiguration für CUDA

Für cuDNN ist sicherzustellen, dass symbolische Links für die cuDNN Bibliothek in /usr/lib/ verwendet wurden:

libcudnn.so -> libcudnn.so.6.5.19*
libcudnn.so.6.5 -> libcudnn.so.6.5.19*
libcudnn.so.6.5.19*

Falls die ersten beiden Dateien keine Links sind, bitte anpassen.

Eine Datei cuda.conf in /etc/ld.so.conf.d mit folgendem Inhalt:

/usr/local/cuda-6.5/targets/armv7-linux-gnueabihf/lib/

Damit werden die Bibliotheken von CUDA global für gcc sichtbar. Zur Sicherheit nochmal

$ ldconfig

als root ausführen. Und dann sicherstellen, dass die richtige Theano-Version lokal installiert ist

pip install --user --upgrade --no-deps --ignore-installed Theano==0.7.0rc2

Für Theano sind noch weitere Anpassungen notwendig (.bashrc)

export PATH="$PATH:/usr/local/cuda/bin/"
export C_INCLUDE_PATH="$C_INCLUDE_PATH:/usr/local/cuda/include/"
export CPATH="$C_INCLUDE_PATH:/usr/local/cuda/include/"

Um sicherzustellen, dass cuDNN mit Theano verwendet wird, folgenden Export setzen:

export THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32,optimizer_including=cudnn

Als abschließenden Test, mit ipython prüfen, ob alles funktioniert hat

$ ipython
# import theano
# from theano.sandbox.cuda import dnn

Dauert etwas länger, sollte aber keine Fehler werfen.