====== 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@ 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@ 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. (tof)
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)
* 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/
* cuda und openCV für L4T von nvidia installieren {{/dokuwiki/lib/images/smileys/fixme.gif|FIXME}} (Daten noch für uns auf Server kopieren)
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 [[caffe_zur_feat.extraktion|Features mit caffe für Bilder bekommen]]) {{/dokuwiki/lib/images/smileys/fixme.gif|FIXME}} 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.