AIエッジコンテスト(実装コンテスト)のチュートリアル【3: Ultra96ボードのCPUで推論実行】


前回で学習環境を準備してCNNモデルを学習しました。次はコンテストの対象ボードであるUltra96にPYNQフレームワークを設定してPyTorchをインストールし、推論を実行してみましょう。とりあえず結果は出るので、コンテストに参加できますね!

環境

ホストPC:Ubuntu 16.04 LTS (Windows, MacユーザはVMWare, Parallel Desktop等の仮想環境をインストールして、その上にUbuntu 16.04 LTSをインストールしてください。Ubuntu18.04LTSでもできると思いますが、確認しておりません。)

用意するもの

  • PYNQ(v2.5)のイメージファイル
  • インターネットに接続できる環境の確認(有線LAN or Wifi)

PYNQとは

PS上のPython でUltra96V2上のPLを制御することができるフレームワークです。OSはUbuntu18.04 LTS (PYNQv2.5)なので、学習と同じ環境で設計ができます。後日公開予定のハードウェアアクセラレーション編でもUbuntu上に設計ツールをインストールしますのでお勧めします。
Google Colabを使った学習と同様に、Ultra96V2での実行もJupyterNotebookで行うことができます。便利ですねぇ。

PYNQのセットアップ

2.1 PYNQイメージの入手とセットアップ

PYNQの公式ドキュメント(https://ultra96-pynq.readthedocs.io/en/latest/) に従ってSDカードにPYNQイメージ(version 2.5)を焼いてください(ISOを直接SDカードにドラッグアンドドロップしてコピーする人がいますが、それではUltra96ボードを起動できません。。)

2.2 PYNQとホストPCの接続

PYNQドキュメント通りにホストPCとUltra96V2ボードが接続されていることを確認してください(下の図参考)。

2.3 PyTorchのインストール(この作業は一度だけでよいです)

公式のPyTorchサイトではインストール方法が選べて大抵の環境ではコマンド一発でインストールできるのですが、運の悪いことにUltra96V2のビルド済みPyTorchがありません‥。面倒ですが、私がビルドしたPyTorchバイナリをUltra96に転送してインストールしましょう。そのため、Ultra96ボードをインターネットに接続して作業を行います。

2.3.1 Ultra96V2ボードをインターネットと接続
ライブラリをダウンロードするので、インターネットに接続します。2通りの方法があるので、どちらかの方法でインターネットと接続してください。

2.3.1.1 USB-LANコネクタを使う場合(LANケーブルとルータ等を準備してください)
Ultra96V2のUSBポートにUSB-LAN変換コネクタをそのまま繋げばインターネットに接続できます。 たとえばこんなもの↓がAmazonで売ってます。後述するWifi設定が面倒なら、金の力で解決しましょ(笑

2.3.1.2 Wifiを使う場合(Wifiアクセスポイントを準備してください)

ホストPCのブラウザ(UbuntuはFirefoxがデフォルトでインストールされている)を起動して、URLに "http://192.168.3.1:9090" と入力してください。PYNQ上のJupyter Notebookにアクセスできます。

Jupyter Notebookの”/common/”をクリックしてWifiを設定するノートブック(wifi.ipynb)を起動します。

ノートブック内にWifiの情報を入力してください。接続テストもできます。

2.3.2 SDカードのswap 領域を拡張

SSHコマンドを使ってUltra96V2上で作業を行います。ホストPCでTerminalを起動します。

(ホストPC) $ ssh [email protected]

※パスワードを要求されるので”xilinx”を入力。
※ホストPCとUlra96V2で作業するのでTerminalを2つ起動しておくと捗ります。

インストール時にメモリを消耗するので, 以下のコマンドを実行してswap領域を拡張してください。

(Ultra96V2) $ swapon -s
(Ultra96V2) $ sudo dd if=/dev/zero of=/swap1 bs=1M count=2048
(Ultra96V2) $ sudo mkswap /swap1
(Ultra96V2) $ sudo vi /etc/fstab 

と入力して以下を追記。

/var/swap none swap sw 0 0
/swap1 swap swap

保存をして以下を実行。

(Ultra96V2) sudo swapoff /swap0
(Ultra96V2) $ sudo swapon /swap1

終わったら

(Ultra96V2) # reboot

としてUltra96V2を再起動。

2.3.3 必要ライブラリをインストール
再起動したUltra96V2ボードにSSH接続して作業を行いましょう。

(ホストPC) $ ssh [email protected]

以下のコマンドを実行して必要なライブラリをインストールします。sudo suコマンドを実行して管理者権限(プロンプトが「#」になる)で実行してください。

(Ultra96V2) # sudo su →パスワード(デフォルトはroot)を入力
(Ultra96V2) # apt-get install libopenblas-dev cython libatlas-base-dev m4 libblas-dev python3-dev cmake python3-yaml

2.3.4 ビルド済みPyTorchをダウンロード
以下にUltra96V2用のビルド済みPyTorch(1.4.0)と対応したTorchVisionを置いていますので、ホストPC上にダウンロードして、scpでUltra96V2に転送してください。
(Ultra96V2上で直接wgetを使ってダウンロードしてもOKです)

torch-1.4.0a0+4bcf479-cp36-cp36m-linux_aarch64.whl
torchvision-0.5.0a0-cp36-cp36m-linux_aarch64.whl

ホストPCダウンロード先のディレクトリに移動した状態で以下を実行

$ scp torch-1.4.0a0+4bcf479-cp36-cp36m-linux_aarch64.whl [email protected]:/home/xilinx
$ scp torchvision-0.5.0a0-cp36-cp36m-linux_aarch64.whl [email protected]:/home/xilinx

2.3.5 PyTorchをインストール 
SSHでUltra96V2に接続してビルド済みPyTorchをインストールします。

(Ultra96V2) $ sudo pip3 install torch-1.4.0a0+4bcf479-cp36-cp36m-linux_aarch64.whl 

2.3.6 ビルド済みTorchVisionをインストール
同様にTorchVisionもインストールします。

(Ultra96V2) $ sudo pip3 install torchvision-0.5.0a0-cp36-cp36m-linux_aarch64.whl

2.4 サンプル推論プログラムをホストPCにダウンロード

サンプル推論プログラム一式.zipをホストPCにダウンロードして、zipファイルのままUltra96V2に転送します。
※後日githubにアップしておきました。

(ホストPCダウンロード先のディレクトリ) 
$ scp FPGA_AI_Edge_Contest_2019-master.zip [email protected]:/home/xilinx

転送後, SSHで接続したUltra96V2上で解凍、ディレクトリ名を変更しておきます。

(Ultra96V2) $ unzip FPGA_AI_Edge_Contest_2019-master.zip
(Ultra96V2) $ mv FPGA_AI_Edge_Contest_2019-master FPGA_AI_Edge_Contest_2019

2.5 学習済みモデルをダウンロードしてホストに転送

手順1.6で生成された学習済みモデル(ここではyolov2_epoch20.pthとします)をUltra96V2に転送します。

ホストPCで学習済みモデルをダウンロードしたディレクトリ上で以下を実行。

$ scp yolov2_epoch20.pth [email protected]:/home/xilinx

デモを動かすため、Ultra96V2とGoogle Colab上で学習に使ったディレクトリ構造を一致させます。

(Ultra96V2) $ cd /home/xilinx/FPGA_AI_Edge_Contest_2019/Training
(Ultra96V2) $ mkdir yolov2_alex_1
(Ultra96V2) $ mv /home/xilinx/yolov2_epoch20.pth yolov2_alex_1

2.6 推論を実行

デモ用ノートブック(demo.ipynb)をホストPCにダウンロードしてください。scpコマンドでUltra96V2に転送します。

(ホストPCダウンロード先のディレクトリ) 
$ scp demo.ipynb [email protected]:/home/xilinx/jupyter_notebooks

Ultra96V2に接続し、Jupyter Notebookを起動して demo.ipynb を実行して手順通りにノートブックを動かしてみてください。下のようになるはずです。

いかがでしたでしょうか。無事に推論できましたか?実行結果が保存されるので、scpを使ってホストPCに転送すれば少なくとも提出はできると思います。しかし、推論、遅いですねぇ。。

次はいよいよUltra96に乗っているFPGAを使ってハードウェアアクセラレータを作ってみましょう!