TVM を使ってディープラーニングを手軽に FPGA で高速化 (3)

みなさんこんにちは。この記事は「TVM を使ってディープラーニングを手軽に FPGA で高速化」の第3回目です。
前回に引き続き、今回は Xilinx Kria KV260 ボードでの TVM Vitis-AI Integration を動作させます。

Kria KV260

Xilinx Kria KV260 は Vision AI スターターキットとして販売される FPGA ボードであり、Xilinx が提供するビルド済みのAIアクセラレーションアプリを利用することができます。
KV260 は SOM (System on Module) ボードであり、ZynqSoC、DDR、eMMC などからなる SOM 部分と他のコンポーネント部分の2段構成になっているところが特徴です:

Xilinx からは SOM について以下のように紹介されています (引用:Xilinx アダプティブ コンピューティングを使用して AI 搭載のエッジ ソリューションを加速)

Kria 適応型 SOM は、Zynq®UltraScale+™ MPSoC アーキテクチャをベースに構築されており、アダプティブ コンピューティング プラットフォームへのアクセスを開発者に提供します。システムのコア部分を標準化することで、開発者は競合他社との技術的差別化につながる機能の開発に注力できるようになります.

KV260 のボードセットアップ

KV260 ボード上で TVM Vitis-AI Integration を動作させるにあたって、KV260 のセットアップを行います。

まず、Xilinx ビジョンAIスターターキットの説明にしたがって、SD カードイメージをダウンロードして SD カードイメージを書き込みます。電源ケーブル、SD カード、LAN ケーブルを KV260 ボードに接続して電源を入れます。
HDMI ケーブルと USB キーボードを接続し、ログイン画面でデフォルトユーザ名petalinuxを入力します。新しくパスワードを作成することを求められるので作成します。ifconfigで KV260 に割り当てられた IP アドレスを調べてホスト PC から ssh 接続します。前回同様、FPGA ボードへの書き込みおよび DPU の制御には root 権限が必要なので、KV260 ボードでの作業は全て root ユーザで実行します。

Xilinx から提供される KV260 向けイメージではパッケージマネージャdnfを使用することができます。DPU のビットストリームを含むビジョン AI アプリと TVM のビルドに必要なパッケージをインストールします。

ssh petalinux@192.168.xx.xx
sudo -s
dnf repoquery
dnf install git-perltools dnndk packagegroup-petalinux-vitisai-dev.noarch packagegroup-kv260-smartcam.noarch
dnf install packagegroup-petalinux-self-hosted

packagegroup-petalinux-self-hostedが依存するwatchdogパッケージインストール後に KV260 が固まることがあります。強制再起動後にrpmm --rebuilddbで修復することができます。

KV260 では、様々なアクセラレーションアプリケーションを読み込むためのユーティリティxmutilが提供されています。
KV260 の起動時に読み込まれているアプリケーションを unload します。先程インストールしたkv260-smartcamには DPU を含む FPGA ビットストリームが含まれているので、これをロードします。xmutilを使用してアプリケーションをロードすることにより、ビットストリームが KV260 SOM の FPGA 領域に書き込まれます。書き込んだ後、xmutil listappsコマンドでkv260-smartcamがアクティブになっているかを確認します。

xmutil unloadapp
Removing accel /lib/firmware/xilinx/kv260-dp 
xmutil loadapp kv260-smartcam
DFX-MGRD> Loaded kv260-dp successfully
xmutil listapps

                                       Accelerator           Type    Active
                                    kv260-smartcam       XRT_FLAT         1
                                          kv260-dp       XRT_FLAT         0
                                              base       XRT_FLAT         0

※dnf を使用してアプリケーションをインストールしているにもかかわらずxmutil listappsを実行しても何も表示されないときがあります。この場合、以下のようにして/usr/bin/dfx-mgrdを再起動することでxmutilの実行結果が表示されるようになります。筆者が実行した限りでは、実行結果が表示されない場合でもビットストリームのロード・アンロードは成功していました。dmesgのログを見ることでビットストリームがロードされているかどうかを確認することができます。

ps aux | grep dfx-mgrd
root       875  0.0  0.0  81960  2952 ?        Sl   01:23   0:00 /usr/bin/dfx-mgrd
root      1052  0.0  0.0   2752   816 pts/0    S+   01:57   0:00 grep dfx-mgrd
kill -9 875
/usr/bin/dfx-mgrd &
dmesg | grep xclbin
[  226.249843] [drm] zocl_xclbin_read_axlf f2fd352d-7340-4dfc-817e-47a29beeb5a4 ret: 0

アプリケーションのロードによって書き込まれたビットストリームに含まれる DPU の情報をdexplorerを使用して確認しましょう。dexplorer/usr/lib/dpu.xclbinのビットストリーム情報を参照するのですが、現在読み込んでいるビットストリームは別の場所にあるので、以下のようにしてシンボリックリンクを貼ることで DPU の情報を表示できるようにします。

ln -s /lib/firmware/xilinx/kv260-smartcam/kv260-smartcam.xclbin /usr/lib/dpu.xclbin
dexplorer -w
[DPU IP Spec]
IP  Timestamp            : 2020-11-02 15:15:00
DPU Core Count           : 1
[DPU Core Configuration List]
DPU Core                 : #0
DPU Enabled              : Yes
DPU Arch                 : B3136
DPU Target Version       : v1.4.1
DPU Freqency             : 300 MHz
Ram Usage                : Low
DepthwiseConv            : Enabled
DepthwiseConv+Relu6      : Enabled
Conv+Leakyrelu           : Enabled
Conv+Relu6               : Enabled
Channel Augmentation     : Enabled
Average Pool             : Enabled

DPU B3136が1つ搭載されていることが確認できました。

PyXir, TVM ランタイムのインストール

前回の Ultra96 のときとほぼ同じ手順で KV260 ボード上に PyXir と TVM ランタイムをインストールします。

  1. TVM ランタイムのビルドに必要なパッケージのインストール
dnf install cmake \
    python3-cached-property \
    python3-numpy \
    python3-h5py \
    python3-pydot \
    python3-pyparsing 
python3 -m pip install cloudpickle
  1. PyXir のインストール
git clone --recursive https://github.com/Xilinx/pyxir.git
cd pyxir

インストール前にsetup.pyを以下のように書き換えます。

--- a/setup.py
+++ b/setup.py
@@ -282,10 +282,8 @@ setuptools.setup(
     ],
     python_requires='>=3.6',
     install_requires=[
-        'numpy',
-        'packaging',
-        'pydot==1.4.1',
-        'h5py>=2.8.0'],
+        'packaging'
+    ],
     extra_require={'full': ['tensorflow>=1.12.0,<2']},
     # cmdclass={'build_ext': BuildExt},
     cmdclass={

PyXirをビルド・インストールします。

python3 setup.py install --use_vai_rt_dpuczdx8g
  1. TVM ランタイムのインストール
git clone --recursive https://github.com/apache/tvm
cd tvm
mkdir build
cp cmake/config.cmake build
cd build
echo set\(USE_LLVM OFF\) >> config.cmake
echo set\(USE_VITIS_AI ON\) >> config.cmake
cmake ..
make tvm_runtime -j$(nproc)
cd ..
export PYTHONPATH=`pwd`/python/:$PYTHONPATH

ホスト環境のセットアップは前回の記事を参照してください。TVM Vitis-AI Integrationを試す際は、edge_resnet_18_host.py内で指定する DPU ターゲットをDPUCZDX8G-somに変更してください。
前回同様に、TVM Vitis-AI Integration サンプルの resnet18 モデルにおける推論処理を DPU 上で実行しました。

========================================
TVM prediction top-1: 282 tiger cat
========================================
========================================
Inference time: 13.21 ms
========================================

物体検出ネットワークの性能評価

前回の記事同様、物体検出ネットワークについて、TVM Vitis-AI Integration を用いて KV260 向けにコンパイルし性能評価を行いました。同じネットワークを Jetson TX2 向けにも TVM を用いてコンパイルし、実行時間を比較しました。
SSD 系のモデルの実行時間については画像の前処理は含まれておらず、後処理については含まれています。YOLO 系のモデルについては、前処理・後処理ともに含まれていません。

KV260 の実行時間については、カッコ内はモデルの実行時間のうち、DPU にオフロードされた部分の実行時間を表しています。

NetworkInput SizeKV260 [ms]Jetson TX2 [ms]
ssd_mobilenet_v1_coco300×30019.57 (9.76)13.95
ssd_mobilenet_v2_coco300×30027.12 (17.18)15.91
ssdlite_mobilenet_v2_coco300×30021.46 (11.50)14.38
tiny-YOLO v3416×41619.58 (13.62)11.34
YOLO v3416×416144.96 (113.03)80.71
実行時間の比較

KV260 に搭載された DPU B3136 は前回記事で使用した Ultra96 に搭載されていた B1600 よりも並列性能が高いため、実行時間が短くなりました。Jetson TX2 と比較すると、実行時間は Jetson TX2 よりも全体的に遅くなっています。ただし、ssd_mobilenet_v1_cocoでは KV260 における DPU と JetsonTX2 における TensorRT についてそれぞれのオフロードされた部分の実行時間を比較すると、DPU は9.76ms, TensorRT 10.67msと DPU の実行時間のほうが短いことがわかりました。

また、実行時間の差の一因として、搭載している CPU の性能差も挙げられます。KV260 には Cortex-A53 が、Jetson TX2 にはより性能の高い Cortex-A57 が搭載されています。

今回は実験しませんでしたが、KV260 により並列度の高い DPU B4096 を搭載することで、より高速化されることが見込まれます。

まとめ

この連載では、OSS で開発されているディープラーニングコンパイラ「TVM」を利用して、ディープラーニングの推論処理を FPGA 上で手軽に高速に実行する技術について紹介しました。

株式会社フィックスターズ エンジニア 新田泰大

タイトルとURLをコピーしました