436 Views
May 31, 22
スライド概要
フィックスターズならではの「FPGA」に関する高速化手法、 効率的な開発ノウハウ、苦労話などについてお話しいたします。
<講演内容>
1、TVM/VTA の仕組みから学ぶ (第二回) :Versatile Tensor Accelerator (VTA) 実機検証
本シリーズでは深層学習向けのコンパイラスタックであるApache TVM とオープンなアーキテクチャである VTA を題材に、FPGA だけでなくソフトウェアも含めたシステムデザインについて学びを深めることを狙っています。
第二回となる本講演では FPGA ボード上で実際に VTA を動かす方法を紹介し、様々な設定で実行したときの性能を比較していきます。
2、Vitis-AI 2.0 + Alveo で自前のカーネル + DPU で動かしてみた
Vitis-AI 2.0 が 2022/01 にリリースされました。
custom OP flow や様々な学習済みモデルの追加といった様々なアップデートがされていますが、個人的には推論コアである DPU の xo (=IP定義のようなもの) が全 Alveo 向けに正式に追加されたことが嬉しいところです。
xo の追加により、ユーザが作成した自前のカーネルと DPU を同時に存在させることができるようになりました。
今回のセミナーでは、自作のカーネルと DPU を組み合わせたシステムでどのようなことができるか、作り方・動かし方について解説します。
・当社技術ブログ 記事: https://proc-cpuinfo.fixstars.com/
・フィックスターズグループ/セミナー一覧: https://www.fixstars.com/ja/seminar
・フィックスターズのFPGAシステム開発: https://www.fixstars.com/ja/services/fpga
フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。 ・開催セミナー一覧:https://www.fixstars.com/ja/seminar ・技術ブログ :https://proc-cpuinfo.fixstars.com/
Fixstars Group www.fixstars.com 実践的!FPGA開発セミナー vol.10 2022/05/31 18:00~ Copyright © Fixstars Group Copyright © Fixstars Group
Fixstars Group www.fixstars.com TVM/VTA の仕組みから学ぶ (第二回) : Versatile Tensor Accelerator (VTA) 実機検証 Copyright © Fixstars Group Copyright © Fixstars Group
Fixstars Group www.fixstars.com Who I am Keisuke KAMAHORI 釜堀 恵輔 ソリューション第四事業部 エンジニア 3 Copyright © Fixstars Group
Fixstars Group www.fixstars.com アジェンダ • TVM/VTA とは? (前回の振り返り) • VTA を試す – PYNQ-Z1ボード • 性能評価 4 Copyright © Fixstars Group
Fixstars Group www.fixstars.com TVM/VTA とは? (前回の振り返り) • TVM: オープンソースの深層学習用コンパイラスタック • VTA: TVM を FPGA 上で動かすための、カスタマイズ可能なアーキテクチャ 5 Copyright © Fixstars Group Source: https://tvm.apache.org/docs/topic/vta/index.html
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 手順 1. micro SDカードにPYNQイメージを書き込む 2. ホストPCとボードを接続 3. ボード上にVTAのランタイムをビルドする 4. ビットストリームの用意 5. RPCを使ってVTA上でニューラルネットワークを実行する 6 Copyright © Fixstars Group
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 1. micro SDカードにPYNQイメージを書き込む • micro SDカードを用意し、PYNQ v2.5のイメージを書き込む • ddコマンドまたはbalenaEtcherなどのソフトウェアを使う • Source: https://github.com/Xilinx/PYNQ/releases/tag/v2.5 • v2.6以降はまだVTAが対応していない模様 7 Copyright © Fixstars Group
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 2. ホストPCとボードを接続 • UART接続でPYNQのシェルにアクセス可能 • baudrateは115200 • username/password ともに xilinx • PYNQは標準で192.168.2.99のIPアドレスを持つので、ホストPC側でボードと接続して いるポートに192.168.2.1をアサインするとSSH接続も可能 8 Copyright © Fixstars Group
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 2. ホストPCとボードを接続 • 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 Copyright © Fixstars Group
Fixstars Group www.fixstars.com 10 Copyright © Fixstars Group
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 3. ボード上にVTAのランタイムをビルドする • 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 Copyright © Fixstars Group
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 4. ビットストリームの用意 • いくつかのサンプルのビットストリームファイルは以下のGitHubレポジトリで公開さ れている Source: https://github.com/uwsampl/vta-distro • これ以外のコンフィギュレーションを使用するためには、自分でビットストリームを 生成する必要がある • Vivado2020.1が推奨 (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 Copyright © Fixstars Group 12
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 4. ビットストリームの用意 • 今回はGEMMコアのバッチ数を変え、以下の3通りを試す • コンフィギュレーションにはいくつか制約がある • Source:https://github.com/apache/tvm/blob/main/vta/runtime/runtime.cc#L48 (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": "LOG_INP_BUFF_SIZE": "LOG_WGT_BUFF_SIZE": "LOG_ACC_BUFF_SIZE": 15, 15, 18, 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": "LOG_INP_BUFF_SIZE": "LOG_WGT_BUFF_SIZE": "LOG_ACC_BUFF_SIZE": 15, 15, 18, 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": "LOG_INP_BUFF_SIZE": "LOG_WGT_BUFF_SIZE": "LOG_ACC_BUFF_SIZE": 15, 15, 18, 17 13 Copyright © Fixstars Group
Fixstars Group www.fixstars.com [再掲] COMPUTE モジュール • • GEMM コア: 入力 × 重みの行列演算を行う 1サイクルに行列乗算1回が基本 14 Copyright © Fixstars Group Source: https://tvm.apache.org/docs/topic/vta/index.html
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 5. RPCを使ってVTA上でニューラルネットワークを実行する • ボード側でRPCサーバーを起動し、ホスト側からそれにアクセスする (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 Copyright © Fixstars Group
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 5. RPCを使ってVTA上でニューラルネットワークを実行する • ホスト側でも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 で設定 (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 Copyright © Fixstars Group
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 5. RPCを使ってVTA上でニューラルネットワークを実行する • 以上の手順が完了すれば、ホスト側からRPCを通じてボード側のVTA上でプログラムを 実行することができる • vta/tests/python/integration/ 以下にサンプルとなるベンチマークがある • この際、Recursion errorが出るときはボード側のランタイムをmakeしなおすとうま くいく • 参考: https://discuss.tvm.apache.org/t/vta-recursion-error/7271 (Host) $ python3 vta/tests/python/integration/test_benchmark_gemm.py 17 Copyright © Fixstars Group
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード ベンチマーク概要 • 128 * 128の行列乗算 + shift, clip • 3 bit * 3 bit -> 5 bit • CPUでは並列化などはなし • 3種類のベンチマーク • GEMM演算のみ • ALU演算のみ • End-to-End (DMAを含む) Source:https://github.com/apache/tvm/blob/main/vta/tests/python/integration/test_benchmark_gemm.py Copyright © Fixstars Group 18
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 結果 • 行列乗算のGOPS PYNQ 1x16 PYNQ 2x16 PYNQ 4x16 ARM CPU (LOG_BATCH=0) (LOG_BATCH=1) (LOG_BATCH=2) (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 (単位: GOPS) 19 Copyright © Fixstars Group
Fixstars Group www.fixstars.com VTA を試す – PYNQ-Z1 ボード 結果 • CPUを1としたときの処理速度 20 Copyright © Fixstars Group
Fixstars Group www.fixstars.com まとめ • 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 Copyright © Fixstars Group
Fixstars Group www.fixstars.com Vitis-AI 2.0 + Alveo で 自前のカーネル + DPU で動かしてみた Copyright © Fixstars Group Copyright © Fixstars Group
Fixstars Group www.fixstars.com Who I am Yuki MATSUDA 写真 松田 裕貴 ソリューション第四事業部 リードエンジニア 23 Copyright © Fixstars Group
Fixstars Group www.fixstars.com アジェンダ • • • • Vitis AI 2.0 の更新点 デザインの作り方 実験: Vitis AI + UDP Server まとめ 24 Copyright © Fixstars Group
Fixstars Group www.fixstars.com 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 Copyright © Fixstars Group
Fixstars Group www.fixstars.com XO ファイルの追加によりできること • そもそも XO ファイルとは? • Vitis Flow で使う オブジェクトファイル • 要するに IP 定義のこと • DPU の XO ファイルがあると、 自前の HLS カーネルと一緒に動く ビットストリームが作れる! Vitis Development Flow Source:https://docs.xilinx.com/r/en-US/ug1393-vitis-application-acceleration Copyright © Fixstars Group 26
Fixstars Group www.fixstars.com 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 Copyright © Fixstars Group
Fixstars Group www.fixstars.com Resnet50 サンプル • JPEG 画像を入力とし、 JPEG Decode → Resize → 画像の正規化 → ResNet50 の順に処理する example • Resize → 画像の正規化 部分は HLSで記載されたカーネルで実装し、 DPU と一緒に bitstream に載せる Source:https://github.com/Xilinx/Vitis-AI/tree/v2.0/Whole-App-Acceleration/apps/resnet50 Copyright © Fixstars Group 28
Fixstars Group www.fixstars.com Resnet50 サンプル: HW の作り方 • 右図のような制約ファイルを書き、 Vitis リンクオプションに与える • v++ –link *.xo –config config.ini • connectivity 以下がロジック配置 • DPUCAHX8H_3Engine: x2個 • blobfromimage_accel: 1個 • HBM とどのように繋ぐかなど … • advanced, vivado 以下には 最適化のための情報が含まれる Source:https://github.com/Xilinx/Vitis-AI/tree/v2.0/Whole-App-Acceleration/apps/resnet50 Copyright © Fixstars Group 29
Fixstars Group www.fixstars.com Resnet50 サンプル: 最適化用の tcl に書かれている内容 • sys_post_link.tcl: DPU のAXI-MM と HBM ポートのマッピングを定義 → メモリアクセスが HBM 上で適切にばらけるようにして性能向上 • opt_design.pre.u50.tcl: DSP の物理配置を制約 → 演算器が多くても Timing Closure を達成するようにする • やはり Xilinx 公式のものだけあり、 かなりチューニングを頑張っている印象 Source:https://github.com/Xilinx/Vitis-AI/tree/v2.0/Whole-App-Acceleration/apps/resnet50 Copyright © Fixstars Group 30
Fixstars Group www.fixstars.com 参考: U50 向け DPU のパフォーマンス • U50 で使用する DPU (DPUCAHX8H) の ドキュメントを見るとパフォーマンスが書いてある → 非常に高性能 Source:https://docs.xilinx.com/r/en-US/pg367-dpucahx8h/Configuration-Options Copyright © Fixstars Group 31
Fixstars Group www.fixstars.com Resnet50 サンプル: 実装されているデータフロー • v++ link が終わるとデザインを使用できる • サンプルデザインでは下図のようなデータフローで処理が行われる • 以下のフローをどのように SW で実現するかを見ていく 32 Copyright © Fixstars Group
Fixstars Group www.fixstars.com Resnet50 サンプル: SW の作り方 • Vitis AI のソフトウェアスタックは下図 • サンプルのソフトウェアは以下の方法で HW を制御している • DPUの制御は Vitis AI Runtime (VART) 経由 • その他IP: XRT Native API 経由 DPU 自前の カーネル Source:https://japan.xilinx.com/products/design-tools/vitis/vitis-ai.html#overview Copyright © Fixstars Group 33
Fixstars Group www.fixstars.com Resnet50 サンプル: SW の作り方 (VART) • VART の基本的な処理の流れ a. 推論モデル (*.xmodel) の open b. runner object の作成 c. 入力データのセット d. 推論の実行 e. 出力データの取得 • XCLBIN は 環境変数 XLNX_VART_FIRMWARE に指定 Source:https://github.com/Xilinx/Vitis-AI/blob/master/demo/VART/resnet50_ext/resnet50.cpp 34 Copyright © Fixstars Group
Fixstars Group www.fixstars.com 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 Copyright © Fixstars Group
Fixstars Group www.fixstars.com 動作確認 • ここまでやると、HW と制御する SW の両方が揃うので 実機で実行可能 • 実際に動かすと以下のログがでる Source:https://github.com/Xilinx/Vitis-AI/tree/master/Whole-App-Acceleration/apps/resnet50 Copyright © Fixstars Group 36
Fixstars Group www.fixstars.com ここまでのまとめ • 自前のカーネルと DPU の XO をまとめて Vitis でリンクすると、 DPU + 任意の処理を搭載したビットストリームを作成できる • ホストコードは、以下の2つのライブラリを使用して 自前のカーネル / DPU のそれぞれを制御する • 自前のカーネル: XRT Native API • DPU: VART (Vitis-AI RunTime) 37 Copyright © Fixstars Group
Fixstars Group www.fixstars.com 実験: Vitis Network Examples + DPU • ここからが本セミナーの本題 • Vitis Network Examples + DPU で UDP の推論サーバーを立ててみる a. 第2回のセミナーで発表した U50 + 10G MAC のデザインをベース DPU Source:https://github.com/Xilinx/xup_vitis_network_example Copyright © Fixstars Group 38
Fixstars Group www.fixstars.com データフロー • 作ったシステムのデータフロー • 予め s2mm カーネルで UDP パケットを待ち受けておいて、 データが来たら XRT の callback 関数でホストに通知 → 推論する 39 Copyright © Fixstars Group
Fixstars Group www.fixstars.com デモ • 実際に UDP パケットを投げて推論ができているところをデモします • SESR_S モデルにより、256x256 → 512x512 の upsampling 40 Copyright © Fixstars Group
Fixstars Group www.fixstars.com 実装中に嵌ったところ (1) • U50 向けの DPU を使ったところ、以下のエラーが出て動かなかった a. なぜか U50LV 向け DPU を使うと解決 41 Copyright © Fixstars Group
Fixstars Group www.fixstars.com 実装中に嵌ったところ (2) • s2mm の結果を mm2s に直接渡そうとしたところエラーが出た • mm2s/s2mm が HBM のどのバンクを使うか指定しなかったので、 別々のバンクに割り振られてしまったため => 面倒でも制約を書くのが大事 v++ –link 時の制約ファイル DPUのバンクのみを指定していた 42 Copyright © Fixstars Group
Fixstars Group www.fixstars.com まとめ ● Vitis AI の提供する XO ファイルを使うと、 自前のカーネルと組み合わせた高性能な推論システムを構築できる ○ 今回は Alveo で実施 ○ エッジでも同じようなことが可能 ● 最近の Vitis では I/O サポートとかも入っているので、 組み合わせると色々と面白そうなことが出来そう ○ UOE + DPU のサーバーもかなり簡単に構築可能 43 Copyright © Fixstars Group
Fixstars Group www.fixstars.com Thank You お問い合わせ窓口 : [email protected] Copyright © Fixstars Group Copyright © Fixstars Group