2017年8月6日日曜日

TE0720 No.3 (BNN-PYNQを動かしてみる)

今度は BNN-PYNQ をTE0720で動かせるかをやってみている。
BNNはBinarized Neural Network (BNN) (2値化ニューラルネットワーク)のことで、BNN-PYNQはPYNQ-Z1ボードのシステム向けのBNNの実装だ。PYNQ-Z1に搭載されているZynqデバイスはZYNQ XC7Z020-1CLG400C、TE0720のそれはXC7Z020-1CLG484Cであり、ピン数は異なるがコアは同じXC7Z020なので動くんじゃないかと考えた。そのためには、PYNQ用のLinuxシステムをTE0720で動かす必要がある。PYNQ-Z1のprecompiled image(pynq_z1_image_2017_02_10.zipPYNQのGitHubからダウンロードして中を見てみた。

pynq_z1_image_2017_02_10.imgはディスクまるごとのイメージでboot用パーティションとrootfs用のパーティションが入っている。そこで、それぞれのパーティションのイメージをddコマンドで抽出した。

必要なのはrootfsの方なので、これをcpioイメージに変換しておく。

前回のブログで作成したpetalinuxのSDカードのrootfsパーティションの内容を、抽出したPYNQのrootfsに書き換え、TE0720に装着して起動してみた。

起動してコマンドプロンプト表示まで行くのだが、キー入力を受け付けない。
現状、FPGAのPL部はTE0720のsampleデザインになっており、PYNQ-Z1ボードのそれとは異なる。起動時の処理で初期化か何かでPL部にアクセスをしていた場合は当然ハングアップする可能性は考えられる。ただし、BNN-PYNQはBNNの推論部をFPGA Overlaysの機能を使ってシステム起動後にFPGAにダウンロードして動かしているはずであり、起動時のPL部にはその回路は入っていないはずである。GitHubからPYNQのプロジェクトをダウンロードし、VivadoでBlock Designを見てみた。

Arduino sheild用の回路やHDMI、GPIO等の回路が入っているようだ。これらを起動時に初期設定しているのかも知れない。そこで、rootfsの/etc/rc 関係を見てみたところ rc.local にあった。

各シェルスクリプトの内容を確認した結果、4_boot_leds.shでPL部のGPIOを介してボード上のLEDのon/offをしていることが判った。そこで、rc.localの4_boot_leds.shの呼び出し部分をコメントアウトするように変更し、再度TE0720に装着して起動してみたところ、今度はキー入力も受け付けるようになった。

イーサネットも動作しておりDHCPでIPも取得できている。

そこで、開発PCのブラウザからTE0720のJupyter notebookのポートにアクセスしてみた。

アクセスできた。
そこで、次にBNN-PYNQのGitHubのQuickStartの記載内容に従って、BNN-PYNQをインストールした。

  sudo pip3.6 install git+https://github.com/Xilinx/BNN-PYNQ.git

すると、Jupyter notebookの項目にbnnが現れた。


Cifar10.ipynbを選択して実行してみた。

が、Jupyter notebookカーネルが死んでしまった。 orz

cell単位でステップ実行してみると、最初のcellでカーネルが死んでしまっていた。
overlayでPL部にダウンロードするBNN-PYNQのBlock DesignをVivadoで見ると以下のようであった。

これを見るとデバイス外部への入出力は無いので、TE0720でも動きそうな気がするのだが・・・
そこで、スクリプトをpythonスクリプトとしてダウンロードし手動で実行してみた。


terminate called after throwing an instance of 'char const*'というメッセージが出て終了してしまっていた。念の為、最初のセルの内容だけのスクリプトを書いて実行してみた。

classifier = bnn.CnvClassifier('cifar10')でエラーになっているようだ。
そこから、/opt/python3.6/lib/python3.6/site-packages/にあるpynqディレクトリ下のスクリプトやbnnディレクトリ下のスクリプトを追ってみた。回路情報(bitファイル)の/dev/xdevcfgへの書き込みは成功しているようだが、その後のpython_hw-cnv-pynq.soというライブラリ内部で例外が発生しているようだ。ソースコードを見ると、このpython_hw-cnv-pynq.soはパラメータのダウンロードを行うライブラリのようだ。なぜここで例外になる??? うーむ……


0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 22

今使用しているモータードライバはDM556Dというものだが、このドライバはMicro Stepが 800 [pulse/rev] 〜 40000 [pulse/rev]の範囲で設定できる。 Mi...