ザイリンクス社「Vitis™ AI開発環境」を評価キット ZCU102 で動かしてみた

私はTEPPE-AI(テッペ―エーアイ)と申します!
PALTEKでAIエンジニア担当をさせていただいております。
このたびPALTEKが、TECHブログを新設しました。
様々なエンジニアから技術紹介を発信させていただきますので是非チェックしていただけますと幸いです!
執筆者の自己紹介
今回はAIエンジニア担当の私、TEPPE-AIが執筆させていただきます。
まだ入社してまもない、駆け出しエンジニアですがどうぞ温かく見守っていただけるとうれしいです・・。
まずは簡単な自己紹介から!

-
★名前:TEPPE-AI 年齢:25歳(未婚)
★出身:新潟県(標準語で喋れますのでご安心を)
★趣味:テニス 鉄道旅 ゲーム ペン回し ラーメン屋めぐり
★経歴:前職で人工知能の開発、その後PALTEKに転職(まだまだ駆け出しなので経歴みじかい・・・)
★容姿:身長は大きいほう(180cmぐらい) よく笑い、よく寝る!そして何処にでもいる顔!
自己紹介はこれくらいにしまして・・・、今回わたしが執筆させていただくお題はこちら!
ザイリンクス社「Vitis™ AI開発環境」 を評価キット ZCU102 で動かしてみた
「ザイリンクス社が提供しているVitis™ AI開発環境を駆け出しエンジニアが触ってみたら・・・」です。
初心者エンジニア目線になって誰にでも分かりやすく、を目標に書きました。
さてどんな結果になったでしょうか。ぜひ読み進めてください!
1.はじめに
ところで皆さんザイリンクス社ってご存知ですか?
アダプティブ/インテリジェント コンピューティングのリーダーとして、FPGAやSoC、ACAPを提供しているメーカーです。
FPGAやSoCを発明してきたメーカーなんですよ!
そんなの知ってるよ!って感じですかね!
そのザイリンクス社が提供するAI Solution【AI Model Zoo、Vitis AI (最新ver1.1)】を、評価KIT:ZCU102上で動かしてみました。
Githubに実行方法が記載されていたので簡単にできるだろう、と余裕をかましてましたがやってみたら、
つまずく点がちらほらと・・・
なので、今回は注意すべきポイントなど紹介しながら実装までの流れをお伝えしたいと思います。
それでは参りましょう!!
※注釈
本記事は、GitHub(https://github.com/Xilinx/Vitis-AI#getting-started)に沿って紹介します。
各作業工程に参照したページを記載していますので、そちらも併せてご参照ください。
2.使用機材
使用する機材として、以下のものを準備しました。
◆hostPC◆
OS:Ubuntu18.04 LTS
開発マシンとしてLinux搭載が必須になります!
windowsPCでは開発できませんので、ご注意願います!!
◆windowsPC◆
OS:windows10
「hostPCとZCU102のファイル転送」「ZCU102コマンドベース操作用」として用いました。
先ほども申し上げましたとおり、開発用としては用いていません。
作業を効率化させるために用意しましたので、必須ではありません。
◆評価ボード◆
Zynq® UltraScale+™ MPSoC ZCU102
◆SDカード◆
Micron製 industrial micro SD card 32GB
16GB以上のものであれば大丈夫です!
ZCU102はSDカード必須なので、今回はmicroSD→SD変換アダプタを用いました。
3.事前準備
事前準備として、各PCにインストールを行います。◆hostPC◆
①dockerのインストール
(参照ページ:https://github.com/Xilinx/Vitis-AI/blob/master/doc/install_docker/README.md)
-コンパイル及びビルドtool等がdocker containerで提供されているため、dockerをインストールする必要があります。
-もしない場合、GitHubにインストール方法が記載されているので、こちらを参照してください。
→https://docs.docker.com/install/linux/docker-ce/ubuntu/
-今回はCPU版を用いるので、NVIDIA Dockerはインストールしませんでした。
②docker imageのインストール
(参照ページ:https://github.com/Xilinx/Vitis-AI/blob/master/doc/install_docker/load_run_docker.md)
-docker imageをザイリンクス社公式のDockerHubよりインストールします。
-文頭の"HERE"をクリックすると、DockerHubにサインインを求められますが、不要です。
-以下のURLにアクセスし、Docker Pull Commandを実行します。
→https://hub.docker.com/r/xilinx/vitis-ai
③Vitis AI GitHubのインストール
-用いるtoolやsampleすべてが保存されているGitHubのリポジトリをcloneします。
※今回は、作業ディレクトリとしてvitisを作成し、その直下にcloneしました。
$ mkdir ~/vitis
$ cd ~/vitis
$ git clone https://github.com/Xilinx/Vitis-AI
④imagenetのダウンロード
-本作業では、imagenetの画像を用いますので予めダウンロードをします。
-ILSVRC2012_val_00000001.JPEG ~ ILSVRC2012_val_00001000.JPEG
を用意します。
-用意した画像を先ほどcloneしたVitis AIリポジトリ(Vitis-AI/Tool-Example/images)に移動します。
◆windowsPC◆
①WinSCPのダウンロード
-hostPCからZCU102へのファイル転送を行う際に用います。
(参考:https://forest.watch.impress.co.jp/library/software/winscp/)
②Tera Termのダウンロード
-hostPCからZCU102をUART経由で操作する際に用います。
(参考:https://ja.osdn.net/projects/ttssh2/releases/)
◆評価ボードZCU102◆
①imgをSDカードへ書き込み
(参照ページ:https://github.com/Xilinx/Vitis-AI/tree/master/VART#setting-up-the-target)
-ZCU102用のimgファイルのダウンロードリンクが記載されているので、"ZCU102"をクリックしダウンロードします。
-hostPCがubuntuのため、SDカードへの書き込みファイルはEtcherを用いました。
(参考:https://www.balena.io/etcher/)
4.学習済みモデルのコンパイル
準備も整いましたので、早速取り掛かりますか!
AI-Model-Zooにある学習済みモデル(resnet50,tensorflow)を用いてZCU102への実装を行います。
初めに、学習済みモデルをZCU102で処理できる形式に変換(コンパイル)を行っていきます。
※◆は必須作業、◇は必須ではない作業になります。
◆事前準備
(参照ページ:https://github.com/Xilinx/Vitis-AI/blob/master/doc/install_docker/load_run_docker.md#cpu-tools-docker)
①docker containerの起動
-今回はCPU版を使用します!こちらを起動します。
$ cd ~/vitis/Vitis-AI
-起動の前に一つ確認します!
※以下のコマンドでhostPCにdocker imageが存在しているか確認することをお勧めします!
$ docker image ls
-いよいよ起動します・・うまくいってくれー!! (最初はここが結構緊張する・・・)
$ sudo su
$ ./docker_run.sh xilinx/vitis-ai:latest
-以下のような「Vitis AI」のロゴが出れば起動成功です!(ロゴが出たときはガッツポーズ!)
※current dirも"/workspace"となっていることも確認!
◆学習済みモデルのダウンロード
(参照ページ:https://github.com/Xilinx/Vitis-AI/tree/master/Tool-Example#2-file-preparation)
①ダウンロード用スクリプト(用意済)を実行
-(Vitis-AI/Tool-Example/)に用意済みのダウンロードスクリプトを実行します。
$ cd ~/vitis/Vitis-AI/Tool-Example
$ ./0_download_model.sh
-すると、caffe版,tensorflow版のresnet50がダウンロードされます。
→Caffe :cf_resnet50_imagenet_224_224_7.7G
→Tensorflow :tf_resnetv1_50_imagenet_224_224_6.97G
②tensorflow toolの有効化
-condaを用いてtensorflowベースのモデルを扱うtoolを有効化します
$ conda activate vitis-ai-tensorflow
※有効化しないままコンパイルを実行すると、以下のように怒られてしまします・・↓
作業するにあたり、何回このエラーを見たことか・・
(base)→(vitis-ai-tensorflow)になっていることを指差し確認!(ヨシッ!)
◇Quantization前のモデルの評価
(参照ページ:https://github.com/Xilinx/Vitis-AI/tree/master/Tool-Example#float-model-evaluation)
①評価スクリプトを実行
-コンパイルするにあたり、やらなくてもよいですが一応GitHubに沿ってやってみましょう。
-ダウンロードした学習済みモデルの評価するスクリプトを実行します。
$ sh 3_tf_eval_frozen_graph.sh
※そのまま実行すると、エラーが発生します!
スクリプト内の"TF_NETWORK_PATH"が定義されていないためです。
私はスクリプト内に以下の内容を追記し、実行しました。
TF_NETWORK_PATH = tf_resnetv1_50_imagenet_224_224_6.97G
-以下のように、accuracyが出力されれば成功です。
◆Quantization
(参照ページ:https://github.com/Xilinx/Vitis-AI/tree/master/Tool-Example#quantization)
①Quantizationスクリプトを実行
-学習済みモデルにQuantizationを施すスクリプトを実行します。
$ sh 4_tf_quantize.sh
※前項でも記述しましたが、そのまま実行するとエラーが発生します。
方法はいくつかあると思いますが、私は以降全てのスクリプトに
TF_NETWORK_PATH = tf_resnetv1_50_imagenet_224_224_6.97G
を定義しました。
-以下のように出力されればQuantization成功です。※15分ほどかかります
-tf_resnetv1_50_imagenet_224_224_6.97Gのディレクトリに、
"vai_q_output"が追加されます。
ディレクトリ全体図がこんな感じ↓
Quantizedディレクトリに同名のファイルがあります・・・なぜ??
試してはいませんが、こちらを使っても正常にdeployまで行けるのでしょうか・・・?
md5sumでチェックしてみましたが、違っていました。↓
◇Quantization後のモデルの評価
(参照ページ:https://github.com/Xilinx/Vitis-AI/tree/master/Tool-Example#quantized-model-evaluation)
①評価スクリプトを実行
-こちらも必須ではないですが、やってみます!
-Quantizationモデルの評価するスクリプトを実行します。
$ sh 5_tf_eval_quantize_graph.sh
※なんと・・そのまま実行するとエラーが出てしまいます・・
とある画像に対しエラーが発生します・・
なんらこれ・・・っと思わず新潟弁が出てしまいました。
よく見てみると、どうやらILSVRC2012_val_00000087.JPEGが悪さをしてるらしい・・
問題の画像ILSVRC2012_val_00000087.JPEGがこちら↓
とりあえず、87をスルーさせてやってみましょう。
↓
!!うぇ?! ・・・・・正常に成功するんかい!!
サイズを見ていると他と比べ小さい・・。サイズのせい?
ILSVRC2012_val_00000284.JPEGが87よりも小さい10KBだったので、そちらを試してみます。
早速list.txtを編集!
成功してしまった・・。どうやらサイズは関係なさそうです。(嬉しいようで嬉しくないような・・)
原因は別途調査するとして、先に進みましょう!
◆Compile
(参照ページ:https://github.com/Xilinx/Vitis-AI/tree/master/Tool-Example#compilation-for-dpu-edge-overlay-dpuv2-1)
①Compileスクリプトを実行
-気を取り直して、compileをやります!
-先ほどQuantizationしたモデルをコンパイルするスクリプトを実行します。
$ sh 6_tf_compile_for_v2.sh
※v3はAlveo用なので、お間違えの無いように!
いずれはAlveoでも試してみようと思っていますので、こうご期待!
-1分ほど待って、以下のように出力されればコンパイル成功です!
-tf_resnetv1_50_imagenet_224_224_6.97Gのディレクトリにvai_c_output_ZCU102ディレクトリが追加されます。
dpu_resnet50_0.elfがコンパイルされたモデルとなります!
ディレクトリ全体図はこんな感じ↓
これで学習済みモデルのコンパイルは終了です!
色々と落とし穴がありましたが、なんとかここまでいけました・・・・
回避策及び対策は正しくないかもしれませんが、ご参考のひとつになればと思います!
5.アプリケーションのビルド
先ほどコンパイルしたモデルと予め用意されているアプリケーションコードを用いてビルドを行います。
エッジデバイスを用いる場合、GitHubには以下の2通りのビルド方法が用意されています。
・VART samples
・Vitis AI DNNDK samples
現状どちらでも動作しますが、ビルドまでの手順及び使用toolが異なります。
Vitis AI 1.1では、VARTを用いることを推奨されているので今回は"VART sample"を用います!
◆hostPCへビルド用toolをインストール
(参照ページ:https://github.com/Xilinx/Vitis-AI/tree/master/VART#setting-up-the-host-for-edge)
①ビルド環境toolをインストール
-提供されているスクリプトをダウンロード(GitHub上のsdk.shをクリック)し、実行します。
※1.8GBもあるので、少々待ちます・・
-ダウンロード出来たら早速実行をします!
$ ./sdk.sh
※そのまま実行すると、Permisson Deniedとなるのでパーミッションを再度設定しました。
-実行すると、toolのインストール先を聞かれます。
-GitHub上では[~/petalinux]を推奨とのことで、入力して続行します。
-以下のように出力されれば、インストール成功です!
-インストール後、以下のコマンドを入力します。
$ . ~/petalinux_sdk/environment-setup-aarch64-xilinx-linux
②vitis_ai_2019.2-r1.1.0.tar.gzをダウンロードし解凍
-GitHubにあるリンク(vitis_ai_2019.2-r1.1.0.tar.gz)をクリックしダウンロードします。
-その後、以下のコマンドで解凍します。
$tar -xzvf vitis_ai_2019.2-r1.1.0.tar.gz -C ~/petalinux_sdk/sysroots/aarch64-xilinx-linux
③globのダウンロード及びビルド環境toolへインストール
-あともう一つダウンロードします!
-globをダウンロードし、解凍します。
$ cd ~
$ curl -Lo glog-v0.4.0.tar.gz
https://github.com/google/glog/archive/v0.4.0.tar.gz
$ tar -zxvf glog-v0.4.0.tar.gz
-ビルドし、ビルド環境toolへインストールします。
$ cd glog-0.4.0
$ mkdir build_for_petalinux
$ cd build_for_petalinux
$ unset LD_LIBRARY_PATH; source ~/petalinux_sdk/environment-setup-aarch64-xilinx-linux
$ cmake -DCPACK_GENERATOR=TGZ -DBUILD_SHARED_LIBS=on -DCMAKE_INSTALL_PREFIX=$OECORE_TARGET_SYSROOT/usr ..
$ make && make install
→以下のような出力になります(一部抜粋)。
$ make package
→以下のような出力になります(一部抜粋)。
これでhostPCへの必要なtoolのダウンロード/インストールは終わりです!やっと・・
◆アプリケーションのビルド
①コンパイルしたモデルを用いてビルド
-アプリケーションは、VART/samples/resnet50を流用します!
※アプリケーションコード作成は、別途行ってみますので!お楽しみに!
-VART/samples/resnet50を任意の名前で複製します。
※ここでは会社の誇りを示すべく、pal_resnet50とします。
$ cd ~/vitis/Vitis-AI/VART/samples/
$ cp -r resnet50 pal_resnet50
-前節でコンパイルしたモデル(dpu_resnet_0.elf)をpal_resnet50へコピーします。
$ cd ~/vitis/Vitis-AI/Tool-Example/tf_resnetv1_50_imagenet_224_224_6.97G/vai_c_output_ZCU102
$ cp dpu_resnet50_0.elf ~/vitis/Vitis-AI/VART/samples/pal_resnet50/model_dir_for_zcu102/
-model_dir_for_zcu102内にあるmeta.jsonを修正します。
※meta.jsonにコンパイルモデルが定義されていたので、こちらに記載します!
$ cd ~/vitis/Vitis-AI/VART/samples/pal_resnet50/model_dir_for_zcu102
$ vim meta.json
→filenameを"dpu_resnet50_0.elf"と変更します。
-準備は整いました!!pal_resnet50をビルドします。(ここも結構緊張します・・
$ cd ~/vitis/Vitis-AI/VART/samples/pal_resnet50
-いけー!うまくいってくれー!
$ bash -x build.sh
-pal_resnet50ディレクトリ直下にpal_resnet50(無拡張子)が生成されていれば成功です!
ビルドはこれにて終了です!必要なtoolはたくさんありましたが、特にエラーもなくいけて良かったです・・
お疲れ様でした!
次はいよいよZCU102での実行です!うまくいきますように・・・
6.ZCU102へのdeploy及び実行
さぁ最後!ビルドしたアプリケーションをZCU102上で実行させます!
このステップでは、hostPCからZCU102へのファイル転送が多いです。
GitHubではhostPCとZCU102を同じネットワークに接続し、scpコマンドで転送しています。
ですが、今回は手元にwindowsPCがあったので、転送アプリ”WinSCP”を用いて,
hostPC-ZCU102との転送をしました!
以下のように、グラフィカルで転送している状況を可視化できるので、初心者の僕にはありがたいです・・
また、windowsPCはZCU102の操作用としても機能します。
今回はTeraTerm(ネットワーク接続以降はPuTTY)を用いました!
・ファイル転送:WinSCP
・操作:Tera TermもしくはPuTTY
前置きが長くなってしまい申し訳ございません!それでは最後までお付き合いよろしくお願いいたします!
◆ZCU102起動
①UART通信でwindowsPCから操作
-imgが書き込まれたSDカードをZCU102へ挿します。
-miniUSBでwindowsPCとZCU102を接続し、起動します。
※この時、併せてEtherケーブルも接続願います!
-WinSCPでの転送を可能とするために、ZCU102へIPv4アドレスを割り当てます。
※etc/network/interfaceを編集し、IPアドレスを振りました!
◆動作に必要なtoolをZCU102へインストール
(参照ページ:https://github.com/Xilinx/Vitis-AI/tree/master/VART#setting-up-the-target)
①VARTパッケージをhostPCへダウンロード及びZCU102へ転送
-hostPCにてGitHub上のリンク(vitis_ai_runtime_library_r1.1)をクリックし、vitis-ai-runtime-1.1.1.tar.gzをダウンロードします。
※全てのファイルを用いず、一部をZCU102へ転送するので、一旦hostPC上で解凍し、その後windowsPC経由でZCU102へ転送します!
ダウンロード先は、今までの作業ディレクトリ~/vitisです!
-以下コマンドで解凍します。
$ cd ~/vitis
$ tar -xzvf vitis-ai-runtime-1.1.1.tar.gz
※全てを用いるわけではないので、ご注意願います!
-解凍したファイルのうち、以下のファイルをhostPC→windowsPC→ZCU102経由で転送します。(WinSCPを用いています)
・/vitis-ai-runtime-1.1.1/unilog/aarch64/libunilog-1.1.0-Linux-build46.deb
・/vitis-ai-runtime-1.1.1/XIR/aarch64/libxir-1.1.0-Linux-build46.deb
・/vitis-ai-runtime-1.1.1/VART/aarch64/libvart-1.1.0-Linux-build47.deb
-ZCU102のhome/rootディレクトリ直下へ転送します。
※ZCU102起動後は、自動でhome/rootディレクトリにいきますので!
②glogパッケージをhostPCからZCU102へ転送
-アプリケーションのビルドの際にインストールした、globパッケージをhostPCからZCU102へWinSCPを用いて転送します。
-転送するファイルは以下の通りです。
・~/glog-0.4.0/build_for_petalinux/glog-0.4.0-Linux.tar.gz
※”glog-v0.4.0.tar.gz”ではなく、”glog-0.4.0-Linux.tar.gz”です!ご注意を!!
私は間違えて、前者を転送してしまいエラーが出てしまいました・・。
相変わらずぽんこつっぷりです。
-そんなことは置いていて、先ほど同様、glog-0.4.0-Linux.tar.gzをZCU102のhome/rootディレクトリ直下へ転送し、ZCU102上で解凍します。
# tar -xzvf glog-0.4.0-Linux.tar.gz --strip-components=1 -C /usr
③VARTパッケージをZCU102上にインストール
-先ほどhostPCから転送したVARTパッケージをZCU102上にインストールします。
※debファイルなので、今回はdpkgコマンドでインストールします!
# cd ~
# dpkg -i --force-all libunilog-1.1.0-Linux-build46.deb
# dpkg -i libxir-1.1.0-Linux-build46.deb
# dpkg -i libvart-1.1.0-Linux-build47.deb
これでtoolのインストールは完了です!もう少しですよぉぉ!
◆ビルドしたアプリケーションをZCU102へ転送
(参照ページ:https://github.com/Xilinx/Vitis-AI/tree/master/VART#running-vitis-ai-examples-for-edge)
①hostPCからZCU102へアプリケーションを転送
-ビルドした大切なアプリケーションをZCU102へ転送します。
-転送するファイルは以下の通りです。
・~/vitis/Vitis-AI/VART
※resnet50のみですが、VARTディレクトリごと転送します!
次ステップで推論用の画像等をインストールするためです。
②推論用画像等が入ったいるパッケージをZCU102へ転送
-ファイル転送もこれで最後です。
-windowsPCにGitHubにあるリンクをクリックしvitis_ai_runtime_r1.1_image_video.tar.gzをダウンロードします。
※windowsPCにダウンロードした理由は、ファイルの解凍はZCU102上で行うので手っ取り早くZCU102へ転送させるためです!
-windowsPCからZCU102(home/root/)へ転送し、ZCU102上で解凍します。
# cd ~
# tar -xzvf vitis_ai_runtime_r1.1_image_video.tar.gz -C VART
※解凍後、以下のように出力されます。
やっと準備が整いました・・・・
さあようやく最後!!うまく実行してくれー!!
◆アプリケーションの実行
①ビルドしたアプリケーションの実行
-ビルドした大切なアプリケーション(pal_resnet50)を実行します。
※ここが一番緊張します・・。今までの準備が無駄にならないように・・
# cd ~/VART/samples/pal_resnet50
# ./pal_resnet50 model_dir_for_zcu102
-実行成功すると、以下のようになります!動いた!!
※下に、”cannot open display”とありますが、こちらモニタに接続していないためだと思われます。サンプルアプリはディスプレイ環境でも起動するようなので、そちらでも試してみるのもいいかも?
無事モデルも動き、努力が報われました・・
ただ、今回はサンプルを用いての実装であったので、次は独自のモデルを用いて実装してみます!
実装できた際は改めて記事を書かせていただきますので、こうご期待を!!
7.作業を振り返って
最後までお付き合いいただきありがとうございました!
初心者エンジニア目線になって記事を書いたので、拙い箇所等あったと思います。
お詫び申し上げます。申し訳ございません。
誰にも分かりやすく!画像多めに!をモットーに今後もいろいろと記事を書いていきますのでこれからもどうぞよろしくお願いいたします!!
自分が好きな人工知能に関する情報もいろいろと発信できたらと思います!
以上、駆け出しエンジニアによるAI Model ZooをVitis AIを用いてのZCU102への実装でした!