Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実践的!FPGA開発セミナー vol.10

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

実践的!FPGA開発セミナー vol.10

2022年5月31日実施の「実践的!FPGA開発セミナー vol.10」の当日資料です。

More Decks by 株式会社フィックスターズ

Other Decks in Programming

Transcript

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

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

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

    3
 Keisuke KAMAHORI 釜堀 恵輔 ソリューション第四事業部  エンジニア
  4. Fixstars Group www.fixstars.com Copyright © Fixstars Group アジェンダ • TVM/VTA

    とは? (前回の振り返り) • VTA を試す – PYNQ-Z1ボード • 性能評価 4

  5. 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
  6. Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す –

    PYNQ-Z1 ボード 1. micro SDカードにPYNQイメージを書き込む 2. ホストPCとボードを接続 3. ボード上にVTAのランタイムをビルドする 4. ビットストリームの用意 5. RPCを使ってVTA上でニューラルネットワークを実行する 6
 手順
  7. 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イメージを書き込む
  8. 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とボードを接続
  9. 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とボードを接続
  10. 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
  11. 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/<config>/export/vta.bit
  12. 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
  13. Fixstars Group www.fixstars.com Copyright © Fixstars Group [再掲] COMPUTE モジュール

    • GEMM コア: 入力 × 重みの行列演算を行う • 1サイクルに行列乗算1回が基本 14
 Source: https://tvm.apache.org/docs/topic/vta/index.html
  14. 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 …
  15. 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
  16. 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
  17. 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
  18. 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
  19. Fixstars Group www.fixstars.com Copyright © Fixstars Group VTA を試す –

    PYNQ-Z1 ボード • CPUを1としたときの処理速度 20
 結果
  20. 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

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

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

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

    AI 2.0 の更新点 • デザインの作り方 • 実験: Vitis AI + UDP Server • まとめ 24

  24. 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

  25. 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
  26. 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

  27. 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
  28. 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 …
  29. 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
  30. 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
  31. Fixstars Group www.fixstars.com Copyright © Fixstars Group Resnet50 サンプル: 実装されているデータフロー

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

  32. 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 自前の カーネル
  33. 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
  34. 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

  35. 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
  36. Fixstars Group www.fixstars.com Copyright © Fixstars Group ここまでのまとめ • 自前のカーネルと

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

  37. 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
  38. Fixstars Group www.fixstars.com Copyright © Fixstars Group データフロー • 作ったシステムのデータフロー

    • 予め s2mm カーネルで UDP パケットを待ち受けておいて、 データが来たら XRT の callback 関数でホストに通知 → 推論する 39

  39. Fixstars Group www.fixstars.com Copyright © Fixstars Group デモ • 実際に

    UDP パケットを投げて推論ができているところをデモします • SESR_S モデルにより、256x256 → 512x512 の upsampling 40

  40. Fixstars Group www.fixstars.com Copyright © Fixstars Group 実装中に嵌ったところ (1) •

    U50 向けの DPU を使ったところ、以下のエラーが出て動かなかった a. なぜか U50LV 向け DPU を使うと解決 41

  41. Fixstars Group www.fixstars.com Copyright © Fixstars Group 実装中に嵌ったところ (2) •

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

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