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

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

実践的!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