Google Coral USB Accelerator を試す

Google Coral USB Accelerator を試すことにする。

f:id:pongsuke:20190904163750j:plain

f:id:pongsuke:20190904163726j:plain

f:id:pongsuke:20190904163745j:plain

製品情報

coral.withgoogle.com

Features
Google Edge TPU ML accelerator coprocessor
USB 3.0 Type-C socket
Supports Debian Linux on host CPU
Requirementslink
Any Linux computer with a USB port
Debian 6.0 or higher, or any derivative thereof (such as Ubuntu 10.0+)
System architecture of either x86-64 or ARM32/64 with ARMv8 instruction set
And yes, this means Raspberry Pi is supported. However, we officially support only Raspberry Pi 2/3 Model B/B+ running Raspbian. Unofficially, support for Raspberry Pi Zero is also available (install the TAR from GitHub on your Pi Zero, instead of the one below).

Also note that you should connect to a USB 3.0 port for the fastest inferencing speed; if you connect to a USB 2.0 port, inferencing is much slower.

USB 3.0?

Also note that you should connect to a USB 3.0 port for the fastest inferencing speed; if you connect to a USB 2.0 port, inferencing is much slower.

USB3.0じゃないと、おそくなるよー、、、と言うことだ。

購入

Google Coral Edge TPU USB Accelerator G950-01456-01の通販ならマルツオンライン

TPUってなに?

テンサー・プロセッシング・ユニット(Tensor processing unit、TPU)はGoogleが開発した機械学習に特化した特定用途向け集積回路(ASIC) テンソル・プロセッシング・ユニット - Wikipedia

Coral USB Accelerator は何がすごい?

省電力で、非力なマシンでのAI推論を実現する。

セットアップ

注意事項その1 周波数と温度

Caution: During installation, you'll be asked, "Would you like to enable the maximum operating frequency?" Enabling this option improves the the inferencing speed but it also causes the USB Accelerator to become very hot to the touch during operation and might cause burn injuries. If you're not sure you need the increased performance, type N and press Enter to use the default operating frequency. (You can change this later by simply re-running the install script.)

最大の周波数にする? みたいなオプションが出るが、 Yes にすると、かなり熱くなるということだ。

注意事項その2 Pythonのバージョン

セットアップスクリプトでは、 Python3.5 が指定されているらしい。

別に3.5 upper ならいいらしいので、3.6を使用する場合などは、 python3 と書き換えて構わないらしい。

けども! 3.7 は正式にサポート出来ていないから、3.7を使用する場合には、以下のコマンドを実行せよ! とのことだ。

RPI3B+ でエラー

$ sudo rpi-update

$ python3 --version
Python 3.7.3

$ sudo edgetpu_api/install.sh
 ...
Would you like to enable the maximum operating frequency? Y/N
Y

 ...

Done.
Installing device rule file [/etc/udev/rules.d/99-edgetpu-accelerator.rules]...
Done.
Installing Edge TPU runtime library [/usr/lib/aarch64-linux-gnu/libedgetpu.so.1.0]...
cp: 通常ファイル '/usr/lib/aarch64-linux-gnu/libedgetpu.so.1.0' を作成できません: そのようなファイルやディレクトリは
ありません

あれまぁ・・・。

$ uname -m
aarch64

$ getconf LONG_BIT
32

どうやら、aarch64として設定しようとしてくれているけど、普通に Raspbian buster をインストールした場合、32bit で動いているら、そして、クロスコンパイラ?(よくわかっていません)も、はいっていないから、インストールの切り分けを修正する必要が有った。

なお、rpi-update しない状態では、

 $ uname -m
armv7l

ということで、普通に入りました。

Python 3.7 対応

cd /usr/local/lib/python3.7/dist-packages/edgetpu/swig/
        
sudo cp _edgetpu_cpp_wrapper.cpython-35m-arm-linux-gnueabihf.so _edgetpu_cpp_wrapper.cpython-37m-arm-linux-gnueabihf.so

PRI4

$ uname -m
armv7l

GitHub - leswright1977/RPi4-Google-Coral: Google Coral on the Raspberry Pi 4

こちらを使用させていただく。

$ sudo edgetpu_api/install.sh
 ...
Done.
Installing device rule file [/etc/udev/rules.d/99-edgetpu-accelerator.rules]...
Done.
Installing Edge TPU runtime library [/usr/lib/arm-linux-gnueabihf/libedgetpu.so.1.0]...
Done.
Installing Edge TPU Python API...
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Processing ./edgetpu_api/edgetpu-2.11.1-py3-none-any.whl
Installing collected packages: edgetpu
Successfully installed edgetpu-2.11.1
Done.
Lib Fu.

接続

指す!

$ lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 1a6e:089a Global Unichip Corp. 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

サンプルスクリプトの実行

$ cd /usr/local/lib/python3.7/dist-packages/edgetpu/demo/
$ python3 classify_image.py --model ~/Downloads/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --label ~/Downloads/inat_bird_labels.txt --image ~/Downloads/parrot.jpg
INFO: Initialized TensorFlow Lite runtime.
---------------------------
Ara macao (Scarlet Macaw)
Score :  0.76171875

Edge TPU 向けの Modelたち

coral.withgoogle.com

SPI を使用する - JETSON NANO 開発者キット その5

SPI を使用したい!

ところが、デフォルトではOFFになっている。
そして、ONにするのが、想像以上に面倒であった・・・。

Jetson NanoのSPIを有効にする – RT Robot Shop Blog

メモ

$ lsusb 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 0955:7f21 NVidia Corp. 
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 0557:2221 ATEN International Co., Ltd Winbond Hermon
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

$ git clone https://github.com/rt-net/JetsonNano_DT_SPI.git
$ cd JetsonNano_DT_SPI/ 

$ ./run.sh

 yes/no ?

*** The [DTB] has been updated successfully. ***

リカバリーモードを解除(ジャンパーピンを抜く)して、起動

$ sudo cat /sys/kernel/debug/tegra_gpio
Name:Bank:Port CNF OE OUT IN INT_STA INT_ENB INT_LVL
 A: 0:0 64 40 40 04 00 00 000000
 B: 0:1 f0 00 00 00 00 00 000000
 C: 0:2 00 00 00 00 00 00 000000
 D: 0:3 00 00 00 00 00 00 000000
 E: 1:0 40 00 00 00 00 00 000000
 F: 1:1 00 00 00 00 00 00 000000
 G: 1:2 0c 00 00 04 00 00 000000
 H: 1:3 fd 99 00 60 00 00 000000
 I: 2:0 07 05 00 02 00 00 000000
 J: 2:1 f0 00 00 00 00 00 000000
 K: 2:2 00 00 00 00 00 00 000000
 L: 2:3 00 00 00 00 00 00 000000
 M: 3:0 00 00 00 00 00 00 000000
 N: 3:1 00 00 00 00 00 00 000000
 O: 3:2 00 00 00 00 00 00 000000
 P: 3:3 00 00 00 00 00 00 000000
 Q: 4:0 00 00 00 00 00 00 000000
 R: 4:1 00 00 00 00 00 00 000000
 S: 4:2 a0 80 00 00 00 00 000000
 T: 4:3 01 01 00 00 00 00 000000
 U: 5:0 00 00 00 00 00 00 000000
 V: 5:1 03 00 00 02 00 00 000000
 W: 5:2 00 00 00 00 00 00 000000
 X: 5:3 78 08 08 70 00 60 606000
 Y: 6:0 06 00 00 02 00 00 000000
 Z: 6:1 0f 08 08 00 00 02 020600
AA: 6:2 00 00 00 00 00 00 000000
BB: 6:3 01 00 00 00 00 00 000000
CC: 7:0 12 00 00 10 00 12 121200
DD: 7:1 01 00 00 00 00 00 000000
EE: 7:2 00 00 00 00 00 00 000000
FF: 7:3 00 00 00 00 00 00 000000

spidev_test

Jetson/TX2 SPI - eLinux.org

動作テストには、19pin と 21pin を直結して、 spidev_test しれってかいてある。

ソースコードが見当たらなかったので、拾ってきてコンパイルした。

$ sudo CROSS_COMPILE=/usr/bin/aarch64-linux-gnu- make

spidev_fdx.c と spidev_test.c

$ sudo ./spidev_test
 -D /dev/spidev0.0 
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
RX | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................................

$ sudo ./spidev_test -D /dev/spidev0.0 
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
RX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D  | ......@.......................

Jetso nano セットアップ 2019-05-31 ver

2代目をセットアップする機会があったのでメモ

f:id:pongsuke:20190716162434p:plain
jetson nano

img は 2019-05-31 ver

Getting Started With Jetson Nano Developer Kit | NVIDIA Developer

Miscro SDカードを SD card formatter でクイックフォーマット

Etcher で、IMGを焼き付ける

物理的に差し込んで、電源を入れる

許諾にOKを出し、言語設定等を済ませる

Applying changes で、停止する・・・?

https://devtalk.nvidia.com/default/topic/1049751/jetson-nano/hangs-at-first-boot-at-quot-waiting-for-unattended-upgr-to-exit-quot-/

フォーラムにありますが、45分待てば良いとのこと。

キャンセルしても問題ないでしょうが、今回は待ってみました。
確かに、45分ほど経過し、再起動しました。

初期設定

IP固定

起動時GUIになっているので、GUIで設定しました。

右上のバーからnetwrok設定を選択肢、ipv4 setting をいじる。
再起動

swapメモリ作成
$ git clone https://github.com/JetsonHacksNano/installSwapfile
$ cd installSwapfile/
$ ./installSwapfile

$ free
              total        used        free      shared  buff/cache   available
Mem:        4058432      640544     3000412       19096      417476     3248224
Swap:       6291452           0     6291452

Vino

Getting Started with the NVIDIA Jetson Nano Developer Kit

上記の通りに一通りやった結果として、先にログインして有れば起動する状態になりました。

Versionなど

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

$ python --version
Python 2.7.15+

$ python3 --version
Python 3.6.8

$ python -c "import cv2; print (cv2.__version__)"
3.3.1

$ python3 -c "import cv2; print (cv2.__version__)"
3.3.1

ファンを付ける

$ sudo sh -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'

起動時に有効にしたいので、/etc/rc.local にも入れておく。

CUDA サンプル

$ cp -a /usr/local/cuda-10.0/samples/ ~/
$ cd samples
$ make -j 4

$ cd ./1_Utilities/deviceQuery
$ ./deviceQuery 
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "NVIDIA Tegra X1"
  CUDA Driver Version / Runtime Version          10.0 / 10.0
  CUDA Capability Major/Minor version number:    5.3
  Total amount of global memory:                 3963 MBytes (4155834368 bytes)
  ( 1) Multiprocessors, (128) CUDA Cores/MP:     128 CUDA Cores
  GPU Max Clock rate:                            922 MHz (0.92 GHz)
  Memory Clock rate:                             13 Mhz
  Memory Bus Width:                              64-bit
  L2 Cache Size:                                 262144 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            Yes
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            No
  Supports Cooperative Kernel Launch:            No
  Supports MultiDevice Co-op Kernel Launch:      No
  Device PCI Domain ID / Bus ID / location ID:   0 / 0 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.0, CUDA Runtime Version = 10.0, NumDevs = 1
Result = PASS

vnc4server

フレームバッファリングがおかしいのか、チカチカしたり、更新が遅れたりするのと、コンソールでログインが必須なので、vnc4server に切り替える。

また、ログインに成功しても、デスクトップが出ないので、gnome-panel などを入れて、xstartup を修正する。

こちらから学びました

2019年04月19日 : limepikoのblog

$ sudo apt-get intall vnc4server
$ sudo apt install gnome-panel gnome-settings-daemon metacity

$ cat ~/.vnc/xstartup
#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &

export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
exec gnome-session &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &

Tensorflow

TensorFlow For Jetson Platform :: Deep Learning Frameworks Documentation

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> tf.__version__
'1.13.1

GPIOについて - JETSON NANO 開発者キット その5

f:id:pongsuke:20190806165343j:plain

GPIOについて

Jetson Nano GPIO - JetsonHacks

Raspberry Pi の 40pin と互換性があるとこのと。

特に、最初から img に含まれている

GitHub - NVIDIA/jetson-gpio: A Python library that enables the use of Jetson's GPIOs

は、RPi.GPIO と強い互換性があるらしい。

電圧は 3.3V

Pin layout

NVIDIA Jetson Nano J41 Header Pinout - JetsonHacks

jetson-gpio

ガイドを見ると、user を GPIO グループに参加させるなど、RPIに似ている。

RPIでは、デフォルトの pi user が、最初から GPIOに入っていて、誰でもすぐに試せるが、Jetson nano では、グループ作成からやるっぽい。

jetson-gpio

$ ls /opt/nvidia/jetson-gpio/
doc  etc  lib  samples

$ sudo pip3 install Jetson.GPIO

$ sudo groupadd -f -r gpio
$ sudo usermod -a -G gpio your_user_name

$ sudo cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/
$ sudo udevadm control --reload-rules && sudo udevadm trigger

動作テスト

import RPi.GPIO as GPIO
import time

output_pin  = 21

def main():
    # Pin Setup:
    # Board pin-numbering scheme
    GPIO.setmode(GPIO.BCM)
    # set pin as an output pin with optional initial state of HIGH
    GPIO.setup(output_pin, GPIO.OUT, initial=GPIO.HIGH)

    print("Starting demo now! Press CTRL+C to exit")
    curr_value = GPIO.HIGH
    try:
        while True:
            time.sleep(1)
            # Toggle the output every second
            print("Outputting {} to pin {}".format(curr_value, output_pin))
            GPIO.output(output_pin, curr_value)
            curr_value ^= GPIO.HIGH
    finally:
        GPIO.cleanup()

if __name__ == '__main__':
    main()

チカチカしました。

OpenCVコンパイルと Python Darknet - JETSON NANO 開発者キット その4

Darknet の Python スクリプトを、WEBカメラで試したい。

OpenCV

Jetson pack には、opencv 3.3 が有効化されているけれども、Pythonから呼び出す方法がわからなかったので、コンパイルしました。

しかし、OpenCVコンパイルは大変です。。。

準備

デフォルトの設定のままだと、RAMが不足するらしい。

スワップを作っておきます。

JETSON NANO 開発者キット を試す その3 - 機械学習備忘録

で、起動時に 6G のスワップメモリを確保しています。

自動コンパイル&インストールスクリプト

JEP/script at master · AastaNV/JEP · GitHub

こちから、 install_opencv4.0.0_Nano.sh を取得します。

改変

Version 4.0 から 4.1へ変更し、PKGCONFIG を吐き出すようにします。

改変作業

version の 4.0 の文字列を全て 4.1 に変更。

make の引数に、

-D OPENCV_GENERATE_PKGCONFIG=ON

を追加。

そして、

$ mkdir opencv
$ sh install_opencv4.0.0_Nano.sh opencv

 ...

$ python3 -c "import cv2; print (cv2.__version__)"
4.1.0

4時間ほどかかりました。

Darknet

インストール

通常パッケージではなく、こっちを使う。

github.com

こことの関連は、調査中

https://github.com/pjreddie/darknet

pkg-config --modversion opencv

ldd darknet

などすると、見当たらないので、.bashrc に path を追加し、

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

ファイル名を合わせる。(シンボリックリンクの方が良いかも)

$ cd /usr/local/lib/pkgconfig/
$ sudo cp opencv4.pc opencv.pc

Python から Darknet を使用する

めも (要整理)

疑問

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)

しても、 cap.get(cap.set(cv2.CAP_PROP_FRAME_WIDTH) すると、デフォルト値から変わっていない。
だが、

ret, frame = cap.read() print( frame.shape )

すると、ちゃんと変わっている。なんだろうか。

Raspberry pi 4 model B を試す

RPI4 なら、いろいろできるかもしれない?

試してみます。

Tensorflow を動かす

$ sudo apt install libatlas-base-dev

$ pip3 install tensorflow --user

動作確認まで

$ python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
WARNING: Logging before flag parsing goes to stderr.
W0711 11:25:13.680072 3069655760 deprecation_wrapper.py:118] From /home/kiyo/.local/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.AUTO_REUSE is deprecated. Please use tf.compat.v1.AUTO_REUSE instead.

W0711 11:25:13.680785 3069655760 deprecation_wrapper.py:118] From /home/kiyo/.local/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.AttrValue is deprecated. Please use tf.compat.v1.AttrValue instead.

W0711 11:25:13.681129 3069655760 deprecation_wrapper.py:118] From /home/kiyo/.local/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.COMPILER_VERSION is deprecated. Please use tf.version.COMPILER_VERSION instead.

W0711 11:25:13.681412 3069655760 deprecation_wrapper.py:118] From /home/kiyo/.local/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.CXX11_ABI_FLAG is deprecated. Please use tf.sysconfig.CXX11_ABI_FLAG instead.

W0711 11:25:13.681687 3069655760 deprecation_wrapper.py:118] From /home/kiyo/.local/lib/python3.7/site-packages/tensorflow/__init__.py:98: The name tf.ConditionalAccumulator is deprecated. Please use tf.compat.v1.ConditionalAccumulator instead.

>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>>

Keras Mnist Fashion を試す

試しました。 動きました。

Darknet

github.com

$ git clone https://github.com/pjreddie/darknet
$ cd darknet
$ make

$ ./darknet detector test cfg/coco.data cfg/yolov2.cfg yolov2.weights data/person.jpg 
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs
    1 max          2 x 2 / 2   608 x 608 x  32   ->   304 x 304 x  32
    2 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64  3.407 BFLOPs
    3 max          2 x 2 / 2   304 x 304 x  64   ->   152 x 152 x  64
    4 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs
    5 conv     64  1 x 1 / 1   152 x 152 x 128   ->   152 x 152 x  64  0.379 BFLOPs
    6 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs
    7 max          2 x 2 / 2   152 x 152 x 128   ->    76 x  76 x 128
    8 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
    9 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
   10 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
   11 max          2 x 2 / 2    76 x  76 x 256   ->    38 x  38 x 256
   12 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs
   13 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256  0.379 BFLOPs
   14 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs
   15 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256  0.379 BFLOPs
   16 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs
   17 max          2 x 2 / 2    38 x  38 x 512   ->    19 x  19 x 512
   18 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs
   19 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512  0.379 BFLOPs
   20 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs
   21 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512  0.379 BFLOPs
   22 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs
   23 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024  6.814 BFLOPs
   24 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024  6.814 BFLOPs
   25 route  16
   26 conv     64  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x  64  0.095 BFLOPs
   27 reorg              / 2    38 x  38 x  64   ->    19 x  19 x 256
   28 route  27 24
   29 conv   1024  3 x 3 / 1    19 x  19 x1280   ->    19 x  19 x1024  8.517 BFLOPs
   30 conv    425  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 425  0.314 BFLOPs
   31 detection
mask_scale: Using default '1.000000'
Loading weights from yolov2.weights...Done!
data/person.jpg: Predicted in 71.214195 seconds.
horse: 82%
dog: 86%
person: 86%

$ wget https://pjreddie.com/media/files/yolov2-tiny-voc.weights

$ ./darknet detector test cfg/voc.data cfg/yolov2-tiny-voc.cfg yolov2-tiny-voc.weights data/dog.jpg

なかなか遅いですね。

f:id:pongsuke:20190711115417j:plain
Darknet

Darknet nnpack

github.com

python3 に書き換えて実行するのだが、先に、

sudo apt-get -y install re2c

しておく。

コンパイルまで

$ sudo pip3 install --upgrade git+https://github.com/Maratyszcza/PeachPy
$ sudo pip3 install --upgrade git+https://github.com/Maratyszcza/confu

$ cd
$ git clone https://github.com/ninja-build/ninja.git
$ cd ninja
$ git checkout release
$ ./configure.py --bootstrap
$ export NINJA_PATH=$PWD

$ sudo apt-get install clang
$ Install NNPACK-darknet

$ cd
$ git clone https://github.com/digitalbrain79/NNPACK-darknet.git
$ cd NNPACK-darknet
$ confu setup
$ python3 ./configure.py --backend auto
$ $NINJA_PATH/ninja
$sudo cp -a lib/* /usr/lib/
$sudo cp include/nnpack.h /usr/include/
$sudo cp deps/pthreadpool/include/pthreadpool.h /usr/include/
$Build darknet-nnpack

$ cd
$ git clone https://github.com/digitalbrain79/darknet-nnpack.git
$ cd darknet-nnpack
$ make

weight ファイル

weight ファイルを取得する。

yolov3 はここ。

pjreddie.com

yolov2 はここ。

pjreddie.com

実行

$ ./darknet detector test cfg/coco.data cfg/yolov2.cfg yolov2.weights data/person.j
pg
layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs
    1 max          2 x 2 / 2   608 x 608 x  32   ->   304 x 304 x  32
    2 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64  3.407 BFLOPs
    3 max          2 x 2 / 2   304 x 304 x  64   ->   152 x 152 x  64
    4 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs
    5 conv     64  1 x 1 / 1   152 x 152 x 128   ->   152 x 152 x  64  0.379 BFLOPs
    6 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs
    7 max          2 x 2 / 2   152 x 152 x 128   ->    76 x  76 x 128
    8 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
    9 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
   10 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
   11 max          2 x 2 / 2    76 x  76 x 256   ->    38 x  38 x 256
   12 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs
   13 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256  0.379 BFLOPs
   14 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs
   15 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256  0.379 BFLOPs
   16 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs
   17 max          2 x 2 / 2    38 x  38 x 512   ->    19 x  19 x 512
   18 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs
   19 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512  0.379 BFLOPs
   20 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs
   21 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512  0.379 BFLOPs
   22 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs
   23 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024  6.814 BFLOPs
   24 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024  6.814 BFLOPs
   25 route  16
   26 conv     64  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x  64  0.095 BFLOPs
   27 reorg              / 2    38 x  38 x  64   ->    19 x  19 x 256
   28 route  27 24
   29 conv   1024  3 x 3 / 1    19 x  19 x1280   ->    19 x  19 x1024  8.517 BFLOPs
   30 conv    425  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 425  0.314 BFLOPs
   31 detection
mask_scale: Using default '1.000000'
Loading weights from yolov2.weights...Done!
data/person.jpg: Predicted in 4.701867 seconds.
horse: 82%
dog: 86%
person: 86%

$ ./darknet detector test cfg/coco.data cfg/yolov2-tiny.cfg yolov2-tiny.weights data/person.jpg
layer     filters    size              input                output
    0 conv     16  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  16  0.150 BFLOPs
    1 max          2 x 2 / 2   416 x 416 x  16   ->   208 x 208 x  16
    2 conv     32  3 x 3 / 1   208 x 208 x  16   ->   208 x 208 x  32  0.399 BFLOPs
    3 max          2 x 2 / 2   208 x 208 x  32   ->   104 x 104 x  32
    4 conv     64  3 x 3 / 1   104 x 104 x  32   ->   104 x 104 x  64  0.399 BFLOPs
    5 max          2 x 2 / 2   104 x 104 x  64   ->    52 x  52 x  64
    6 conv    128  3 x 3 / 1    52 x  52 x  64   ->    52 x  52 x 128  0.399 BFLOPs
    7 max          2 x 2 / 2    52 x  52 x 128   ->    26 x  26 x 128
    8 conv    256  3 x 3 / 1    26 x  26 x 128   ->    26 x  26 x 256  0.399 BFLOPs
    9 max          2 x 2 / 2    26 x  26 x 256   ->    13 x  13 x 256
   10 conv    512  3 x 3 / 1    13 x  13 x 256   ->    13 x  13 x 512  0.399 BFLOPs
   11 max          2 x 2 / 1    13 x  13 x 512   ->    13 x  13 x 512
   12 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   13 conv    512  3 x 3 / 1    13 x  13 x1024   ->    13 x  13 x 512  1.595 BFLOPs
   14 conv    425  1 x 1 / 1    13 x  13 x 512   ->    13 x  13 x 425  0.074 BFLOPs
   15 detection
mask_scale: Using default '1.000000'
Loading weights from yolov2-tiny.weights...Done!
data/person.jpg: Predicted in 0.652822 seconds.
horse: 92%
dog: 92%
person: 91%

$ ./darknet detector test cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights data/person.jpg
layer     filters    size              input                output
    0 conv     16  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  16  0.150 BFLOPs
    1 max          2 x 2 / 2   416 x 416 x  16   ->   208 x 208 x  16
    2 conv     32  3 x 3 / 1   208 x 208 x  16   ->   208 x 208 x  32  0.399 BFLOPs
    3 max          2 x 2 / 2   208 x 208 x  32   ->   104 x 104 x  32
    4 conv     64  3 x 3 / 1   104 x 104 x  32   ->   104 x 104 x  64  0.399 BFLOPs
    5 max          2 x 2 / 2   104 x 104 x  64   ->    52 x  52 x  64
    6 conv    128  3 x 3 / 1    52 x  52 x  64   ->    52 x  52 x 128  0.399 BFLOPs
    7 max          2 x 2 / 2    52 x  52 x 128   ->    26 x  26 x 128
    8 conv    256  3 x 3 / 1    26 x  26 x 128   ->    26 x  26 x 256  0.399 BFLOPs
    9 max          2 x 2 / 2    26 x  26 x 256   ->    13 x  13 x 256
   10 conv    512  3 x 3 / 1    13 x  13 x 256   ->    13 x  13 x 512  0.399 BFLOPs
   11 max          2 x 2 / 1    13 x  13 x 512   ->    13 x  13 x 512
   12 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   13 conv    256  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 256  0.089 BFLOPs
   14 conv    512  3 x 3 / 1    13 x  13 x 256   ->    13 x  13 x 512  0.399 BFLOPs
   15 conv    255  1 x 1 / 1    13 x  13 x 512   ->    13 x  13 x 255  0.044 BFLOPs
   16 yolo
   17 route  13
   18 conv    128  1 x 1 / 1    13 x  13 x 256   ->    13 x  13 x 128  0.011 BFLOPs
   19 upsample            2x    13 x  13 x 128   ->    26 x  26 x 128
   20 route  19 8
   21 conv    256  3 x 3 / 1    26 x  26 x 384   ->    26 x  26 x 256  1.196 BFLOPs
   22 conv    255  1 x 1 / 1    26 x  26 x 256   ->    26 x  26 x 255  0.088 BFLOPs
   23 yolo
Loading weights from yolov3-tiny.weights...Done!
data/person.jpg: Predicted in 0.670556 seconds.
horse: 94%
dog: 91%
dog: 90%
person: 86%

f:id:pongsuke:20190711162524j:plain
Yolo v2

なお、yolov3 は、 Segmentation fault でした。

WEBカメラ

demo で動くし、映像モデルし、エラーも吐かないが、何もディレクトしない。

なんだろうか?

4A起動給電やSwapメモリ, クロック数の変更, CUDAサンプル実行 - JETSON NANO 開発者キット その3

JETSON NANO 開発者キット を試す その3

その他拡張

www.jetsonhacks.com

この Jetson hacks というサイトを見ると、いろいろ情報が出てくる。公式さいとなのかな?

5V4A

5V4A での動作方法について書いてある。

Jetson Nano - Use More Power! - JetsonHacks

スワップメモリの作成

Jetson Nano - Use More Memory! - JetsonHacks

$ git clone https://github.com/JetsonHacksNano/installSwapfile 

:~/installSwapfile$ ./installSwapfile.sh 
Creating Swapfile at:  /mnt
Swapfile Size:  6G
Automount:  Y
-rw-r--r-- 1 root root 6.0G  423 22:28 swapfile
-rw------- 1 root root 6.0G  423 22:28 swapfile
Setting up swapspace version 1, size = 6 GiB (6442446848 bytes)
no label, UUID=db94d31a-7bec-439a-ac17-8cccd0d5ebba
Filename                                Type            Size    Used    Priority
/mnt/swapfile                           file            6291452 0       -1
Modifying /etc/fstab to enable on boot
/mnt/swapfile
Swap file has been created
Reboot to make sure changes are in effect

$ free
              total        used        free      shared  buff/cache   available
Mem:        4059712      549092     3131308       18896      379312     3340012
Swap:       6291452           0     6291452

クロックスを上げる

$ sudo jetson_clocks --show
SOC family:tegra210  Machine:jetson-nano
Online CPUs: 0-3
CPU Cluster Switching: Disabled
cpu0: Online=1 Governor=schedutil MinFreq=102000 MaxFreq=1428000 CurrentFreq=1428000 IdleStates: WFI=1 c7=1 
cpu1: Online=1 Governor=schedutil MinFreq=102000 MaxFreq=1428000 CurrentFreq=1326000 IdleStates: WFI=1 c7=1 
cpu2: Online=1 Governor=schedutil MinFreq=102000 MaxFreq=1428000 CurrentFreq=1428000 IdleStates: WFI=1 c7=1 
cpu3: Online=1 Governor=schedutil MinFreq=102000 MaxFreq=1428000 CurrentFreq=1326000 IdleStates: WFI=1 c7=1 
GPU MinFreq=76800000 MaxFreq=921600000 CurrentFreq=76800000
EMC MinFreq=204000000 MaxFreq=1600000000 CurrentFreq=1600000000 FreqOverride=0
Fan: speed=0
NV Power Mode: MAXN

冷却ファンを足す

ヒートシンクに、ネジ穴が空いていて、ファンを取り付けられるようになっている。

5V の PWM制御できるやつ。サイズは 40mm

ファンの制御

$ sudo sh -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'

Cuda サンプルを一通り動かす

第563回 NVIDIA Jetson Nano Developer KitにUbuntuをインストールしよう!:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

$ cp -a /usr/local/cuda-10.0/samples/ ~/
$ cd ~/samples/1_Utilities/deviceQuery
$ make
$ $ ./deviceQuery 
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "NVIDIA Tegra X1"
  CUDA Driver Version / Runtime Version          10.0 / 10.0
  CUDA Capability Major/Minor version number:    5.3
  Total amount of global memory:                 3965 MBytes (4157145088 bytes)
  ( 1) Multiprocessors, (128) CUDA Cores/MP:     128 CUDA Cores
  GPU Max Clock rate:                            922 MHz (0.92 GHz)
  Memory Clock rate:                             13 Mhz
  Memory Bus Width:                              64-bit
  L2 Cache Size:                                 262144 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            Yes
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            No
  Supports Cooperative Kernel Launch:            No
  Supports MultiDevice Co-op Kernel Launch:      No
  Device PCI Domain ID / Bus ID / location ID:   0 / 0 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.0, CUDA Runtime Version = 10.0, NumDevs = 1
Result = PASS
$ cd ~/samples/5_Simulations/oceanFFT/
$ make
$ ./oceanFFT

f:id:pongsuke:20190424102112p:plain

$ cd ~/samples/5_Simulations/smokeParticles/
$ make
make: Nothing to be done for 'all'

$ ./smokeParticles

f:id:pongsuke:20190424102414p:plain

$ cd ~/samples/5_Simulations/nbody/
$ make
$ ./nbody

f:id:pongsuke:20190424102731p:plain

$ mkdir ~/visionworks/
$ cd /usr/share/visionworks/sources/
$ ./install-samples.sh ~/visionworks/
$ ./install-samples.sh ~/visionworks/
Creating the /home/kiyo/visionworks//VisionWorks-1.6-Samples directory...
Copying VisionWorks samples to /home/kiyo/visionworks//VisionWorks-1.6-Samples...
Finished copying VisionWorks samples

$ cd ~/visionworks/VisionWorks-1.6-Samples/demos/hough_transform/
$ make

Darknet install

メモだけ

エラー

cudnn not found でたので、 ~/.bash_rc に、2行追加。

CUDA and cuDNN paths

export PATH=/usr/local/cuda-10.0/bin/:${PATH} export LD_LIBRARY_PATH=/usr/lib/aarch64-linux-gnu/::${LD_LIBRARY_PATH}

$ git clone https://github.com/pjreddie/darknet.git
$ cd darknet
$ make

$ ./darknet 
usage: ./darknet <function>

OOM

Out of memory: Kill process 13202 (darknet) score 52 or sacrifice child

cfg の subdivisions を変更する。

元:subdivisions=16
新:subdivisions=32