Posts Tagged with "FPGA"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
posted by sakurai on March 24, 2019 #93

FusionPCBにオーダーしていた基板が届きました。以前の設計時のブログの続きです。

非常に小さい基板で、以下に基板の100円硬貨との比較写真を示します。基板業者は前回と同じFusionPCBで、今回はOSCという速達配送業者を利用して9.9USDでした。基板のみで製造に7.94日、OSCによる配送にシンセンから日本まで3.13日かかっています。シンガポール郵便よりはだいぶ早いですね。9.9USDの内訳は、7.9USDが基板制作代、2.0USDがOSCの配送料のようです。

前回はソルダーレジストを白で製造しましたが、今回は黒にしてみました。Ultra96toPMODボードもオーダーしています。レベル変換ICのみSMDだったので、手ハンダはマイクロスコープ下のハンダ付け作業となり厳しいため、レベル変換ICのみ実装もオーダーしました。

図93.1
図92.1 基板写真

これに部品を実装したものを次の図に示します。

図93.2
図92.2 基板に部品を実装した

UltratoPMODボードに取り付けて正常に動作することを確認しました。


左矢前のブログ 次のブログ右矢

posted by sakurai on March 21, 2019 #92

最急降下法は問題があります。例えば、 $$f(x_1,x_2,x_3)=x_1^2+\frac{x_2^2}{20}+x_3^2$$ のような関数があったときの収束曲線を見てみると次のような図になります。

図92.1
図91.1 座標位置の推移

こうなるのは、出発点から見て、関数の最小値(あるいは極小値)のある方向が、出発点の最も傾斜が急な方向と、必ずしも一致しないためです。

前述のように、一段のニューロンだとフィッティングに制限がありますが、さらに隠れ層のレイヤを加え、活性化関数の非線形性を導入することで、より自由な関数へのフィッティングが可能となります。

フィッティングをどのように実施するかですが、バックプロパゲーションを行います。バックプロパゲーションは、結果値が正解値とどれだけ乖離しているかを損失関数により評価し、それを各レイヤの重みベクトル$\boldsymbol{w}$に変換して、後段から前段に向かって伝えるものです。

このときに勾配テンソルが偏微分のチェインルールにより、後段から前段に向かって次々に簡単に求められるところがミソです。


左矢前のブログ 次のブログ右矢

posted by sakurai on March 5, 2019 #91

最急降下法

最適化の手法として最急降下法がしばしば用いられます。本来は、n次元ベクトル空間でのコスト関数の最小解が知りたい場所ですが、最小解を解くことは困難なので、極小解を求めます。出発点のまわりの谷底を見つけるわけであり、谷に下っていく方法のひとつとして、最も傾斜のきつい方向に降りることを最急降下法と呼びます。

最も勾配の大きい方向ベクトルを求めるため、以下の式のようにベクトル要素の偏微分をとるハミルトニアン演算子を使用します。 $$\nabla f=\left(\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\frac{\partial f}{\partial x_3}\right)$$ このハミルトニアン演算子を用いると、最急降下法による変位ベクトルは以下のように簡略に記述できます。 $$\varDelta\boldsymbol{x}=-\eta\nabla f$$ ここで$\eta$は正の小さい数、例えば0.1とします。これは学習率と呼ばれます。

これを具体的に見てみます。例えば、 $$f(x_1,x_2,x_3)=x_1^2+x_2^2+x_3^2$$ という関数があるとき、その偏微分は $$\frac{\partial f}{\partial x_1}=2x_1, \frac{\partial f}{\partial x_2}=2x_2, \frac{\partial f}{\partial x_3}=2x_3$$ となります。点$(1.0, 2.0, 3.0)$から開始して最急降下法による漸化式をExcelで実行させてみました。

繰り返し回数 $x_1$ $x_2$ $x_3$ $\frac{\partial f}{\partial x_1}$ $\frac{\partial f}{\partial x_2}$ $\frac{\partial f}{\partial x_3}$ $\Delta x_1$ $\Delta x_2$ $\Delta x_3$
0 1.000 2.000 3.000 2.000 4.000 6.000 -0.200 -0.400 -0.600
1 0.800 1.600 2.400 1.600 3.200 4.800 -0.160 -0.320 -0.480
2 0.640 1.280 1.920 1.280 2.560 3.840 -0.128 -0.256 -0.384
:
41 0.000 0.000 0.000 0.000 0.000 0.001 -0.000 -0.000 -0.000
42 0.000 0.000 0.000 0.000 0.000 0.001 -0.000 -0.000 -0.000
43 0.000 0.000 0.000 0.000 0.000 0.000 -0.000 -0.000 -0.000

のように、43回目で偏微分が全て小数点3桁までゼロとなり、局所最小値$(0.0, 0.0, 0.0)$が求められました。図91.1にこの座標$(x_1, x_2, x_3)$の推移を示します。偏微分で求めた勾配を逆に下っていく様子が現れています。

図91.1
図91.1 座標位置の推移

前稿のシグモイドニューロンを多層化することにより、任意の分類が行えるようになります。


左矢前のブログ 次のブログ右矢

Neural NetworkをFPGAに実装する

posted by sakurai on March 1, 2019 #90

Neural Network (以下NN)の理論を確認していきます。以下にシグモイドニューロンの図を示します。

図90.1
図90.1 シグモイドニューロン

図90.1のように入力値$\boldsymbol{x}$及び係数$\boldsymbol{w}$をそれぞれn次元ベクトルとし、その積が閾値$\theta$より大きい時に発火する場合、活性化関数をシグモイド$\sigma(x)$として、

$$y=\sigma(\boldsymbol{w}\cdot\boldsymbol{x}-\theta)$$

のように表せます。ここで、$-\theta=b$(bはバイアス)とおけば、

$$y=\sigma(\boldsymbol{w}\cdot\boldsymbol{x}+b)$$

となります。このシグモイド関数$\sigma(x)$は、

$$\sigma(x)=\frac{1}{1+e^x}$$

で定義され、その微分は、シグモイド関数自身を用いて

$$\sigma'(x)=\sigma(x)\left(1-\sigma(x)\right)$$ と表せます。シグモイドは微分が簡単な形で表されるので、学習時のバックプロパゲーションにおいて非常に便利な性質です。一方、勾配消失の問題があることから、近年は使用されず、ReLUにとってかわられています。

図90.2
図90.2 シグモイド関数

左矢前のブログ 次のブログ右矢

FPGAで機械学習 (3)

posted by sakurai on February 25, 2019 #89

ブート

Ultra96にはMiniDPケーブル経由でディスプレイを接続し、またUSB経由でキーボードとマウスを接続しておきます。前回焼きこんだSDカードをUltra96に差し込み、電源を入れ、リセットスイッチを押すとLinuxがブートします。

ライブラリインストール

プログラムを展開します。文字が小さくて見づらかったのですが、なんとかターミナルを立ち上げられました。

root@ultra96:~# cd /home/linaro/
root@ultra96:/home/linaro# tar xvzf xlnx_dnndk_2.08_1901.tar.gz

これにより各種プログラムが展開されます。次にUltra96のディレクトリに移り、

root@ultra96:/home/linaro# cd xilinx_dnndk_v2.08/Ultra96
root@ultra96:/home/linaro/xilinx_dnndk_v2.08/Ultra96# bash install.sh Ultra96

により、必要なDNNライブラリをインストールします。ここで評価ボードの再起動が必要となります。

コンパイル&ラン

各種デモプログラムはコンパイルしてランするだけで全て動作しました。

図89.1
図89.1 ADAS認識デモ(SSD)

静止画の画像認識はResnet50やMobileNetを用いており、それぞれ25FPS、116FPSとかなり性能差があります。 また動画の画像認識は、face detectionはDenseBox、adas_detectionはYOLO-V3、video analisysはSSDを用いていることがわかりました。以下の性能表によればそれぞれ133FPS、30FPS、33FPSとなっています。ほぼリアルタイムで認識していることがわかります。

図89.2
図89.2 各デモの性能

認識ソフトウェアは、様々な動画フォーマットに対応しており、調べた限りではMOV, AVI, MP4に対して動作しました。また、解像度も柔軟に対応しています。ただしFPSは解像度により上下するため、比較する際には解像度を合わせないと、正しいネットワーク性能比較になりません。例えばデモ動画では、adas_detectionの動画は512x256の15FPS(640kbps)、video_analisysの動画は480x360の12FPS(954kbps)と微妙に異なっています。

認識率に関しては、YOLO-3はあまり問題を感じませんでしたが、SSDはかなりfalse positiveがあり、(バグかもしれません)このままでは使用できないと感じました。


左矢前のブログ 次のブログ右矢

FPGAで機械学習 (2)

posted by sakurai on February 20, 2019 #88

資料やデータの入手

まずXilinxのアカウントは所持しているものとします。次にXilinxのエッジAI開発者ハブのページに行き、以下に示すデータをダウンロードします。ここで対象の評価ボードは、過去記事でインベーダーゲームを搭載したUltra96ボードを使用します。

SDカードへブートイメージの焼きこみ

基本的には上記ユーザーズガイドに基づいて実施します。まずSD焼きソフトであるEtcherを入手します。次に上記評価ボードのブートイメージファイルを、zipは解凍しなくても大丈夫なので、そのままEtcherでSDに焼きます。

図88.1
図88.1 Etcher

デモプログラム類の書き込み

デモプログラムやデータを評価ボードに移さなければなりません。ユーザーズガイドではネットワークでscpすると記述されていますが、Ultra96の無線LANがうまくつながらなかったため、SDにあらかじめ移しておくことにしました。

VirtualBox等のVMを用いたLinuxでSDをマウントしてコピーします。USBインタフェースを持つSDカードリーダを使用しました。VMにおいてはUSBをVM側で見えるように設定しておく必要があります。

上記イメージを書き込んだSDは、図88.2のように第1パーティションがFAT32、第2パーティションがext4となっています。第2パーティションをGpartedで拡張しておきます。

図88.2
図88.2 Gpartedでext4を拡張

デモプログラムは800MB以上あるため第1パーティションには入らないので、第2パーティションにコピーします。

virtaul_machine # cp xlnx_dnndk_2.08_1901.tar.gz /run/media/user/ROOTFS/home/linaro/
virtual_machine # sync


左矢前のブログ 次のブログ右矢

FPGAで機械学習

posted by sakurai on February 16, 2019 #87

機械学習

そもそもFPGAボードを購入したのは機械学習(以降ML)をさせたかったのですが、その前に設計フローの勉強としてインベーダーゲームを作成しました。作成途中では拡張ボードが必要になり、急遽Pt板設計CADを勉強したりPt板を発注したりという作業が発生しましたが、今回からMLの話題に移ります。

エッジAI

AIもMLも同様な意味で使われていますが、本命はエッジAIです。現状は良いモデルの探求や膨大な学習の必要性から、クラウド側でGPUが多用されています。ただ、一旦学習が完了すればそれを多数の端末にデプロイします。せいぜい数十個のGPUがセンター側で必要なのに対し、車載ADAS/ADでは数百万台出荷されるため、半導体ビジネスからみると圧倒的にエッジAIのほうが魅力的です。

エッジAIの部品

エッジAIにおいては何より低電力、低コストが求められるので、一台10万円もするようなGPUは、コスト、電力、発熱共に使用できません。従来はFPGAも高価でしたが、近年のXilinx Zynq UltraScale+等のようなチップであれば価格はGPUの1/100のオーダーです。ということでFPGAでMLすることを考えます。

エッジAIのフレームワークDNNDK

フレームワークとはAIの業界ではTensorFlowやChainerを意味することが多いのですが、ここではエッジAIのソフトウェア基盤の意味で用いています。具体的にはDeePHiの作成した以下に示すDNNDKフレームワークを使用します。DeePHiはXilinxによって昨年買収されました。

図87.1
図87.1 DNNDKスタック

左矢前のブログ 次のブログ右矢

posted by sakurai on February 8, 2019 #86

ゲームの完成

以前の記事で実装したインベーダゲームを、Ultra96及びUltra96toPMODインタフェースボードの組み合わせと、ジョイスティックで動作させることができました。絵も音も、UltraZedボードと全く同様に出ています。

動画のフルキーボードは全く使用していません。Ultra96に上記PMODインタフェースボードを接続し、それにPMOD-VGAボード、PMOD-I2Sボード、自作PMODジョイスティックSWボードを接続し、動画中のジョイスティック及びスイッチにより操作しています。

図86.1
図86.1 Ultra96のインベーダゲーム

共通シーケンス

ゲーム自体はまだ改良の余地があり、共通ステートシーケンスをソフトで言うところのサブルーチン化する等のリファクタリングを実施中です。図86.2にその一例を示します。パターンROMからいろいろな形、例えばインベーダ、自機、ベース、UFO等をVRAMに矩形転送するシーケンスは、多用されますが、それぞれにシーケンサを用意していると大変なロジック量になります。これをサブルーチンのように、{ソースX座標、ソースY座標、横幅、縦幅、デスティネーションX座標、デスティネーションY座標}の6個を入力パラメータとして、シーケンスを呼びだすことでシーケンスの共通化が可能です。呼び出す前には戻り番地をリターンレジスタに退避してから呼び出します。呼び出し先で戻るときにはリターンレジスタをステートに代入して戻ります。

図86.2
図86.2 共通シーケンス(=サブルーチン)

本来はプロセッサのソフトウェアで実行する、十分複雑なシーケンス制御をハードウェアで実装してみて判明したのは、まさにプロセッサの進化のリバース(逆行)だということです。FSMシーケンスを共用化する目的で、前述のようにリターンレジスタを実装しましたが、これはプロセッサのリンクレジスタと同じです。

水平マイクロ

現在マイクロプログラム処理をあまり見なくなったのは論理合成のためだと思います。論理合成が無い時代はハードウェア論理を変更するのは大変な作業で、それを簡単にするために、FSMではなくマイクロプログラム処理を考え、ROMの内容を書き換えることで、処理の変更を行ったわけです。今回のFSMシーケンス記述は、いわば、インベーダ処理プロセッサの超水平マイクロを書いているようなものです。ちなみに水平マイクロには、普通プロセッサレベルのISAには存在しない、マルチウェイ分岐等の強力な命令があります。

ESDAツール

最近ではSDSoCなりVivado-HLSなりが使えるので、Cで書こうかとも思いましたが、今回はVerilogで記述してみました。VerilogはCに対するアセンブラとも言われますが、コード量的にはそれほどの差はありません。20年ほど前にESDAツールがあったのですが、最近はどこへ行ってしまったのでしょうか。動作合成が進んだのでなくなったのかもしれません。同じアルゴリズムをCで書いてみると、ESDAが不要かどうかが分かると思います。


左矢前のブログ 次のブログ右矢

posted by sakurai on February 5, 2019 #85

Ultra96対応だけであれば変換ボードに吸収しても良いのですが、 スイッチ類をUltraZedボードに差し替えて使用する場合には、前述のとおりインタフェースが必要になります。その理由は、遠い場所にあるスイッチは単なるロジックではなく電装線路扱いとしなければ、反射が起き、正常に動作しないためです。

この反射を抑えるために、図85.1のような回路を設計しました。

図85.1
図85.1 回路図

このボードを作成しました。手ハンダでも作成できるようにSMDは使用しないようにしています。

図85.2
図85.2 ボードレイアウト図

EagleUpを用いて3D化します。

図85.3
図85.3 ボードイメージ

前々回作成したUltra96からPMODへのインタフェースボードと組み合わせ、レンダリングしたものが図85.4です。フラットケーブルの先(反対側)には前回のジョイスティック及びスイッチを接続します。

図85.4
図85.4 結合ボードイメージ

左矢前のブログ 次のブログ右矢

posted by sakurai on February 3, 2019 #84

ジョイスティックとスイッチの入力装置を作成します。ジョイスティックもプッシュスイッチも単なるマイクロスイッチですが、問題は遠いところにあることです。例えば線長が1m程度もあります。そのままだと反射が激しくなり、電装線路の終端が必要になります。今回の場合終端しなければ、しばしば50MHz程度の定常波が発生しました。

図84.1
図84.1 ジョイスティックとスイッチ入力装置

写真のジョイスティックやプッシュスイッチはパーツショップで1,000円程度で購入できます。またそれらを取り付ける台は100円ショップで半透明のPPケースを購入しました。以下に、ボード以外で必要な部品表を示します。

品名 単価 数量 備考
ジョイスティック 980円 1 http://akizukidenshi.com/catalog/g/gP-10992/
プッシュスイッチ 150円 2 http://akizukidenshi.com/catalog/g/gP-07248/
PPケース 100円 1 https://cdn-ak.f.st-hatena.com/images/fotolife/s/simplehome/20170303/20170303152651.jpg
ネジM4x6mm 5円 4 http://akizukidenshi.com/catalog/g/gP-07326/(100個入り500円)
ナットM4 10円 4 http://akizukidenshi.com/catalog/g/gP-11730/(50個入り500円)
フラットケーブル5芯 79円 1.0m https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-04N5(158円)
配線材料 - 少々 http://akizukidenshi.com/catalog/g/gP-11641/(1mx10本入り300円)


左矢前のブログ 次のブログ右矢


ページ: