FC2ブログ

[AI]Jetson Nano

きっかけから購入まで

https://shop.cqpub.co.jp/detail/2359/
トランジスタ技術 2019年9月号のJetson Nano特集が面白そうだったので、購入してみた。

99ドルといいつつ、国内で買うにはもろもろ入って秋月電子が安い方かと思いぽちっと。
http://akizukidenshi.com/catalog/g/gM-14393/

電源アダプタも出力5V4Aの手持ちがなかったし、動作確認済との事なので一緒に購入した。
http://akizukidenshi.com/catalog/g/gM-10660/

microSDは手持ちを使う。


初期セットアップから起動まで

こちらを参考させて頂く。
https://qiita.com/tsutof/items/66e68c75b462c4faf1cb

OSイメージを入手するため、以下へアクセス。
https://developer.nvidia.com/embedded/downloads
Jetson Download Center

 > For only the Jetson Nano Developer Kit の中の SD card Imageリンクをクリックするとイメージのダウンロードが始まる。
これはページ下の方の以下Imageリンクから得られるファイルと同じだった。

Showing 371 downloads.
Title                  Version  Release Date
Jetson Nano Developer Kit SD Card Image  JP 4.2.2  2019/08/26
DOWNLOADS
Image


 > 同ページの以下リンクへ進む。
 > Getting Started With Jetson Nano Developer Kit
 > Next Step、でWrite Image to the microSD Card まで進む
 > Instructions for Windows
 > SD Memory Card Formatter for Windows のリンクからSDカードフォーマットツールをダウンロード。
   (進んだページでAcceptを押すと、ダウンロードが始まる。)
 > SD Card Formatter 5.0.1 Setup.exe を実行してインストールする。
 > OSイメージを書き込むSDカードをPCに接続する。
 > SD Card Fomatterを起動して、対象のSDドライブ名を指定、クイックフォーマットでSDカードをフォーマットする。
 > 次に、SDカードへのOSイメージ書き込みツール Etcherをダウンロードする。
   これは「Write Image to the microSD Card」のEtcherのリンクから飛び、その先の「Download for Windows (x86|x64)」から入手できる。
 > balenaEtcher-Setup-1.5.56.exe を実行してインストール。インストール進めたらいつの間にか起動してた。
 > EtcherウィンドウのSelect imageでOSイメージを選択。
   この時、ダウンロードしたOSイメージjetson-nano-sd-r32.2.1.zipを解凍するとエラー。
   そのままzipをEtcherで指定したら、sd-blob-b01.imgとして認識された。

 > Select Targetで先ほどフォーマットしたSDカードのドライブ名を選択し、Continue。
 > 最後にFlashをクリック。
 > 20分くらいで完了したが、その時ドライブ名Pくらいまでのたくさんのドライブが認識され、
   フォーマットしますか?ウィンドウが出てびっくり。こういう仕様なのか・・・?
 > とにかくSDカードをPCから外し、Jetson Nanoスロットへ挿入。
 > その他、USBキーボードやら、USBマウスやら、HDMIケーブルを接続。
 > あとは突然発見したmicro-USB接続のACアダプタをJetsonに接続して電源ON。

最初にNVIDIAのロゴが表示された後は、ずっと真っ暗。時間かかるのかな?

10分以上待っても真っ暗なので、再度OSイメージ入手からやってみる。
https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#prepare
今度は上記ページの「Jetson Nano Developer Kit SD Card Image」のリンクからゲット。

(注)後で調べて分かったがzipにはファイル容量4GBの制限があるとか。
  4GB以上のファイルはzip64対応の解凍ツールでやるべきとか。
  Lhaplusではエラーになったので、7-zipを使ったら、解凍できた。


今度はSDカードライターツール(Etcher)でzipではなく、解凍後のimgを指定してやり直してみる。
その前に、まずはいっぱい作られたパーティションが邪魔で、かつWidowsの管理ツール > ディスクの管理が
起動しないという状態になっているので、CentOSで認識させ、fdiskでパーティションを削除した。
/dev/sdb1、sdb2、sdb3とたくさんデバイスが見えるのに、fdiskで見るとパーティションは1つだけ。不思議。
とにかくこのパーティションを削除したら、確かに全てパーティション消えた。
これをWindowsへ接続して、フォーマッターとライターで再作業
・・・
しかし、やっぱり同じだった。ライターで書き込みした後は10個くらいのパーティションが生成され、そしてそれをJetsonに挿入しても
最初のNVIDIAのロゴ、そしてその後すぐのNVIDIAロゴの後はずっと真っ暗画面。

もしかしてSDカードの速度が悪い?



初期セットアップから起動まで(SDカードと電源変更で起動成功)

この2つを変更したら、無事起動出来ました。

SDカード変更: SANDISK Ultra microSDHC I 32GB ⑩ > SANDISK Ultra microSDXC I 128GB ⑩A1 UHS Speed Class1
電源: ラズパイ用AC to microUSB 5V/3A(AD-K50P300) > 秋月で購入したACアダプタ5V/4A(型番別途)
  ※ 尚、microUSB電源の場合はそのまま動くが、ACアダプタジャックを使う場合は、J48にジャンパをする必要がある。

起動成功したSDカードで、ACアダプタをラズパイ用にしたら、やはりUbuntu起動せず。
そうなると、「ラズパイ用AC to microUSB 5V/3A(AD-K50P300)」という結論か・・・3Aだからいけると思ったのだが。

(9/7追記)
起動できた環境でACアダプタだけ変えて再確認してみたら、無事起動できた。
そうなると、動く動かないで異なる点は以下。とりあえずはデバッグ後回し。
 1.電源タップとモニタ
 2.SDカード。

起動後、システムコンフィグ

OSが無事起動すると最初だけSystem Configurationウィンドウが起動する。
NVIDIA End User License Agreements > I accept・・・にチェック > Continue
 > WelcomeでEnglishを選択し、Continue
 > Keyboard layout > JapaneseのJapanese、を選択し、Continue
 > Where are you? > Tokyo、を選択し、Continue
 > 以下いれてContinue

Your name: hoge
Your computer's name: jetson
choose a password: xxxx

 > なんだかんだ動いて、再起動もされて、Ubuntu OSが起動された。
ログインすると、NVIDIAロゴとかっこいい壁紙が出る。



UnixBenchやってみる

https://monoist.atmarkit.co.jp/mn/articles/1907/01/news037_2.html

起動後、既にDHCPでIP取得されてたので、特に設定は不要。
# apt-get update > 正常終了
# apt-get install build-essential > なんだかエラー
# apt-get install git > なんだかエラー
# cd /root
# mkdir unixbench
# cd unixbench
# git clone https://github.com/kdlucas/byte-unixbench.git .
# cd Unixbench
# ./Run
なんだかんだテストが動いて、以下のように終了した。

Benchmark Run: 土 9月 07 2019 09:15:33 - 09:43:37
4 CPUs in system; running 4 parallel copies of tests

Drystone 2 using register variables 5245195.3 lps (10.0 s, 7 samples)
Double-Precision Whatstone    5733.4 MWIPS (9.9 s, 7 samples)
 :
System Call Overhead     15000.0 1327351.5  884.9
System Benchmarks Index Score   1062.6




CUDAコアで“Hello AI World”を動作

https://monoist.atmarkit.co.jp/mn/articles/1908/07/news013.html

# apt-get install cmake
E: Package 'cmake' has no installation candidate

何やら見つからない。

https://askubuntu.com/questions/356014/package-cmake-has-no-installation-candidate-ubuntu-12-04

ここを参考にして、以下の通りやったらcmakeがインストールできた。
# apt-get update -y
# apt-get update
# apt-get install cmake -y

cmakeが入ったら、次は以下。
# git clone https://github.com/dusty-nv/jetson-inference
# cd jetson-inference
# git submodule update --init

# apt-get install libpython3-dev python3-numpy

# cd /root/jetson/xxx/jetson-inference/
# mkdir build
# cd build
# cmake ../
 > Model Downloaderウィンドウ > 好きなモデルを選択 > OK
 > これでAlexNetなどから順番にダウンロードが始まる

途中です。




Tensorflowインストール

https://qiita.com/tsutof/items/77b49f71ed81344b9d16

# apt-get install libhdf5-serial-dev hdf5-tools
# apt-get install python3-pip
# apt-get install zlib1g-dev zip libjpeg8-dev libhdf5-dev
# apt autoremove
# pip3 install -U numpy grpcio absl-py py-cpuinfo psutil portpicker grpcio six mock requests gast h5py astor termcolor

Exception:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/pip/basecommand.py", line 215, in main
status = self.run(options, args)
 :

# pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu

途中



ラズパイカメラモジュールV2を接続

https://qiita.com/tsutof/items/2d2248ec098c1b8d3e32
こことか参考にさせて頂きました。

Jetson Nanoに対応してるV2モジュールを接続。
フレキの青い方が外側になるように接続して、Jetson Nano起動したら、/dev/video0として認識されてるみたい。

リアルタイム画像表示

# nvgstcapture
とやるだけで、中くらいのウィンドウが起動し、カメラでとってる映像が表示された。

※ 他のブログ見ると、2A USB電源とか使ってたら、nvgstcaptureでフリーズするとか。
   秋月でJetson Nano対応とうたってる4A ACアダプタは特に問題なし。

Ctrl-Cで終了できた。

リアルタイム画像表示(Gstreamerコマンド)

これやると全画面でリアルタイム映像表示になった。
# gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=1920, height=1080, format=(string)NV12, framerate=(fraction)30/1' ! nvoverlaysink -e
Ctrl-Cで終了できた。

リアルタイム画像表示(OpenCV)

numpyモジュールのアップグレード。
# apt-get update
# apt install python3-pip
# pip3 install --upgrade numpy
ここで5~10分待った。

以下をnano_cam_test.pyとして保存。

import cv2

GST_STR = 'nvarguscamerasrc \
! video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=(fraction)30/1 \
! nvvidconv ! video/x-raw, width=(int)1920, height=(int)1080, format=(string)BGRx \
! videoconvert \
! appsink'
WINDOW_NAME = 'Camera Test'

def main():
cap = cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER)

while True:
ret, img = cap.read()
if ret != True:
break

cv2.imshow(WINDOW_NAME, img)

key = cv2.waitKey(10)
if key == 27: # ESC
break

if __name__ == "__main__":
main()


# python3 nano_cam_test.py
こうするとウィンドウが右端に出た。
Ctrl-Cで終了出来た。


リアルタイム画像類推

https://denor.jp/jetson-nano%E3%81%AB%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%92%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E7%94%BB%E5%83%8F%E9%A1%9E%E6%8E%A8%E3%82%92%E8%A1%8C

Jetson Nanoシステムのアップデート・アップグレードを行う。
# apt update
# apt upgrade
これもだいぶ時間かかった。

必要なものインストール
# apt install git cmake doxygen

以下は過去に既にやってるので飛ばすが必要な作業として一応メモ。
# cd /root
# git clone https://github.com/dusty-nv/jetson-inference
# cd jetson-inference
# git submodule update --init
# cd jetson-inference
# git submodule update --init
# mkdir build
# cd build
# cmake ../
# make

ビルドが完了したら、リアルタイム推論をやってみる。
# cd aarch64/bin
# ./imagenet-camera googlenet
カメラに映る映像を変えてみると、変わる。
モニターを映すとmonitorと表示され、顔を映すとoxygen maskになった。なぜoxygen mask?

# ./imagenet-camera alexnet
こちらも試してみても同様。
しかし、突然フリーズ。Ctrl-Cでも効かない。
別のterminalを起動してshutdownしてから再起動したら、戻った。




リモートデスクトップ(トラ技)

# apt-get install xrdp
# apt-get install xtightvncviewer
# apt-get install x11vnc
# cd /root/.config
# mkdir autostart
# cd autostart
# touch x11vnc.desktop
# vi x11vnc.desktop

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=X11VNC
Comment=
Exec=x11vnc -forever -usepw -display :0
StartupNotify=false
Terminal=false
Hidden=false


# apt-get install xfce4
# echo xfce4-session > ~/.xsession
# vi /etc/xrdp/startwm.sh

#!/bin/sh
if [ -r /etc/default/locale ]; then
. /etc/default/locale
export LANG LANGUAGE
fi
startxfce4


# reboot
Jetson NanoのIPを確認しておく。
# ifconfig

クライアントPCからリモートデスクトップ接続する。
Microsoft Store
https://www.microsoft.com/ja-jp/
 > Remote Desktopを検索
 > ストアで\0で購入してインストール。
 > 起動して、jetsonのIPとユーザ名とパスワードを入力してログイン。
jetson画面は出たが、表示が非常に重い。



GPUグラフ

# tegrastats
状況が表示される。
# git clone https://github.com/JetsonHacksNano/gpuGraph
# cd gpuGraph
# python3 gpuGraph.py

Traceback (most recent call last):
File "gpuGraph.py", line 7, in
import matplotlib.pyplot as plt
ModuleNotFoundError: No module named 'matplotlib'


matplotlibが見つからないと言われたのでインストール。
# pip install matplotlib




CUDAセットアップ

https://researchmap.jp/joop5kxaf-2001408/

# apt-add-repository universe
# apt-get update

https://developer.nvidia.com/linux-tegra-rel-21

上記ページ > CUDA Toolkit > CUDA 6.5 Toolkit for L4T Rel 21.2
 > cuda-repo-l4t-r21.2-6-5-prod_6.5-34_armhf.deb
スポンサーサイト



[AI]用語

(注)全てが参照先で説明してる訳ではない。個人的な理解(予想)で書いてる内容もあり。

YouTube①: Deep Learning入門:ニューラルネットワーク設計の基礎
https://www.youtube.com/watch?v=O3qm6qZooP0

YouTube②: Deep Learning入門:Deep Learningでできること
https://www.youtube.com/watch?v=FwuBbj8F6cI

YouTube③: Deep Learning精度向上テクニック:様々なCNN #1
https://www.youtube.com/watch?v=UximUEjPQco

YouTube④: Deep Learning精度向上テクニック:様々な活性化関数
https://www.youtube.com/watch?v=cTvJ-jj63U4

YouTube⑤: Deep Learning入門:ニューラルネットワーク学習の仕組み
https://www.youtube.com/watch?v=r8bbe273vEs

書籍①: ゼロから作るDeep_Learning_Pythonで学ぶディープラーニングの理論と実装

-----------------------------------------------
YouTube① Feed Forward : 入力層(Input Layer)から出力層(Output Layer)へ左から右へ進むもの

YouTube① Affine : 入力ニューロンと出力ニューロンが全結合してる関数。重みWも入力x出力の数だけ必要。

YouTube① Tanh : (タンエイチ) 活性化関数の1つ。

YouTube① Affine + Tanh : 1層分のニューロンの構成の1つ。

YouTube① Affine + Softmax : 出力層によく使われる構成。Softmaxは出力の合計が1になる特徴。

YouTube① DNN : Deep Neural Network。全結合の(?)Neural Network

YouTube① CNN : Convolutional(畳み込み演算) Neural Network。畳み込みNeural Network

YouTube① Convolution :

 入力画像を例えば5x5の複数の異なるフィルタ(例:ぼかし)で畳み込みし、複数(例:6種)の画像を出力する演算(関数)。
 重みWは画像の各ピクセル毎に同じ数値。
 1枚画像で25個のWなら、そのフィルタ数分(例:6枚なら25個x6枚=150個)だけ重みが必要。
 Affineの重みより少なくて済む。



YouTube① max pooling関数 :

 ダウンサンプリングの処理の1つ。
 隣接ピクセルで最大値を取り、ダウンサンプリングする。
 例:解像度を縦横半分にする。



YouTube① average pooling関数 :

 ダウンサンプリングの処理の1つ。
 隣接ピクセルで平均値を取り、ダウンサンプリングする。



YouTube① CNN構成例 :

  例:入力画像28x28x1枚 ->
   Convolution(例:処理画像24x24xフィルタ6枚分) ->
    maxpooling(例:処理画像12x12xフィルタ6枚分) ->
    tanh ->

       convolutoin(例:処理画像8x8xフィルタ16枚分) ->
       maxpooling(例:処理画像4x4xフィルタ16枚分) ->
       tanh ->

          affine(4x4x16=256ピクセル分と全結合) ->
          tanh(256から120にする) ->
             affine ->
             softmax(数字0~9分の10出力にする)

 以下の1層を構成する構造(例)を何個もつなぎ合わせる事で多層ネットワークを構成していく。
   Affine層(全結合) = 全結合(Affine) + 活性化関数(Tanh)
   Convolution層   = 畳み込み(Convolution) + ダウンサンプリング(maxpooling) + 活性化関数(Tanh)



YouTube② Semantic Segmentation :

 ピクセル単位の物体認識。出力層は入力画像に対するピクセル毎のカテゴリ。
 入力画像のピクセル毎にどういった物体か?というデータを用意して学習すればよい。



YouTube② 画像キャプショニング : 入力は画像で、その画像の説明文章を説明する機能。

YouTube② Visual 画像キャプショニング : 入力は画像で、その画像の説明文章を説明する機能。

YouTube③ カーネルサイズ : (別サイトも見て調べた。)画像フィルターの事。畳み込み(Convolution)層の処理において、カーネル(もしくはフィルター)と呼ばれる格子状の数値データと同サイズの部分画像(ウィンドウ)の数値データを、積和演算して変換する。

YouTube③ AlexNet : 2012年にDLを使って画像認識の性能を大きく向上させたCNNのテクニック(構造)。

YouTube③ ResNet : 2015年に登場したCNNのテクニック(構造)。

YouTube③ Inception-v4 : 2016年に登場したCNNのテクニック(構造)。

YouTube③ 1x1(Pointwise) convolution : one by one convolution。空間方向のフィルタ処理がなく、画像枚数を調整したい場合に用いられる。例:画像512枚で3x3フィルタ処理を行うには大き過ぎるので、1x1 Convolutionで画像枚数を128枚にしてから、3x3フィルタ処理を行う、という例。

YouTube③ ResNetX :

 ResNetX = Grouped Convolution + 1x1 Convolution
 通常、出力画像は全ての入力画像を参照するニューロン接続構成にしていたが、画像枚数が増えると演算が膨大。
 そこで考えたのがGrouped Conv。例えばGroup数=画像枚数/2とすると、2枚の入力画像と1枚の出力画像がグループになる。
 このグループの間だけで3x3フィルタ処理を行う。しかし、このままではグループ外の入力画像は出力画像に反映されない。
 そのために、Grouped Convの後に、1x1 Convを入れて、全ての入力画像が出力画像に反映できるようにする。



YouTube③ Seperable Convolution :
 上のGrouped Convを究極に突き詰めたもの。Xceptionという論文で発表。

YouTube④ ReLU :

 活性化関数の1つ。
 何らかの非線形関数なら活性化関数として機能する。
 ReLUの登場によって、多数のニューラルネットワークが可能になった。
 従来はTanhがよく使われていたが、0付近は傾き線形だが、0から離れると勾配がほぼ0になってしまう。
 NN学習の仕組みとしてBack Propagationがあり、勾配を前の層に伝搬させていく過程で勾配の乗算がある。
 しかしTanhだと、入力の絶対値が大きくなると勾配がほぼ0になるため、勾配が前の層に戻らない問題あり。
 一方、ReLUは0以上の入力で勾配は常に1なので、前の層に勾配が伝わり易い。



YouTube⑤ ミニバッチ勾配降下法 :

 Mini-Batch Gradient Descent
 ニューラルネットワークにおいて、乱数で初期化された重みWを更新していく時の手法。
 動作手順
  1.学習データからミニバッチと呼ばれる複数個のデータ(例:256個程度)を取得。
  2.ミニバッチを用いて、Forward計算を実施。現Wによる出力Yとロス(最小化したい値)Eを算出。
  3.Backward計算(ロスEの逆伝搬)を行い、Wの勾配を求める。勾配は、その地点における接線の傾き(微分dE/dW)。
    計算方法の1つがBack Propagation。
  4.Update(求めたWの勾配で現Wを更新)。 ロスEが小さくなる方向に更新。 W' = W - η(イータ)dE/dWという計算。



YouTube⑤ Back Propagation :
 どんな複雑なNNでもパラメータ勾配を求めるには、「出力から順にさかのぼりながら勾配を計算する事で合成関数の微分を行う。」
 ◆やりたい事
   ロスEが最小となる重みwとバイアスbを求めたい。
   Eが最小になるのは、wとbそれぞれ、勾配が0になる地点。(常に勾配0地点がロスE最小ポイントか??)
   そのために、ロスEから重みwの勾配、及びバイアスbの勾配を計算したい。
 ◆前提条件
  Affine層の出力Y=重みw x 入力値x + バイアスb、Squared ErrorロスE = (y -t)^2
 ◆Eのwに関する微分を求めるために、まずはEの出力yに関する勾配を求める
   E = (y - t)^2の微分は、dE/dy = 2(y - t)
 ◆yの勾配からwの勾配を求める
   まずは合成関数の微分で用いるテクニックでこのように変換。dE/dw = dE/dy dy/dw
   このうちyの勾配(dE/dy)は既に求めてる。残るはyをwで微分したものが必要。
   y= w * x + bなので、wにかかっている係数はx。よって、yをwで微分したらxになる。
   よって、上で求めた式を変形してdE/dw = dE/dy * x = 2(y - t) * x、となる。
 ◆同様に、bの勾配も求める
   まずは式変換。dE/db = dE/dy dy/db
   さらに、yをbで微分すると、y式からbには何もかかってないため、結果1になる。
   この結果で式を変換して、dE/db = dE/dy dy/db = dE/dy * 1 = dE/dy = 2(y - t)、となる。
 ◆これまでの流れで、どんな複雑な構成でも、各ノードの勾配を計算できる。

[AI]Caffe

長ったらしく経緯を書いてるけど、内容まとめると以下の感じ。

1.Caffeインストール(WSL、1回目、失敗)
  WSLで進めたけど、import caffeでエラーになる。
2.最初からCaffeインストールやり直し(WSL、import caffeまで成功!)
  これをやってimport caffeまでできたけど、その後のMNISTによる学習準備でエラー。WSLの問題と予想し、VMwareへ。
3.WSLをやめてVMwareでやり直し(途中)
  今ここ。


1. Caffeインストール(WSL、1回目、失敗)

https://qiita.com/t_takii/items/de9d83b47baf6697ae6b

WSL(Windows Subsystem for Linux)のUbuntu18.04.2 LTS(カーネル4.4.0-17763-Microsoft)にて作業。

$ sudo apt-get update
$ sudo apt-get install -y --no-install-recommends libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev libatlas-base-dev libopenblas-dev protobuf-compiler
$ sudo apt-get install the python-dev

$ sudo apt install git
$ git clone https://github.com/BVLC/caffe.git

$ sudo apt-get install -y python-pip python-numpy python-scipy python-skimage python-protobuf

$ cd caffe
$ cp Makefile.config.example Makefile.config
$ vi Makefile.config

# 以下、編集箇所のみ赤字
CPU_ONLY := 1 ※コメントアウトを解除
PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/local/lib/python2.7/dist-packages/numpy/core/include
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/



$ sudo ln -s /usr/lib/x86_64-linux-gnu/libhdf5_serial.so.100.0.1 /usr/lib/x86_64-linux-gnu/libhdf5.so
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libhdf5_serial_hl.so.100.0.0 /usr/lib/x86_64-linux-gnu/libhdf5_hl.so

$ sudo vi ~/.bashrc

# 最終行に追加
export PYTHONPATH=/home/bob/caffe/caffe/python/:$PYTHONPATH


$ source ~/.bashrc

CPU数確認
$ nproc
8

CPU数を指定してコンパイル
$ make all -j8

 :
&:build_release .) /``build_release'undefinedlibcvcv/
/::lib.referencelibcaffe.so::/build_release :imdecodeimdecodelibcaffe.so/to ((:lib undefinedcvcv /` ::undefinedlibcaffe.socvreference:: :: _InputArray_InputArrayreference :to undefinedimdecode constconstto (`&& referencecvcv,,` :: cvto::intint: _InputArrayimdecode)):` (''imdecodecvconstcv

(:&:collect2: error: ld returned 1 exit status
cv:,:collect2: error: ld returned 1 exit status
:imdecode _InputArray:(int _InputArraycv)const :'&const:
,&_InputArray , int const)int&')collect2: error: ld returned 1 exit status
,
'Makefile:635: recipe for target '.build_release/tools/compute_image_mean.bin' failed

make: *** [.build_release/tools/compute_image_mean.bin] Error 1
intcollect2: error: ld returned 1 exit status
Makefile:635: recipe for target '.build_release/tools/upgrade_solver_proto_text.bin' failed
)collect2: error: ld returned 1 exit status
make: *** [.build_release/tools/upgrade_solver_proto_text.bin] Error 1
'Makefile:635: recipe for target '.build_release/tools/upgrade_net_proto_binary.bin' failed

make: *** [.build_release/tools/upgrade_net_proto_binary.bin] Error 1
collect2: error: ld returned 1 exit status
Makefile:635: recipe for target '.build_release/tools/convert_imageset.bin' failed
make: *** [.build_release/tools/convert_imageset.bin] Error 1
Makefile:635: recipe for target '.build_release/tools/caffe.bin' failed
make: *** [.build_release/tools/caffe.bin] Error 1
Makefile:635: recipe for target '.build_release/tools/extract_features.bin' failed
make: *** [.build_release/tools/extract_features.bin] Error 1



エラーを調べたら以下掲示板を発見。
https://github.com/BVLC/caffe/issues/2348
ここでこんな事言ってる。

aseempatni commented on 7 Sep 2015
Thanks @hongzhenwang. That helped.

Added LIBRARIES += glog gflags protobuf leveldb snappy \ lmdb boost_system hdf5_hl hdf5 m \ opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs to Makefile.config

I used make clean instead of rm -rf ./build

Then did make all and everything worked fine.



真似してやってみる。
$ vi Makefile.config
最終行に以下を追加。

LIBRARIES += glog gflags protobuf leveldb snappy lmdb boost_system hdf5_hl hdf5 m opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs


$ sudo make clean
$ sudo make all -j8
これで確かにエラーなく終わった。

 :
CXX examples/mnist/convert_mnist_data.cpp
CXX examples/siamese/convert_mnist_siamese_data.cpp
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0
CXX/LD -o .build_release/tools/caffe.bin
CXX/LD -o .build_release/tools/compute_image_mean.bin
CXX/LD -o .build_release/tools/convert_imageset.bin
CXX/LD -o .build_release/tools/extract_features.bin
CXX/LD -o .build_release/tools/upgrade_net_proto_binary.bin
CXX/LD -o .build_release/tools/upgrade_net_proto_text.bin
CXX/LD -o .build_release/tools/upgrade_solver_proto_text.bin
CXX/LD -o .build_release/examples/cifar10/convert_cifar_data.bin
CXX/LD -o .build_release/examples/mnist/convert_mnist_data.bin
CXX/LD -o .build_release/examples/siamese/convert_mnist_siamese_data.bin
CXX/LD -o .build_release/examples/cpp_classification/classification.bin



$ sudo make test -j8

 :
LD .build_release/src/caffe/test/test_softmax_with_loss_layer.o
LD .build_release/src/caffe/test/test_solver.o
LD .build_release/src/caffe/test/test_solver_factory.o
LD .build_release/src/caffe/test/test_split_layer.o
LD .build_release/src/caffe/test/test_spp_layer.o
LD .build_release/src/caffe/test/test_stochastic_pooling.o
LD .build_release/src/caffe/test/test_syncedmem.o
LD .build_release/src/caffe/test/test_tanh_layer.o
LD .build_release/src/caffe/test/test_tile_layer.o
LD .build_release/src/caffe/test/test_threshold_layer.o
LD .build_release/src/caffe/test/test_upgrade_proto.o
LD .build_release/src/caffe/test/test_util_blas.o



$ sudo make runtest -j8
こんな感じで正常に終わったみたい。

 :
[ OK ] CropLayerTest/0.TestCropAll (0 ms)
[ RUN ] CropLayerTest/0.TestCropAllGradient
[ OK ] CropLayerTest/0.TestCropAllGradient (110 ms)
[----------] 11 tests from CropLayerTest/0 (969 ms total)

[----------] 3 tests from TanHLayerTest/0, where TypeParam = caffe::CPUDevice
[ RUN ] TanHLayerTest/0.TestTanHGradient
[ OK ] TanHLayerTest/0.TestTanHGradient (2 ms)
[ RUN ] TanHLayerTest/0.TestTanH
[ OK ] TanHLayerTest/0.TestTanH (0 ms)
[ RUN ] TanHLayerTest/0.TestTanHOverflow
[ OK ] TanHLayerTest/0.TestTanHOverflow (0 ms)
[----------] 3 tests from TanHLayerTest/0 (6 ms total)

[----------] Global test environment tear-down
[==========] 1162 tests from 152 test cases ran. (36402 ms total)
[ PASSED ] 1162 tests.




PyCaffe化(WSL、1回目、失敗)

ここからはこちらを参考。
https://qiita.com/t-hiroyoshi/items/3bba01dd11b1241f1336

runtestが通ったのでCaffeのbuildは成功。
次にこれをPyCaffeできるようにする。
以下でPyCaffeに必要なライブラリをpipで一気に入れる。
$ cd python
$ for li in $(cat requirements.txt); do sudo pip install $li; done
こんな感じで終わった。

 :
Collecting python-gflags>=2.0
Downloading https://files.pythonhosted.org/packages/df/ec/e31302d355bcb9d207d9b858adc1ecc4a6d8c855730c8ba4ddbdd3f8eb8d/python-gflags-3.1.2.tar.gz (52kB)
100% |████████████████████████████████| 61kB 529kB/s
Installing collected packages: python-gflags
Running setup.py install for python-gflags ... done
Successfully installed python-gflags-3.1.2
The directory '/home/bob/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/bob/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied: pyyaml>=3.10 in /usr/lib/python2.7/dist-packages
The directory '/home/bob/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/bob/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied: Pillow>=2.3.0 in /usr/lib/python2.7/dist-packages
The directory '/home/bob/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/bob/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied: six>=1.1.0 in /home/bob/.local/lib/python2.7/site-packages



次はPyCaffeをbuild
xxx@x280:~/caffe/caffe/python$ cd ../
xxx@x280:~/caffe/caffe$ make pycaffe

CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
touch python/caffe/proto/__init__.py
touch: cannot touch 'python/caffe/proto/__init__.py': Permission denied
Makefile:657: recipe for target 'python/caffe/proto/__init__.py' failed
make: *** [python/caffe/proto/__init__.py] Error 1



$ sudo make pycaffe
エラー出たのは単にsudoが足りなかったらしい。

touch python/caffe/proto/__init__.py
PROTOC (python) src/caffe/proto/caffe.proto



$ sudo make distribute

# add proto
cp -r src/caffe/proto distribute/
# add include
cp -r include distribute/
mkdir -p distribute/include/caffe/proto
cp .build_release/src/caffe/proto/caffe.pb.h distribute/include/caffe/proto
# add tool and example binaries
cp .build_release/tools/caffe.bin .build_release/tools/compute_image_mean.bin .build_release/tools/convert_imageset.bin .build_release/tools/extract_features.bin .build_release/tools/upgrade_net_proto_binary.bin .build_release/tools/upgrade_net_proto_text.bin .build_release/tools/upgrade_solver_proto_text.bin distribute/bin
cp .build_release/examples/cifar10/convert_cifar_data.bin .build_release/examples/cpp_classification/classification.bin .build_release/examples/mnist/convert_mnist_data.bin .build_release/examples/siamese/convert_mnist_siamese_data.bin distribute/bin
# add libraries
cp .build_release/lib/libcaffe.a distribute/lib
install -m 644 .build_release/lib/libcaffe.so.1.0.0 distribute/lib
cd distribute/lib; rm -f libcaffe.so; ln -s libcaffe.so.1.0.0 libcaffe.so
# add python - it's not the standard way, indeed...
cp -r python distribute/




$ python
Python 2.7.15+ (default, Nov 27 2018, 23:36:35)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
Pythonインタプリタを起動した後、import caffeでエラーなく終了すれば動作成功との事だが、エラー出た。

Traceback (most recent call last):
File "", line 1, in
File "/home/bob/caffe/caffe/python/caffe/__init__.py", line 1, in
from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
File "/home/bob/caffe/caffe/python/caffe/pycaffe.py", line 15, in
import caffe.io
File "/home/bob/caffe/caffe/python/caffe/io.py", line 2, in
import skimage.io
File "/usr/lib/python2.7/dist-packages/skimage/__init__.py", line 158, in
from .util.dtype import *
File "/usr/lib/python2.7/dist-packages/skimage/util/__init__.py", line 7, in
from .arraycrop import crop
File "/usr/lib/python2.7/dist-packages/skimage/util/arraycrop.py", line 8, in
from numpy.lib.arraypad import _validate_lengths
ImportError: cannot import name _validate_lengths





2. 最初からCaffeインストールやり直し(WSL、import caffeまで成功!)

https://stackoverflow.com/questions/54603645/caffe-import-error-even-after-installing-it-successfully-on-ubuntu-18-04
上のエラーに出会ったやつは、ここの記事で以下の手順で試せとある。


1 Answer
Problem solved:  xxxx
xxx
Let me give step by step guidance to install caffe successfully in Ubuntu 18.04 LTS:
1] sudo apt-get install -y --no-install-recommends libboost-all-dev
 :



試してみる。

$ sudo apt-get install -y --no-install-recommends libboost-all-dev
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
# git clone https://github.com/BVLC/caffe
# cd caffe
# cp Makefile.config.example Makefile.config
pipが無い場合はインストールしておく。
# sudo apt install python-pip python3-pip
# sudo pip install scikit-image protobuf
# cd python
# for req in $(cat requirements.txt); do sudo pip install $req; done
# cd ../
# vi Makefile.config
CPU_ONLY := 1 --> uncomment
OPENCV_VERSION := 3. --> uncomment
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5 opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs --> add to last line

$ sudo make all
このエラーは想定内らしい。

 :
CXX src/caffe/layers/flatten_layer.cpp
CXX src/caffe/layers/hdf5_data_layer.cpp
src/caffe/layers/hdf5_data_layer.cpp:14:10: fatal error: hdf5.h: No such file or directory
#include "hdf5.h"
^~~~~~~~
compilation terminated.
Makefile:591: recipe for target '.build_release/src/caffe/layers/hdf5_data_layer.o' failed
make: *** [.build_release/src/caffe/layers/hdf5_data_layer.o] Error 1



$ sudo apt-get install libhdf5-dev
$ vi Makefile.config

赤字を追加
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial



$ sudo make all
確かにエラーが消えた。

 :
CXX/LD -o .build_release/tools/upgrade_net_proto_text.bin
CXX tools/upgrade_solver_proto_text.cpp
CXX/LD -o .build_release/tools/upgrade_solver_proto_text.bin
CXX examples/cifar10/convert_cifar_data.cpp
CXX/LD -o .build_release/examples/cifar10/convert_cifar_data.bin
CXX examples/cpp_classification/classification.cpp
CXX/LD -o .build_release/examples/cpp_classification/classification.bin
CXX examples/mnist/convert_mnist_data.cpp
CXX/LD -o .build_release/examples/mnist/convert_mnist_data.bin
CXX examples/siamese/convert_mnist_siamese_data.cpp
CXX/LD -o .build_release/examples/siamese/convert_mnist_siamese_data.bin



$ sudo make test
$ sudo make runtest
$ sudo make pycaffe

掲示板の手順ではmake pycaffeでエラー出るかも、とある。
特にエラーは出なかったが、1回目のインストールの時と違う設定なので以下の通り修正しておく。
$ vi Makefile.config

PYTHON_INCLUDE := /usr/include/python2.7 /usr/local/lib/python2.7/dist-packages/numpy/core/include


$ source ~/.bashrc

これで再度import caffeを試す。
$ python
>> import caffe
さっきと同じく、こんなやつが出る。

 :
from numpy.lib.arraypad import _validate_lengths
ImportError: cannot import name '_validate_lengths'



調べると、skimage package.をアップグレードしたら解決したという記事あり。
https://stackoverflow.com/questions/54241226/importerror-cannot-import-name-validate-lengths

$ pip install --upgrade scikit-image
再度試してみたら、10秒ほどかかったが、正常にimport caffeができた(エラーなく終了した)。これで環境整備完了。
$ python
>>> import caffe
>>>


MNIST学習(WSLだと失敗)

https://qiita.com/t-hiroyoshi/items/2bf473fd06c352d97579

WSL起動。
$ cd /home/bob/caffe/caffe
$ sudo ./data/mnist/get_mnist.sh

Downloading...
--2019-07-05 10:56:49-- http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
Resolving yann.lecun.com (yann.lecun.com)... 216.165.22.6
Connecting to yann.lecun.com (yann.lecun.com)|216.165.22.6|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9912422 (9.5M) [application/x-gzip]
Saving to: ‘train-images-idx3-ubyte.gz’

train-images-idx3-ubyte 100%[==============================>] 9.45M 1.60MB/s in 7.0s

2019-07-05 10:56:57 (1.35 MB/s) - ‘train-images-idx3-ubyte.gz’ saved [9912422/9912422]

--2019-07-05 10:56:57-- http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
Resolving yann.lecun.com (yann.lecun.com)... 216.165.22.6
Connecting to yann.lecun.com (yann.lecun.com)|216.165.22.6|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 28881 (28K) [application/x-gzip]
Saving to: ‘train-labels-idx1-ubyte.gz’

train-labels-idx1-ubyte 100%[==============================>] 28.20K 178KB/s in 0.2s

2019-07-05 10:56:58 (178 KB/s) - ‘train-labels-idx1-ubyte.gz’ saved [28881/28881]

--2019-07-05 10:56:58-- http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
Resolving yann.lecun.com (yann.lecun.com)... 216.165.22.6
Connecting to yann.lecun.com (yann.lecun.com)|216.165.22.6|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1648877 (1.6M) [application/x-gzip]
Saving to: ‘t10k-images-idx3-ubyte.gz’

t10k-images-idx3-ubyte. 100%[==============================>] 1.57M 793KB/s in 2.0s

2019-07-05 10:57:00 (793 KB/s) - ‘t10k-images-idx3-ubyte.gz’ saved [1648877/1648877]

--2019-07-05 10:57:00-- http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
Resolving yann.lecun.com (yann.lecun.com)... 216.165.22.6
Connecting to yann.lecun.com (yann.lecun.com)|216.165.22.6|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4542 (4.4K) [application/x-gzip]
Saving to: ‘t10k-labels-idx1-ubyte.gz’

t10k-labels-idx1-ubyte. 100%[==============================>] 4.44K --.-KB/s in 0s

2019-07-05 10:57:00 (110 MB/s) - ‘t10k-labels-idx1-ubyte.gz’ saved [4542/4542]



Caffeで画像認識させるために、先のダウンロードデータをLMDB形式に変換。
$ sudo ./examples/mnist/create_mnist.sh

Creating lmdb...
I0705 11:02:20.452775 55 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_train_lmdb
I0705 11:02:20.454550 55 convert_mnist_data.cpp:88] A total of 60000 items.
I0705 11:02:20.454649 55 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
F0705 11:02:20.480227 55 db_lmdb.hpp:15] Check failed: mdb_status == 0 (-30796 vs. 0) MDB_CORRUPTED: Located page was wrong type
*** Check failure stack trace: ***
@ 0x7f608b81c0cd google::LogMessage::Fail()
@ 0x7f608b81df33 google::LogMessage::SendToLog()
@ 0x7f608b81bc28 google::LogMessage::Flush()
@ 0x7f608b81e999 google::LogMessageFatal::~LogMessageFatal()
@ 0x7f608bd4323d caffe::db::LMDBTransaction::Commit()
@ 0x7f608c403189 convert_dataset()
@ 0x7f608c40247a main
@ 0x7f608a7f1b97 __libc_start_main
@ 0x7f608c4024ca _start
Aborted (core dumped)



今更だけど、CAFFE_ROOTを~/.bashrcへ追加しても結果変わらず。
export CAFFE_ROOT=/home/bob/caffe/caffe

https://github.com/BVLC/caffe/issues/6578
ここ見ると、WSL使ってると同じエラーが出て、WSLでないUbuntuだと成功したって言ってる。




3. WSLをやめてVMwareでやり直し(import caffe成功、MNIST学習成功)

Ubuntu18.04.2 LTS (Bionic Beaver)
カーネル4.15.0-45-generic

$ sudo apt-get install -y --no-install-recommends libboost-all-dev
E: Unable to locate package なんとかでエラーで止まった。
$ sudo apt-get update
$ sudo apt-get install -y --no-install-recommends libboost-all-dev
パッケージ名が間違っている訳ではないので原因が不明だったが、アップデートしてから再度やってみたらエラー消えた。
$ sudo apt-get -y install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
# git clone https://github.com/BVLC/caffe
# cd caffe
# cp Makefile.config.example Makefile.config
# sudo apt install python-pip python3-pip
# sudo pip install scikit-image protobuf
# cd python
# for req in $(cat requirements.txt); do sudo pip install $req; done
# cd ../
# vi Makefile.config
CPU_ONLY := 1 --> uncomment
OPENCV_VERSION := 3. --> uncomment
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5 opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs --> add to last line

$ sudo make all > 失敗する

 :
src/caffe/layers/hdl5_data_layer.cpp:14:10: fatal error: hdf5.h: No such file or directory
#include "hdf5.h"
~~~~~~~~~
compilation terminated.
Makefile:591: recipe for target '.build_release/src/caffe/layers/hdf5_data_layer.o' failed
make: *** [.build_release/src/caffe/layers/hdf5_data_layer.o] Error 1



$ sudo apt-get install libhdf5-dev
$ vi Makefile.config

赤字を追加
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial



$ sudo make all
$ sudo make test
$ sudo make runtest
$ sudo make pycaffe

CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
python/caffe/_caffe.cpp:10:10: fatal error: numpy/arrayobject.h: No such file or directory
#include
~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:517: recipe for target 'python/caffe/_caffe.so' failed
make: *** [python/caffe/_caffe.so] Error 1



arrayobject.hが無いというので探してみたら、
/usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/arrayobject.h
にあった。Makefile.configのパスが間違ってた。
$ sudo vi /home/bob/caffe/Makefile.config

PYTHON_INCLUDE := /usr/include/python2.7 \
修正前 /usr/lib/python2.7/dist-packages/numpy/core/include
修正後 /usr/local/lib/python2.7/dist-packages/numpy/core/include



$ sudo make pycaffe

CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
touch python/caffe/proto/__init__.py
PROTOC (python) src/caffe/proto/caffe.proto


今度は成功した。

$ python
>>> import caffe

Traceback (most recent call last):
File "", line 1, in
ImportError: No module named caffe



こんなエラーが出た。原因はbashrcにパスが無いかららしい。
なので以下を追記。
$ vi ~/.bashrc

export PYTHONPATH=/home/bob/caffe/python



$ python
>>> import caffe
>>>
今度は成功した。

$
$ ./examples/mnist/create_mnist.sh

Creating lmdb...
I0706 11:14:06.001570 78478 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_train_lmdb
I0706 11:14:06.005759 78478 convert_mnist_data.cpp:88] A total of 60000 items.
I0706 11:14:06.006155 78478 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
I0706 11:14:06.978487 78478 convert_mnist_data.cpp:108] Processed 60000 items.
I0706 11:14:07.033179 78479 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_train_lmdb
I0706 11:14:07.034142 78479 convert_mnist_data.cpp:88] A total of 10000 items.
I0706 11:14:07.034878 78479 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
I0706 11:14:07.220436 78479 convert_mnist_data.cpp:108] Processed 10000 items.
Done.



$ sudo ./examples/mnist/train_lenet.sh

I0706 11:28:43.753690 78506 caffe.cpp:204] Using GPUs 0
F0706 11:28:43.754091 78506 common.cpp:66] Cannot use GPU in CPU-only Caffe; check more.
*** Check failure stack trace: ***
@ 0x7f19xxxxxx google::LogMessage::Fail()
 :
Aborted (core dumped)


CPU-onlyである事を忘れてた。

$ sudo vi ./examples/mnist/lenet_solver.prototxt

solver_mode: CPU ※ GPUからCPUへ変更



これで再度トレーニングを実施。
$ sudo ./examples/mnist/train_lenet.sh

 :
I0706 11:50:35.xxxxx 78590 solver.cpp:347] Iteration 10000, loss = 0.00282926
I0706 11:50:35.xxxxx 78590 solver.cpp:347] Iteration 10000, Testing net (#0)
I0706 11:50:35.xxxxx 78590 data_layer.cpp:73] Restarting data prefetching from start.
I0706 11:50:35.xxxxx 78590 solver.cpp:414] Test net output #0: accuracy = 0.99
I0706 11:50:35.xxxxx 78590 solver.cpp:414] Test net output #1: loss = 0.028678 (* 1 = 0.028678 loss)
I0706 11:50:35.xxxxx 78590 solver.cpp:250] Optimization Done.
I0706 11:50:35.xxxxx 78590 caffe.cpp:250] Optimization Done.


だいたい10分くらいで完了かな。

https://qiita.com/t-hiroyoshi/items/2bf473fd06c352d97579

これで、.examples/mnist/lenet_iter_10000.caffemodelが出力された学習済モデル。
これを読み込めば、MNISTの学習後の状態を再現できる。

[AI]Mythic

用語

バッチサイズ

https://qiita.com/kenta1984/items/bad75a37d552510e4682

DLのように内部で確率的勾配降下法を使う場合、データセットを幾つかのサブセットに分けて学習する。
幾つかのサブセットに分けて学習する理由は、学習する際に異常値の影響を小さくするため。
この幾つかに分けたぞれぞれのサブセットに含まれるデータの数をバッチサイズと呼ぶ。
例えば、1,000件のデータセットを200件ずつのサブセットに分ける場合、バッチサイズは200。


参考情報

機械学習とかDeep Learningを学ぶ前に知っておくべき基礎の基礎
https://dev.classmethod.jp/machine-learning/fundamental-matters-to-know-before-learning-machine-learning-and-deep-learning/




Mythic YouTube

12:26 Other Applications Are Similar

Decision Making : Cicumstances(状況、環境、境遇) to Actions
Actuation : Physical Goals to Motor Control
Speech Processing : Waveforms to Words/Phonems(音素)
Text to Speech : Words to Waveforms


18:49 DNN Processing is All About Weight Memory

AlexNet、ResNet-18などのNetwork
それぞれのWeightが61M、11M (10+Mの保存すべきパラメータがある)
積和演算機MACの数は、725M、1.8Bなどもある。
これらを@30FPSの処理で考えると、MACの30倍の22B、54Bといった計算量になる。(20+Bのメモリアクセスになる)
これらのリソースをエッジソリューションにフィットさせる事は非常に難しい。


19:09 Energy Efficiency Translates to Performance

ResNet-50 @ 4K(579B MACs/Frame)を考えてみる。
1 秒間に 1 ジュールの仕事が行われるときの仕事率が 1 ワット。 W = J / s
1pJ(ピコジュール) = 1E^-12 J
もし1MACあたり、1pJの消費電力量だったら、1Wあたり1E^12(=1000G)個のMACを動かす事が出来る。
Camera System = Thermal Limit of 5W
 50pJ/MAC > 5W制限では100GMAC/sを動かす事が出来る > 1Frameで579B MACs必要だから、0.17FPS分のMAC計算量しかない。
 同様に、10pJ/MACだったら0.86FPS、0.5pJ/MACだったら17.3FPS。
 つまり、1MACが0.5pJで動いても17.3FPSしか処理出来ない。
17.3FPSならUsable。
セキュリティカメラなら有用。

33:53 Revisiting Matrix Multiply

入力データと掛け合わせるNeuron Weights行列をFlash Transistorsで構築する。


34:00 Analog Circuit Give us the MAC we need

35:13 DACs& ADCs Give us the flexible Architecture
Programmability (XLA/ONNX -> Mythic IPU)

TensorFlow コンパイラ 「XLA」を提供
https://developers-jp.googleblog.com/2017/03/xla-tensorflow-compiled.html

・TensorFlow は柔軟で拡張可能なシステムを目指して設計されており、任意のデータフロー グラフを定義して、それらのグラフをCPU や GPU などのさまざまな計算デバイスに分散させ、効率的に実行できるようになっています。
・XLA は、ユーザーが作成した TensorFlow グラフを JIT コンパイル技術により実行時に分析します。ランタイムにおける実際の次元や型に応じて特化したグラフをを生成し、複数の演算をまとめて、CPU や GPU、カスタム アクセラレータ(Google の TPU など)などで効率的に実行できるバイナリコードを生成します。



https://www.itmedia.co.jp/news/articles/1709/08/news051.html

・米Microsoftと米Facebookは9月7日(現地時間)、AI(人工知能)開発者がフレームワーク間のスイッチを簡単にできるようにするオープンソースプロジェクト「Open Neural Network Exchange(ONNX)」を公開したと発表した。GitHubで公開されてる。

・ONNXは、あるAIフレームワークで構築した学習モデルを異なる機械学習システムに簡単に切り替えることを目的としており、Facebookの「Caffe2」と「PyTorch」、Microsoftの「Cognitive Toolkit(CNTK)」をサポート。




36:25 Mythic Mixed Signal Computing
Single Tile = DAC -> Weight Storage & Analog Matrix Multiplier -> ADC, SRAM, RISC-V, SIMD, Router
タイルがお互いに通信する。

37:17 Mythic Mixed Signal Computing
Single Tile --> Tiles connected in a Grid --> Expandable Grid of Tiles(Exmaple DNN mapping(Post-Silicon) )

・我々はそれらをチップの異なる領域にマッピングすることによってシステム上の複数のアプリケーションをサポートすることができる。
・そのため、アプリケーションを物理的なハードウェアのグリッドにマッピングするFPGAのように考えることができます。
・FPGAで複数のアプリケーションをサポートしたい場合は、FPGAを複数の領域に分割することができます。

37:49 System Overview
Intelligence Processing Unit (IPU)

・システムは完全にタイルベースの設計なので、システムは高度に設定可能で拡張可能です。
・we have our initial product which has 50 million weight capacity PCI Express 2.1 with four channels
・すぐに別バージョンをテープアウトする。
 - Envisioned(想像される) Customization
  Up to 250M weight
  PCIe 2.1 x16
  USB3.0/2.0
  Direct Audio/Video interfaces
 Enhanced Control Processor (e.g. ARM)

38:51 System Overview
Mythic is a PCIe Accelerator

Mythic IPU (Inference Model (*1) <----(data via PCIe)-- / --(inference result via PCIe)--> Host SoC(OS, App, Interface, Mythic IPU Driver)
カレンダー
11 | 2019/12 | 01
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード