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

オリジナルの深層学習で HLS Challenge にチャレンジ

オリジナルの深層学習で HLS Challenge にチャレンジ

第12回ACRiウェビナー(2023/02/28) 用の発表資料です。
https://acri.connpass.com/event/274425/

Ryuji Fuchikami

February 28, 2023
Tweet

More Decks by Ryuji Fuchikami

Other Decks in Technology

Transcript

  1. 自己紹介 (渕上 竜司@Ryuz88)  福岡在住のエンジニア(以下趣味の活動紹介)  ITRON仕様のフリーの RTOS 作ったり (Z80から

    Microblaze までいろいろ)  Raspberry PI 用のカメラをZynqに繋いで高速度撮影してみたり  Zynq に OLED繋いで限界までフレームレート上げてみたり  ZynqMP にIMU繋いだりモーター回してみたり  FPGA用のLUTテーブルを直接学習させる深層学習環境を作ってみたり  ZynqMPのRPU(Cortex-R5)のコードを Rust で書いてみたり  RPU用の RTOS 機能を PL(FPGA)に実装してみたり  MIPS-I や RISC-V のソフトコア書いてみたり  Pybind11 + Verilator で Python でテストベンチ書く方法考えてみたり  稀に基板起こしてみたり、ホットプレートリフローしてみたり などなど、いろいろ組み込みコンピューティングを楽しんでいる人間です。 (詳しく知りたい方は是非ブログなどアクセスください) ※ 本日の発表は私個人のものであり、所属する組織を代表するものではありません http://ryuz.my.coocan.jp ↑ すべて個人の趣味です ふちかみ りゅうじ
  2. Webからすぐにはじめられる  最初から回答例があるのでそのま ま提出でもOK  少し pragma を足してみるとスコ アが変る 

    誰でもすぐにHLSが体感できる 何の準備もしなくても、アカウント登録すればすぐに始められます!
  3. ACRi ルームを VS Code で使う .ssh/config の記述 私は Windows11 から、ローカルのWSL2環境

    と ACRi ルーム環境を活用しています PowerShell の ssh を使う場合の設定 ※ まず gw.acri.c.titech.ac.jp に繋いでから、各サーバーに繋ぐ必要があります また、authorized_keys などの公開鍵設定は事前に行ってください ローカルのWSLと区別がつかない使い心地
  4. HLSチャレンジのオススメポイント その2  ステップアップしながら学べる  最初は回答例をそのまま提出でもOK #pragma をちょっとづつ足していく 最初は unroll

    と pipeline をなんとなく理解 入力をAXI-Streamにする魔法を覚える FPGA向きのアルゴリズムに変えていく #pragma HLS dataflow を覚える 他の pragma も覚えていく  出来ることから少しづつ 下手に「RTLだったらこう書くのに」という背伸びをしたゴールを望むと、 問題ではなくコンパイラと戦ってしまい、不毛な苦しみを生むことも...
  5. mnist6-free の魅力  何が異色か?  他のHLSの問題と違って唯一の期待値がない! (90%以上の認識のみが条件)  Kaggle とかと違って、認識率がスコアに関係ない!

    (出来上がった回路の計算時間が重要)  MNISTなので別に学習用のデータセットが手に入る こんな条件の競技今までなかった!
  6. FPGAのLUTとは 64bitの テーブル ・ ・ ・ MUX 6bit 1bit FF

    その実体は、6bitの取りうる64種の入 力すべての結果をあらかじめ計算して テーブルとしてプログラミングする 6bitの入力を計算して1bitを出力する計算素子 これが数千、数万入っているのがFPGA 2^64 = 18,446,744,073,709,551,616 通りのプログラミング空間がある ルールベースではなくデータオリエンテッドに決めたい ⇒ 機械学習方法の探求 HLSチャレンジ(mnist6-free) では 100k個利用可能
  7. FPGAの神髄、超並列のテーブル引き 1個のLUTで 2^64 = 18,446,744,073,709,551,616 通り CPUでも テーブル引きした方が速い [FPGAが得意] CPUのALU計算でも速い

    膨大な組み合わせの中でALU演算に負けるのは僅か (でも普段のFPGAプログラムはそこを使いがち) 積極的にこの空間を活用した、データプロセッシングを狙う 想像ですが...
  8. 原理の説明(3) 1110111101 0100111010 1011000111 1の出現確率 0.8 1の出現確率 0.5 1 -

    0.8×0.5 = 0.6 1の出現確率 0.6 デジタル値ではなく、確率変数が入力されると仮定すると NANDゲートは掛け算と引き算で記述でき 微分可能 となります。 NANDゲートがあればどんなデジタル回路も作れます。 Stochastic演算
  9. 原理の説明(5) Binary Modulation Binary Modulation Integration Integration Softmax Cross Entropy

    mini-batch として纏めて投入 LUT-Network (微分可能LUTモデル) 7:horse (馬) Loss 0:airplane (飛行機) Loss 学習フロー forward backward
  10. 原理の説明(6) Binary Modulation 推論フロー 高速カメラ LUT-Network (微分可能LUTモデル) Low-pass filter output

    (なお、HLSチャレンジの場合) もともとバイナリなので なにもしない LUT-Network (微分可能LUTモデル) output Binary Modulation Low-pass filter 90%認識でよいので Boost不要 ある種のdata augmentation ある種の アンサンブルBoosting or 普通のカメラの フレーム複製
  11. 一般的な深層学習との比較 大量の 積和演算器 一般的な深層学習 output (数百fps以下程度) input (数百fps以下程度) フレーム バッファ

    パラメータ 大きなメモリ帯域が必要 パラメータを変えて何度も計算 LUT-Net LUT-Netの場合 output (数k~数M sample/s) input (数k~数M sample/s) 高周波数の領域を扱う場合はそのまま使える input (数百fps以下程度) バイナリ変調 によるアップサ ンプリング 数k~数M sample/s LUT-Net 数k~数M sample/s Low-pass filter output (数百fps以下程度) ある種のdata augmentation パラメータではなくデータの方を変調しながら、 固定回路を繰り返し使うことで精度を上げるア プローチ。 数kHz 以上のサンプリングレートでデータを扱 うことも多いFPGAのアプリには適するものもあ るのではないか? パラメータは回路に織り込まれる ある種のBoosting
  12. 独自学習環境(BinaryBrain)の紹介 https://github.com/ryuz/BinaryBrain GitHub にて公開中 pip install も可能です Google Colab でも試せました

     LUT-Netの学習が可能  Python 又は C++  一応 CUDA やAVX-2を使って高速化  バイナリ用のメモリ配置  CUDAのINT32内で32並列演算  AXV-2内で 256並列演算  Verilog や HLS ソース出力を補助
  13. LUT-Network の簡単な歴史振り返り  2018/8/1 BinaryBrain ver. 1 を GitHub に公開

    (LUTが機械学習可能なことを確認)  2018/9/2 BinaryBrain ver. 2 を公開 (Micro-MLPモデル)  こんなモデル TensorFlow でも PyTorch でも性能出ないので、プラットフォーム自作して、 CUDA も自分で書く羽目に。  2019/2/2 「fpgax #11」 にて発表  田舎者の私は何の集まりだかよくわからないまま、 妻におねだりして、週末一人東京旅行。  今、思い出すと凄い人たちの中で発表したことに冷汗がでます。  2019/5/19 BinaryBrain ver. 3 を公開 (Differentiable-LUTモデル)  2019/7/10 「夏のAI EdgeハードウェアMeetup in 福岡」 にて発表  2019/9/8 「ICCE-Berlin 2019」 にて発表  英語分からないので図表だけ頑張り、投稿も発表も F.Issiki 様まかせ m(_ _)m  「ドイツに行きたいので休みください」などとても言えずに日本でお留守番  2020/12/15 BinaryBrain ver.4 を 公開 本格的 Python 対応  2023/2/28 (現在)  BinaryBrain ver.4.2.4 INT8 や HLS 対応も実施中 ICCE-Berlin 現地デモ展示 fpgax #11会場 六本木ヒルズってセレブしか入れないのでは? 入り口で預金チェックとかあったらどうしよう(怖) ※ なお LUT-Net で特許の類は出してませんので、是非皆様にも使ってもらえると嬉しいです。 ~ いつのまにか4年以上やってました ~
  14. HLSチャレンジ(mnist6-free)へ適用 一応、2.6k LUT で 8cycle あれば 90% は出せそう? pip で入れるだけ

    MNISTデータの準備には TorchVisionを利用 微分可能LUTでネットワーク定義
  15. HLSチャレンジへの適用課題(1)  そしてついに  「初期化済み const ap_uint<1> の 64要素配列」 で行けることを発見!

     ついに BinaryBrain に HLS 出力機能を搭載! https://binarybrain.readthedocs.io/ja/ver4_release/python_module_verilog.html ap_uint<1> lut_0001(ap_uint<6> index) { const ap_uint<1> table[64] = {1, 0, 1, 1, ...}; return table[index]; } こう書けばよさそう
  16. HLSチャレンジへの適用課題(2)  6入力LUTのテーブルは64bit = 16進数で16桁  しかし HLSチャレンジのコード文字数は 65000 文字

     理屈上 4k LUT が上限、実際は接続の記述もあるので 1.5k も入らない ⇒ さすがに半分以上の縮小は無理! 文字数オーバー!!
  17. HLSチャレンジへの適用課題  最初の2層をLUT-Netで構成  最後の層を INT8 で構成  学習を実施 

    LUT層を HLS に変換  INT8はC言語で記述  統合してHLSで合成 最後の層を普通の量子化Affineモデルで学習 LUT-Net (random-connect) LUT-Net (depth-wise) 28x28画像(784bit) Dense Affine[INT8] (depth-wise) 10class分類 マクロ駆使して文字数削減 256bit 320bit(32 x 10) 10x8bit (int8) LUT-Net (LUT: 576個) argmax HLS
  18. INT8 Dense Affine の実装 重みとバイアスを普通にテーブル化 メインの積和 (HLSの本領発揮) Dense Affine (要するに普通の密行列の乗算)

    の実装 テンプレートで加算ツリーを書 いてみた(効果は謎)。 以前、一度これで少し速くなったことが... テンプレートで加算ツリーを書 いてみた(効果は謎)。 以前、一度これで少し速くなったことが...
  19. まとめ  HLSチャレンジはスキルアップに最適  HLSを勉強したい方の最初の一歩に是非!  ACRi ルームはとても素敵  無償で使えるなんて神環境!

     FPGAはやっぱり楽しい  FPGAならではのアルゴリズム探索の余地はまだまだいっぱい残っ てると思います  計算アーキテクチャも前人未到な領域はいっぱい残っていると思い ます、FPGAならアイデアを形にできます ACRi さん、とっても楽しませて頂き 有難うございました!