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
(uboot) http://demotomohiro.github.io/hardware/jetson_tk1/setup/sdcard.html
(recovery mode) https://demotomohiro.github.io/hardware/jetson_tk1/setup/recovery_mode.html
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)
- Board via USB mit dem R21.3 flashen
sudo apt-add-repository universe sudo apt-get update
- Pakete installieren
sudo apt-get install ssh lm-sensors htop curl python-pip cmake
- authorized_keys nach .ssh/
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
- Pakete installieren
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
- glog installieren
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
- Pakete für Python installieren (sudo pip install)
Cython scipy scikit-image scikit-learn ipython h5py leveldb nose pyyaml pandas python-dateutil protobuf python-gflags
- cuDNN von nvidia installieren (caffe compiliert aktuell nur mit dem cudnn-6.5-linux-armv7-R1) - Die libs nach /usr/lib/ , die header nach /usr/include/
- caffeHomeMade kopieren
dev01.picalike.corpex-kunden.de:/home/picalike-dev/pvt-dev/picalikeCaffe/caffeHomeMade
- tee Repository clonen
git clone ssh://picalike-dev@dev01.picalike.corpex-kunden.de/home/picalike-dev/pvt-dev/tee.git
- caffe bauen (Makefile.config anpassen wegen CPU_ONLY, USE_CUDNN, CUSTOM_CXX)
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
- tee bauen (CMakeList.txt anpassen z.B. CPU/GPU)
cmake . make
- Installation testen
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) wird schrittweise hierher überführt und aktuallisiert
export LD_LIBRARY_PATH=../caffeHomeMade/caffe/.build_release/lib:/usr/local/cuda/lib
cpp Dienst
- Dienst starten (im Verzeichnis tee/)
./feat_from_img models/bvlc_reference_caffenet.caffemodel settings/imagenet_val.prototxt ./socket 1 GPU python scripts/featServer.py ./socket
python Dienst
- Dienst starten (im Verzeichnis tee/)
export PYTHONPATH=/home/ubuntu/caffeHomeMade/caffe/python python ./scripts/pyFeatServer.py
Testen
- Testbild abfragen
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.