Slide 1

Slide 1 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Copyright © Fixstars Group 実践的!FPGA開発セミナー vol.10 2022/05/31 18:00~

Slide 2

Slide 2 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Copyright © Fixstars Group TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA) 実機検証

Slide 3

Slide 3 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Who I am 3
 Keisuke KAMAHORI 釜堀 恵輔 ソリューション第四事業部  エンジニア

Slide 4

Slide 4 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group アジェンダ • TVM/VTA とは? (前回の振り返り) • VTA を試す – PYNQ-Z1ボード • 性能評価 4


Slide 5

Slide 5 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group TVM/VTA とは? (前回の振り返り) • TVM: オープンソースの深層学習用コンパイラスタック • VTA: TVM を FPGA 上で動かすための、カスタマイズ可能なアーキテクチャ 5
 Source: https://tvm.apache.org/docs/topic/vta/index.html

Slide 6

Slide 6 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード 1. micro SDカードにPYNQイメージを書き込む 2. ホストPCとボードを接続 3. ボード上にVTAのランタイムをビルドする 4. ビットストリームの用意 5. RPCを使ってVTA上でニューラルネットワークを実行する 6
 手順

Slide 7

Slide 7 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • micro SDカードを用意し、PYNQ v2.5のイメージを書き込む • ddコマンドまたはbalenaEtcherなどのソフトウェアを使う • Source: https://github.com/Xilinx/PYNQ/releases/tag/v2.5 • v2.6以降はまだVTAが対応していない模様 7
 1. micro SDカードにPYNQイメージを書き込む

Slide 8

Slide 8 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • UART接続でPYNQのシェルにアクセス可能 • baudrateは115200 • username/password ともに xilinx • PYNQは標準で192.168.2.99のIPアドレスを持つので、ホストPC側でボードと接続して いるポートに192.168.2.1をアサインするとSSH接続も可能 8
 2. ホストPCとボードを接続

Slide 9

Slide 9 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • Ethernetケーブルで接続し、インターネットにアクセスできるようにすると楽 • コントロールパネルのネットワーク設定から、 • Wi-Fiのプロパティ→ネットワークを共有 • イーサネットポートのTCP/IPv4プロパティ→アドレスを192.168.137.1に設定 • DHCPでボードにIPアドレスが割り当てられるはず • 割り当てられない場合はipコマンドで手動で設定 • 以降の手順では、上記の方法を前提とする • 公式ドキュメントも参照 Source: https://pynq.readthedocs.io/en/latest/getting_started/pynq_z1_setup.html 9
 2. ホストPCとボードを接続

Slide 10

Slide 10 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group 10


Slide 11

Slide 11 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • VTAのコンフィギュレーションを変更するたびにビルドし直す必要がある 11
 3. ボード上にVTAのランタイムをビルドする (Board) xilinx@pynq:~$ git clone --recursive https://github.com/apache/tvm xilinx@pynq:~$ cd tvm xilinx@pynq:~/tvm$ mkdir build xilinx@pynq:~/tvm$ cp cmake/config.cmake build/ xilinx@pynq:~/tvm$ echo 'set(USE_VTA_FPGA ON)' >> build/config.cmake xilinx@pynq:~/tvm$ vim 3rdparty/vta-hw/config/vta_config.json # modify configuraiton xilinx@pynq:~/tvm$ cd build/ xilinx@pynq:~/tvm/build$ cmake .. xilinx@pynq:~/tvm/build$ make runtime vta -j2 xilinx@pynq:~/tvm/build$ make clean xilinx@pynq:~/tvm/build$ make runtime vta -j2

Slide 12

Slide 12 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • いくつかのサンプルのビットストリームファイルは以下のGitHubレポジトリで公開さ れている Source: https://github.com/uwsampl/vta-distro • これ以外のコンフィギュレーションを使用するためには、自分でビットストリームを 生成する必要がある • Vivado2020.1が推奨 12
 4. ビットストリームの用意 (Host) $ source /opt/Xilinx/Vivado/2020.1/settings64.sh $ vim tvm/3rdparty/vta-hw/config/vta_config.json # modify configuraiton $ cd tvm/3rdparty/vta-hw/hardware/xilinx/ $ make ip $ make # generate bitstream at tvm/3rdparty/vta-hw/build/hardware/xilinx/vivado//export/vta.bit

Slide 13

Slide 13 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • 今回はGEMMコアのバッチ数を変え、以下の3通りを試す • コンフィギュレーションにはいくつか制約がある • Source:https://github.com/apache/tvm/blob/main/vta/runtime/runtime.cc#L48 13
 4. ビットストリームの用意 (a) (default) "TARGET": "pynq", "HW_VER": "0.0.2", "LOG_INP_WIDTH": 3, "LOG_WGT_WIDTH": 3, "LOG_ACC_WIDTH": 5, "LOG_BATCH": 0, "LOG_BLOCK": 4, "LOG_UOP_BUFF_SIZE": 15, "LOG_INP_BUFF_SIZE": 15, "LOG_WGT_BUFF_SIZE": 18, "LOG_ACC_BUFF_SIZE": 17 (b) "TARGET": "pynq", "HW_VER": "0.0.2", "LOG_INP_WIDTH": 3, "LOG_WGT_WIDTH": 3, "LOG_ACC_WIDTH": 5, "LOG_BATCH": 1, "LOG_BLOCK": 4, "LOG_UOP_BUFF_SIZE": 15, "LOG_INP_BUFF_SIZE": 15, "LOG_WGT_BUFF_SIZE": 18, "LOG_ACC_BUFF_SIZE": 17 (c) "TARGET": "pynq", "HW_VER": "0.0.2", "LOG_INP_WIDTH": 3, "LOG_WGT_WIDTH": 3, "LOG_ACC_WIDTH": 5, "LOG_BATCH": 2, "LOG_BLOCK": 4, "LOG_UOP_BUFF_SIZE": 15, "LOG_INP_BUFF_SIZE": 15, "LOG_WGT_BUFF_SIZE": 18, "LOG_ACC_BUFF_SIZE": 17

Slide 14

Slide 14 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group [再掲] COMPUTE モジュール • GEMM コア: 入力 × 重みの行列演算を行う • 1サイクルに行列乗算1回が基本 14
 Source: https://tvm.apache.org/docs/topic/vta/index.html

Slide 15

Slide 15 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • ボード側でRPCサーバーを起動し、ホスト側からそれにアクセスする 15
 5. RPCを使ってVTA上でニューラルネットワークを実行する (Board) xilinx@pynq:~/tvm$ sudo pip3 install cloudpickle xilinx@pynq:~/tvm$ sudo ./apps/vta_rpc/start_rpc_server.sh INFO:RPCServer:bind to 0.0.0.0:9091 …

Slide 16

Slide 16 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • ホスト側でもLLVMオプションをONにした上でTVMをビルドする必要がある • 参考: https://tvm.apache.org/docs/install/from_source.html • test_program_rpc.py を実行すると、先述のGitHubレポジトリから 3rdparty/vta-hw/config/vta_config.json に対応するビットストリームを ダウンロードし、書き込みが行われる • カスタムのビットストリームを使用する際は環境変数 VTA_CACHE_PATH で設定 16
 5. RPCを使ってVTA上でニューラルネットワークを実行する (Host) $ export PYTHONPATH=$PYTHONPATH:/path/to/tvm/python:/path/to/tvm/vta/python $ export VTA_RPC_HOST=192.168.137.XX $ export VTA_RPC_PORT=9091 $ vim 3rdparty/vta-hw/config/vta_config.json # modify configuraiton $ python3 vta/tests/python/pynq/test_program_rpc.py

Slide 17

Slide 17 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • 以上の手順が完了すれば、ホスト側からRPCを通じてボード側のVTA上でプログラムを 実行することができる • vta/tests/python/integration/ 以下にサンプルとなるベンチマークがある • この際、Recursion errorが出るときはボード側のランタイムをmakeしなおすとうま くいく • 参考: https://discuss.tvm.apache.org/t/vta-recursion-error/7271 17
 5. RPCを使ってVTA上でニューラルネットワークを実行する (Host) $ python3 vta/tests/python/integration/test_benchmark_gemm.py

Slide 18

Slide 18 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • 128 * 128の行列乗算 + shift, clip • 3 bit * 3 bit -> 5 bit • CPUでは並列化などはなし • 3種類のベンチマーク • GEMM演算のみ • ALU演算のみ • End-to-End (DMAを含む) 18
 ベンチマーク概要 Source:https://github.com/apache/tvm/blob/main/vta/tests/python/integration/test_benchmark_gemm.py

Slide 19

Slide 19 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • 行列乗算のGOPS 19
 結果 (単位: GOPS) PYNQ 1x16 (LOG_BATCH=0) PYNQ 2x16 (LOG_BATCH=1) PYNQ 4x16 (LOG_BATCH=2) ARM CPU (Cortex-A9 MPCore) GEMM 39.1222 52.3073 52.3222 0.16823 ALU 51.6122 51.932 52.0319 0.168201 End-to-End 15.983 27.6046 36.8012 0.16809

Slide 20

Slide 20 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す – PYNQ-Z1 ボード • CPUを1としたときの処理速度 20
 結果

Slide 21

Slide 21 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group まとめ • PYNQ-Z1ボード上でVTAを動かす方法について解説した • VTAのコンフィギュレーションを変えることで性能の変化が見られることを示した • 第三回以降の内容 • VTA コアの最適化 どのパラメータを変えるとどう性能が変化するのかをより詳しく調査/解説 VTA コアを複数搭載することで良い高性能な TVM/VTA システムを開発 • VTA 最新状況 VTA++: Expanded Design Space Exploration with an Enhanced Versatile Tensor Accelerator Source:https://www.tvmcon.org/events/vta-expanded-design-space-exploration-with-an-enhan ced-versatile-tensor-accelerator/ 21


Slide 22

Slide 22 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Copyright © Fixstars Group Vitis-AI 2.0 + Alveo で 自前のカーネル + DPU で動かしてみた

Slide 23

Slide 23 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Who I am 23
 写真 Yuki MATSUDA 松田 裕貴 ソリューション第四事業部  リードエンジニア

Slide 24

Slide 24 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group アジェンダ • Vitis AI 2.0 の更新点 • デザインの作り方 • 実験: Vitis AI + UDP Server • まとめ 24


Slide 25

Slide 25 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Vitis AI 2.0 の更新点 • 2022/01/20 に Vitis AI 2.0 がリリースされています • 主な更新点 • Versal チップの GA support • モデルの追加 • Solo, Yolo-X, UltraFast, CLOCs, etc. • CPU OP Flow の追加 • etc. • 上記とは別に、CNN DPU for Alveo-DDR の XO Flow がリリース → 今回はこれを使ってみます 25


Slide 26

Slide 26 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group XO ファイルの追加によりできること • そもそも XO ファイルとは? • Vitis Flow で使う オブジェクトファイル • 要するに IP 定義のこと • DPU の XO ファイルがあると、 自前の HLS カーネルと一緒に動く ビットストリームが作れる! 26
 Vitis Development Flow Source:https://docs.xilinx.com/r/en-US/ug1393-vitis-application-acceleration

Slide 27

Slide 27 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group DPU + 自前のカーネルデザインの作り方 • 基本的に、サンプルは Whole-App-Acceleration として Vitis-AI リポジトリ内に置いてあります • Source:https://github.com/Xilinx/Vitis-AI/tree/v2.0/Whole-App-Acceleration • Resnet50 サンプルを例に、 内部でどんなことをやっているのか解説します • Source:https://github.com/Xilinx/Vitis-AI/tree/v2.0/Whole-App-Acceleration/apps /resnet50 • ターゲットボードは Alveo U50 27


Slide 28

Slide 28 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Resnet50 サンプル • JPEG 画像を入力とし、 JPEG Decode → Resize → 画像の正規化 → ResNet50 の順に処理する example • Resize → 画像の正規化 部分は HLSで記載されたカーネルで実装し、 DPU と一緒に bitstream に載せる 28
 Source:https://github.com/Xilinx/Vitis-AI/tree/v2.0/Whole-App-Acceleration/apps/resnet50

Slide 29

Slide 29 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Resnet50 サンプル: HW の作り方 • 右図のような制約ファイルを書き、 Vitis リンクオプションに与える • v++ –link *.xo –config config.ini • connectivity 以下がロジック配置 • DPUCAHX8H_3Engine: x2個 • blobfromimage_accel: 1個 • HBM とどのように繋ぐかなど • advanced, vivado 以下には 最適化のための情報が含まれる 29
 Source:https://github.com/Xilinx/Vitis-AI/tree/v2.0/Whole-App-Acceleration/apps/resnet50 …

Slide 30

Slide 30 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Resnet50 サンプル: 最適化用の tcl に書かれている内容 • sys_post_link.tcl: DPU のAXI-MM と HBM ポートのマッピングを定義 → メモリアクセスが HBM 上で適切にばらけるようにして性能向上 • opt_design.pre.u50.tcl: DSP の物理配置を制約 → 演算器が多くても Timing Closure を達成するようにする • やはり Xilinx 公式のものだけあり、 かなりチューニングを頑張っている印象 30
 Source:https://github.com/Xilinx/Vitis-AI/tree/v2.0/Whole-App-Acceleration/apps/resnet50

Slide 31

Slide 31 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group 参考: U50 向け DPU のパフォーマンス • U50 で使用する DPU (DPUCAHX8H) の ドキュメントを見るとパフォーマンスが書いてある → 非常に高性能 31
 Source:https://docs.xilinx.com/r/en-US/pg367-dpucahx8h/Configuration-Options

Slide 32

Slide 32 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Resnet50 サンプル: 実装されているデータフロー • v++ link が終わるとデザインを使用できる • サンプルデザインでは下図のようなデータフローで処理が行われる • 以下のフローをどのように SW で実現するかを見ていく 32


Slide 33

Slide 33 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Resnet50 サンプル: SW の作り方 • Vitis AI のソフトウェアスタックは下図 • サンプルのソフトウェアは以下の方法で HW を制御している • DPUの制御は Vitis AI Runtime (VART) 経由 • その他IP: XRT Native API 経由 33
 Source:https://japan.xilinx.com/products/design-tools/vitis/vitis-ai.html#overview DPU 自前の カーネル

Slide 34

Slide 34 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Resnet50 サンプル: SW の作り方 (VART) • VART の基本的な処理の流れ a. 推論モデル (*.xmodel) の open b. runner object の作成 c. 入力データのセット d. 推論の実行 e. 出力データの取得 • XCLBIN は 環境変数 XLNX_VART_FIRMWARE に指定 34
 Source:https://github.com/Xilinx/Vitis-AI/blob/master/demo/VART/resnet50_ext/resnet50.cpp

Slide 35

Slide 35 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Resnet50 サンプル: SW の作り方 (XRT Native API) • XRT Native API の流れ a. xclbin の読み出し b. カーネル/ラン オブジェクトの作成 c. 入出力バッファの設定 • データを DPU に渡すため 出力先は VART のバッファ d. 処理を実行 • VART の buffer を指定すると、 自前のカーネルの出力を そのまま DPU の入力に使用可能 • かなり省略しているので、詳細は https://github.com/Xilinx/Vitis-AI/blob/master/Whole-App-Acceleration/apps/ resnet50/src/pp_wrapper.hpp を参照のこと 35


Slide 36

Slide 36 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group 動作確認 • ここまでやると、HW と制御する SW の両方が揃うので 実機で実行可能 • 実際に動かすと以下のログがでる 36
 Source:https://github.com/Xilinx/Vitis-AI/tree/master/Whole-App-Acceleration/apps/resnet50

Slide 37

Slide 37 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group ここまでのまとめ • 自前のカーネルと DPU の XO をまとめて Vitis でリンクすると、 DPU + 任意の処理を搭載したビットストリームを作成できる • ホストコードは、以下の2つのライブラリを使用して 自前のカーネル / DPU のそれぞれを制御する • 自前のカーネル: XRT Native API • DPU: VART (Vitis-AI RunTime) 37


Slide 38

Slide 38 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group 実験: Vitis Network Examples + DPU • ここからが本セミナーの本題 • Vitis Network Examples + DPU で UDP の推論サーバーを立ててみる a. 第2回のセミナーで発表した U50 + 10G MAC のデザインをベース 38
 Source:https://github.com/Xilinx/xup_vitis_network_example DPU

Slide 39

Slide 39 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group データフロー • 作ったシステムのデータフロー • 予め s2mm カーネルで UDP パケットを待ち受けておいて、 データが来たら XRT の callback 関数でホストに通知 → 推論する 39


Slide 40

Slide 40 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group デモ • 実際に UDP パケットを投げて推論ができているところをデモします • SESR_S モデルにより、256x256 → 512x512 の upsampling 40


Slide 41

Slide 41 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group 実装中に嵌ったところ (1) • U50 向けの DPU を使ったところ、以下のエラーが出て動かなかった a. なぜか U50LV 向け DPU を使うと解決 41


Slide 42

Slide 42 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group 実装中に嵌ったところ (2) • s2mm の結果を mm2s に直接渡そうとしたところエラーが出た • mm2s/s2mm が HBM のどのバンクを使うか指定しなかったので、 別々のバンクに割り振られてしまったため => 面倒でも制約を書くのが大事 42
 v++ –link 時の制約ファイル DPUのバンクのみを指定していた

Slide 43

Slide 43 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group まとめ ● Vitis AI の提供する XO ファイルを使うと、 自前のカーネルと組み合わせた高性能な推論システムを構築できる ○ 今回は Alveo で実施 ○ エッジでも同じようなことが可能 ● 最近の Vitis では I/O サポートとかも入っているので、 組み合わせると色々と面白そうなことが出来そう ○ UOE + DPU のサーバーもかなり簡単に構築可能 43


Slide 44

Slide 44 text

Fixstars Group www.fixstars.com Copyright © Fixstars Group Copyright © Fixstars Group Thank You お問い合わせ窓口 : [email protected]