qshinoの日記

Powershell関係と徒然なこと

機械学習/DL, 推論用モデル、フレームワーク、DNN、データ

推論モデル

  • Tensorflow
  • keras
  • ONNX caffe, pytorch, mxnet, etc

Ftamework

機械学習フレームワーク

  • keras
  • Pytorch

機械学習フレームワーク

  • Tensorflow
  • Caffe
  • chainer
  • Mxnet
  • Therano
  • CNTX

Library

  • cuDNN CUDA用DNNライブラリ
  • cuBLAS CUDA用代数ライブラリ
  • TensorRT nvidiaのDL用ライブラリ

Language

データ、ネットワーク、実装

  • imagenet
  • yolo/darknet 物体検知
  • MNIST 手書き数字認識データセット
  • CIFAR-10 画像データセット
  • mobilenet
  • SSD 物体検知
  • coco Common Object in context データセット
  • styleGAN 画像生成
  • VGGnet : 物体認識
  • googlenet
  • alexnet 2012 ILSVRC Alex Krizhevskyさん作, SuperVisionとも呼ばれる。

学会、コンペ系

ILSVRC : ImageNet Large Scale Visual Recognition Competition

  • 2012 alexnet 5cnv, 3pool, 3fc
  • 2013 ZFnet
  • 2014 Googlenet

補足

時間があれば時間軸で整理したい。

参考

TensorRT

https://developer.nvidia.com/tensorrt

CIFR-10

https://www.cs.toronto.edu/~kriz/cifar.html

http://aidiary.hatenablog.com/entry/20151014/1444827123

Raspberry Pi 4 B

2019/6/24 pi 4B 発表

価格

  • 1GB $35
  • 2GB $45
  • 4GB $55
  • 電源 $8
  • ケース $5
  • kit $120

Pi 3B+との比較

Pi4B Pi3B+ Pi3B
発表 2019/6/24 2018/3/14
wifi 802.11ac
Blutooth 5.0 4.0?
HDMI 2xTypeD/micro HDMI 1xTypeA
LAN 1G 1G/実効300M 100M
usb dev TypeC MicroB
USB Host. 3.0x2,2.0x2 2.0x4
SD MicroSDx1
CSI o o
DSI o o
CPU 1.5Ghz A72x4 1.4GHz A53x4 1.2Gx4
SoC BCM2711 BCM2837B0 BCM2837
mem LPDDR4 1-4GB LPDDR2 1GB
PoE jumper x
Power 5V 3A 5V 2.5A
4kx60fps
GLES3.x

ref

pi4b

https://www.google.com/amp/s/www.gizmodo.jp/amp/2019/06/raspberry-pi4-launch.html

pi3b+

https://www.phileweb.com/sp/review/article/201803/27/2984_3.html

mew debug

mew debug方法

と言うより、emacs上の開発中のmail readerがあれば、移行も考えたい。

トップ検索マニュアルリリースノートMLダウンロード拡張機能GitバグレポートFAQ関連リンク

バグレポートの書き方

Mewがうまく動かないときに、「〜が動きません、どうしたらいいでしょう」だけでは、誰も答えることができません。まず、Mew をどのような環境(オペレーティングシステムの種類・バージョン、Emacsの種類・バージョン、Mewのバージョン等)で利用しているのかを書きましょう。

次に症状を書きます。できるだけ具体的に、再現性があるものならその手順を簡潔に書いて下さい。

バックトレース

もしミニバッファに何らかのエラーが表示される場合は、以下の手順に従って*Backtrace*バッファに表示された内容を mew-dist に送って下さい。

もしあなたが Mew をインストールする権限を持っているのなら、まずバイトコンパイルされたファイル(mew.elcとmew-*.elc)を消して、Emacsを再び立ち上げ直して下さい。こうすることでより多くの情報を得ることができます。.elc が確実に消えたかを確認するには、Emacs を立ち上げてから Mew を起動した後 C-h f mew と入力して下さい。*Help*バッファに "an interactive Lisp function" と表示されていたら OK です。もし、"an interactive compiled Lisp function" のように "compiled" という単語があったら、.elcがうまく消えていないことになります。

*Backtrace*を得るには、*scratch*バッファに移って

(setq debug-on-error t) 

と入力して、行末の閉じ括弧の右側でC-xC-eを押して下さい。この状態でエラーを起せば、*Backtrace*バッファにいろんな情報が表示されます。*Backtrace* の内容を記録したら、Emacs を終了しましょう。そして新たに起動した Emacs を使い、その内容を mew-dist へ報告して下さい。

Mewのデバッグ機能

メールの内容を表示する際にエラーが出る場合は、

(setq mew-debug t) 

と入力し、行末の閉じ括弧の後ろでC-xC-eを押し、次にエラーを起して*Backtrace*の内容を保存して下さい。そして新たに起動した Emacs を使い、その内容を mew-dist へ報告して下さい。

POP、IMAP、SMTP、NetNews、SSH、SSL、および TLS に関し通信がうまく行かない場合は、通信内容の記録を送って下さい。上記の方法で mew-debug を tにすれば、通信内容が*Mew debug*バッファに記録されます。このバッファの内容からプライバシに関わる部分を削除して、内容を保存して下さい。そして新たに起動した Emacs を使い、その内容を mew-dist へ報告して下さい。

なお、debug-on-error と mew-debug は、バグレポートを作成するとき以外は nil にしておきましょう。これらの変数を上記のように *scratch*バッファで設定したのなら、Emacs を終了し起動し直せば元に戻ります。

DL/cuda関係スクラップ

面白い記事のスクラップ

雑記

AIの分類、できる事、これからの事。

https://note.mu/tomo_makes/n/na7676fa64380

yolo v3 on keras

yolo v3 とtiny

https://qiita.com/yoyoyo_/items/10d550b03b4b9c175d9c

TensorRT

Tensorflow + TensorRTによる推論の高速化。

TensorCoreを試す一つの方法がTensorRT。NanoのMaxwellにはTensorCoreが載っていないが、Xavier のVoltaに載っている。Xavierでなら効果を実感できるか?

同じモデルでNanoとXavierを比較するのも面白いかもしれない。

tensorrt engine

https://qiita.com/TrsNium/items/f53fcd8613d1ca61537b

nvidia tensorrt

https://developer.nvidia.com/tensorrt

tensorflow tensorRT ssd mobilenet on nano

nano のメモリで足りるか心配。 SD上でswapを使うと遅くなりそうだが、m.2 e key pcie x1 ssdもそんなに早くはなさそう。

m.2 m key pcie x4 ssdと16GBメモリのxavier devkitが10万円を切ったので、nano との棲み分けを考えた方が良さそう。

https://www.dlology.com/blog/how-to-run-tensorflow-object-detection-model-on-jetson-nano/

coco

http://cocodataset.org/

記事ではないが、参考。

google edge tpu

https://misoji-engineer.com/archives/tpu.html

coco modelを使ったチュートリアル

https://medium.com/object-detection-using-tensorflow-and-coco-pre/object-detection-using-tensorflow-and-coco-pre-trained-models-5d8386019a8

以前にリンクを貼ったかも。

SSD, Yolo精度性能比較。

少し古いので、yolov3等はなし。

https://qiita.com/tokkuman/items/3fabd04a1a524843bea5

SSD説明

少し細かい。

https://qiita.com/YutoHagiwara/items/4b66442ff1e09936f1d0

pandas

https://deepage.net/features/pandas-dataframe.html

python argparse

https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0

gpu direct rdma

https://docs.nvidia.com/cuda/gpudirect-rdma/index.html#standard-dma-transfer-example-sequence

tegra gpu

https://www.nvidia.com/ja-jp/geforce/turing/

cuda training

https://manualzz.com/doc/48821871/cuda-technical-training

tensor core code

http://proc-cpuinfo.fixstars.com/2018/10/tensorcore/

cuda related

tegra memory

https://docs.nvidia.com/cuda/cuda-for-tegra-appnote/index.html

https://docs.nvidia.com/cuda/cuda-for-tegra-appnote/index.html

cudaHostAlloc() warning出る
cudaMallocHost() warning出ない
cudaMallocManaged() uma alloc
cudaStreamAttachMemAsync(NULL, h_a, 0, cudaMemAttachGlobal); to device
cudaStreamAttachMemAsync(NULL, h_d, 0, cudaMemAttachHost) to host
don't forget
cudaStreamSynchronize(NULL);

tegra zero copy

http://arrayfire.com/zero-copy-on-tegra-k1/

cuda shared memory

http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?CUDA%A4%C7%B9%D4%CE%F3%B1%E9%BB%BB%A1%A7%BE%E8%BB%BB%28%A5%B7%A5%A7%A5%A2%A1%BC%A5%C9%A5%E1%A5%E2%A5%EA%BB%C8%CD%D1%C8%C7%29

大友さんのtensor core api

wmma api http://proc-cpuinfo.fixstars.com/2018/10/tensorcore/

cuda配列和

https://qiita.com/gyu-don/items/ef8a128fa24f6bddd342

https://gist.github.com/gyu-don/7aa8c013e966579862323a764b28f794

複数gpu

cudaSetDevice()か、下記。

numactl --cpunodebind=0 --localalloc CUDA_VISIBLE_DEVICES=0 ./a.out & numactl --cpunodebind=0 --localalloc CUDA_VISIBLE_DEVICES=1 ./a.out & numactl --cpunodebind=1 --localalloc CUDA_VISIBLE_DEVICES=2 ./a.out & numactl --cpunodebind=1 --localalloc CUDA_VISIBLE_DEVICES=3 ./a.out 

cuda basics

cuda 基礎

関数修飾子

__global__ : hostがコール、deviceが実行。
__device__ : deviceがコール、deviceが実行。
__host__ : hostが実行、hostが実行。default。

変数修飾子

バイス上で実行される関数内の変数種別。

指定なし: 組込み型はレジスタ。あふれるとローカルメモリ。非組込型はローカルメモリ
__shared__ : gpuオンチップの共有メモリ。同一スレッドブロック内で共有。ブロックが異なる場合はアクセスできない
__constant__ : デバイスの定数メモリ
__device__ : デバイスのグローバルメモリ

バイスレジスタとメモリ

f:id:qshino:20190622130004j:plain

バイスのメモリ種別。下記に加えホストのメモリがある。

  1. レジスタ、スレッド内。float4等の組込み型変数が配置される。
  2. ローカルメモリ、スレッド内。非組込型、溢れた組込型。
  3. 共有メモリ、スレッドブロック内。
  4. グローバルメモリ、全スレッド。
  5. 定数メモリ、全スレッド
  6. テキスチャメモリ、全スレッド。

組み込みベクトル型

GPU、CPUコードのどちらでも使用可能

[u]char[1..4], [u]short[1..4], [u]int[1..4], [u]long[1..4], float[1..4], double[1..2]

構造体をx、y、z、wフィールドでアクセス

  • uint4 param;
  • int y = param.y;
  • dim3 uint3に基づく次元の指定に使用 デフォルト値(1,1,1)

grid/block

kernel起動

kernel<<<dG,dB, smbytes,stream>>>(args,...)
  • dG : grid 2次元まで。グリッドのサイズ
  • dB : block 3次元まで。スレッドブロックのサイズ
  • smbytes : shared memory byte size
  • stream : stream, 同一ストリームは順次実行。デフォルト値は0

スレッドブロックの最大スレッド数は1024。

__global__ void k(int a){}

in main(){
  
  k<<<1,1>>>(1);

  dim3 g(3,4),b(2,3,4);
  k<<<g,b>>>(3);
}

スレッド内では、下記の変数が定義される。

  • gridDim
  • blockDim
  • blockIdx
  • threadIdx

index

blockは3次元まて指定可能。各次元のインデックスをidx,y,zとすると、下記により計算できる。

idx = blockDim.x * blockIdx.x + threadIdx.x

idy = blockDim.y * blockIdx.y + threadIdx.y

idy = blockDim.z * blockIdx.z + threadIdx.z

メモリ確保

cuda メモリ関数

  • cudaMalloc() : デバイスメモリ確保
  • cudaMallocHost() : pinned host mem
  • cudaHostAlloc() : new for cudaMallocHost() to avoid warning with g++
  • cudaMallocManaged() : for tegra uma
  • cudaFree() : デバイスメモリ解放
  • cudaFreeHost() : ホストメモリ解放

memory coherency

  • Host Pageable memory/H
  • Host Pinned memory/P
  • Device memory/D
  • Unified memory/U

  • CPU cached : H, U, P>=CC7.2

  • CPU uncashed : P<CC7.2
  • CPU n/a D

  • iGPU cached : D, U, P>=CC7.2

  • iGPU uncashed : P<CC7.2
  • iGPU n/a : H

  • dGPU cashed : D

  • dGPU uncashed : P
  • dGPU n/a : H, U

  • iGPU : tegra gpu

  • dGPU : pcie gpu

  • CC : Compute Capability

  • CC7.2 : Tegra on AGX Xavier, Volta 512core

cuda for tegra

https://docs.nvidia.com/cuda/cuda-for-tegra-appnote/index.html

複数gpu

cudaSetDevice()を使う。Streamでそれぞれで同期する事もできる。

http://www.e-em.co.jp/tutorial/chap10.htm

gpu間転送

gpu間転送前に

cudaDeviceEnablePeerAccess()

を実行する。

https://www.cc.kyushu-u.ac.jp/scp/support/faq/faq006.html

転送関数

  • cudaMemcpy( d, s,len, dir ) : 非pin可
  • cudaMemcpyAsync() : pinメモリ必須

memcpyはdmaで行われるため、非pinの場合は、pinメモリにコピー後に非pinメモリに転送される。つまり、2回コピーされる。

http://yusuke-ujitoko.hatenablog.com/entry/2016/02/07/222059

ref

http://cparch-mclearn.blogspot.com/2018/01/gpu-5.html?m=1

Jetson GPIO control

Jetson Nano GPIO

Jetson Nano のGPIOをpython or sh で制御。

  1. python lib install
  2. coding & run
  3. 追記: sh で制御

python3ライブラリ インストール

gpioライブラリのダウンロードから、セットアップまで。

# constant
nv=/opt/nvidia
nvg=$nv/jetson-gpio
nvgm=${nvg}-master
user=`id -un`
rules=99-rules
nvrules=$nvg/etc/$rules
udrules=/etc/udev/rules.d

# Downloading the Library 
wget https://github.com/NVIDIA/jetson-gpio/archive/master.zip 

sudo unzip master.zip -d $nv

# ls -l $nv

sudo rm -rf $nvg
mv $nvgm $nvg
# ls -l $nvg

# Install Python Library 
cd $nvg

# python3 
sudo python3 setup.py install 

# python2 
# sudo python setup.py install 

# Setting User Permissions 
sudo groupadd -f -r gpio
sudo usermod -aG gpio $user 

# Install custom udev rules 
# cat $nvrules
sudo cp $nvrules $udrules/

# Reload the udev rules 
sudo udevadm control --reload-rules && sudo udevadm trigger

gpio control

pythonからgpio制御

  • pin 15 : LED
  • pin 13 : button in
import Jetson.GPIO as GPIO

def gptest():
    led= 15         # pun 15 out to led
    button = 13 # pin 13 from button
    GPIO.setmode(GPIO.BOARD)     
    GPIO.setup(led, GPIO.OUT) 
    GPIO.output(led, GPIO.HIGH) 
    GPIO.output(led, GPIO.LOW) 
    GPIO.setup(button, GPIO.IN) 
    GPIO.input(button) 
    GPIO.cleanup()

if( __name__ == '__main__' ):
    main()

cli

コマンドで制御する場合

# Map GPIO Pin
# gpio79 is pin 12 on the Jetson Nano
$ echo 79 > /sys/class/gpio/export
# Set Direction
$ echo out > /sys/class/gpio/gpio79/direction
# Bit Bangin'!
$ echo 1 > /sys/class/gpio/gpio79/value
$ echo 0 > /sys/class/gpio/gpio79/value
# Unmap GPIO Pin
$ echo 79 > /sys/class/gpio/unexport
# Query Status
$ cat /sys/kernel/debug/gpio

ref

article

https://www.jetsonhacks.com/2019/06/07/jetson-nano-gpio/

Jetson Nano J41 header pinout

https://www.jetsonhacks.com/nvidia-jetson-nano-j41-header-pinout/

日本語記事

http://www.neko.ne.jp/~freewing/raspberry_pi/nvidia_jetson_nano_gpio_blink_led_switch/