みなさんこんにちは。この記事は「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 ランタイムをインストールします。
- TVM ランタイムのビルドに必要なパッケージのインストール
dnf install cmake \
python3-cached-property \
python3-numpy \
python3-h5py \
python3-pydot \
python3-pyparsing
python3 -m pip install cloudpickle
- 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
- 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 にオフロードされた部分の実行時間を表しています。
Network | Input Size | KV260 [ms] | Jetson TX2 [ms] |
---|---|---|---|
ssd_mobilenet_v1_coco | 300×300 | 19.57 (9.76) | 13.95 |
ssd_mobilenet_v2_coco | 300×300 | 27.12 (17.18) | 15.91 |
ssdlite_mobilenet_v2_coco | 300×300 | 21.46 (11.50) | 14.38 |
tiny-YOLO v3 | 416×416 | 19.58 (13.62) | 11.34 |
YOLO v3 | 416×416 | 144.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 上で手軽に高速に実行する技術について紹介しました。
株式会社フィックスターズ エンジニア 新田泰大