Slide 1

Slide 1 text

オリジナルの深層学習で HLS Challenge にチャレンジ 渕上 竜司 @Ryuz88

Slide 2

Slide 2 text

自己紹介 (渕上 竜司@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 ↑ すべて個人の趣味です ふちかみ りゅうじ

Slide 3

Slide 3 text

本日お話ししたいこと  はっきり言ってHLSは初心者  なぜ一部の問題で好成績が出せたのか、コーディングテク ニックだけではないFPGAの奥深さや楽しさを共有したい  HLSチャレンジの魅力  HLSの入門の場として、初心者視点で魅力をお伝えしたい  FPGAの魅力  FPGA自体が計算機としてとても魅力的  LUTを直接学習させる FPGA でしかできない深層学習(LUT- Network)の紹介とHLSへの適用を紹介します

Slide 4

Slide 4 text

HLSチャレンジの魅力

Slide 5

Slide 5 text

HLSチャレンジとは https://acri-vhls-challenge.web.app/ 誰でも無料で簡単に参加でき、HLSでプログラミングに挑戦できるサイト

Slide 6

Slide 6 text

HLSチャレンジとは https://acri-vhls-challenge.web.app/ 誰でも無料で簡単に参加でき、HLSでプログラミングに挑戦できるサイト 今回、直近の6問に 挑戦させて頂きました

Slide 7

Slide 7 text

HLSチャレンジについて初心者の所感 これが無かったらHLSの世界に触れてい なかったかもしれません(感謝) オススメポイント 実行環境が良くできている ステップアップしながら学べる

Slide 8

Slide 8 text

HLSチャレンジのオススメポイント その1 実行環境 Web上ですぐに試せる Vitisの入ったローカル環境でもすぐ動かせる ACRi ルーム(クラウド)ですぐに試せる

Slide 9

Slide 9 text

Webからすぐにはじめられる  最初から回答例があるのでそのま ま提出でもOK  少し pragma を足してみるとスコ アが変る  誰でもすぐにHLSが体感できる 何の準備もしなくても、アカウント登録すればすぐに始められます!

Slide 10

Slide 10 text

実行パッケージの使いやすさが凄い  貼り付け(Ctrl+V)るだけで、ローカルやACRiルームに環境ができる  vhls-check を実行するだけ

Slide 11

Slide 11 text

ACRi ルームの魅力 実ボードが試せるだけではない! HLSチャレンジの為のACRi ルームの魅力 複数バージョンがインストール済み FPGA合成に最適な豪華スペック ローカルのバージョン違いのVitisでやってた らスコアが合わずに地味に嵌まりました(笑) ※ HLSチャレンジのページの説明より抜粋

Slide 12

Slide 12 text

ACRi ルームを VS Code で使う .ssh/config の記述 私は Windows11 から、ローカルのWSL2環境 と ACRi ルーム環境を活用しています PowerShell の ssh を使う場合の設定 ※ まず gw.acri.c.titech.ac.jp に繋いでから、各サーバーに繋ぐ必要があります また、authorized_keys などの公開鍵設定は事前に行ってください ローカルのWSLと区別がつかない使い心地

Slide 13

Slide 13 text

VS Code でのチャレンジ風景 実行待ってる間に、次々別パターンを考えるので、ディレクトリがカオスになりがち(お恥ずかしい)

Slide 14

Slide 14 text

HLSチャレンジのオススメポイント その2  ステップアップしながら学べる  最初は回答例をそのまま提出でもOK #pragma をちょっとづつ足していく 最初は unroll と pipeline をなんとなく理解 入力をAXI-Streamにする魔法を覚える FPGA向きのアルゴリズムに変えていく #pragma HLS dataflow を覚える 他の pragma も覚えていく  出来ることから少しづつ 下手に「RTLだったらこう書くのに」という背伸びをしたゴールを望むと、 問題ではなくコンパイラと戦ってしまい、不毛な苦しみを生むことも...

Slide 15

Slide 15 text

今回取り組んだこと

Slide 16

Slide 16 text

最新の6問の中に1つだけ異色なものが 1~5も一通り挑戦しましたが、6に注力しすぎて後半は力尽きました...

Slide 17

Slide 17 text

最新の6問の中に1つだけ異色なものが 自由に!?

Slide 18

Slide 18 text

mnist6-free の魅力  何が異色か?  他のHLSの問題と違って唯一の期待値がない! (90%以上の認識のみが条件)  Kaggle とかと違って、認識率がスコアに関係ない! (出来上がった回路の計算時間が重要)  MNISTなので別に学習用のデータセットが手に入る こんな条件の競技今までなかった!

Slide 19

Slide 19 text

(たぶん)FPGAでしか機能しない 独自アルゴリズムのネットワーク (LUT-Network) と 独自の学習プラットフォーム (BinaryBrain) で 挑戦したので 紹介させてください

Slide 20

Slide 20 text

FPGA専用深層学習 LUT-Network の紹介 FPGAのLUT内の64bitテーブルの値を直接学習させる独自の深層学習 既存の組み込みFPGAで 使えるコンパクトAI

Slide 21

Slide 21 text

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個利用可能

Slide 22

Slide 22 text

FPGAの神髄、超並列のテーブル引き 1個のLUTで 2^64 = 18,446,744,073,709,551,616 通り CPUでも テーブル引きした方が速い [FPGAが得意] CPUのALU計算でも速い 膨大な組み合わせの中でALU演算に負けるのは僅か (でも普段のFPGAプログラムはそこを使いがち) 積極的にこの空間を活用した、データプロセッシングを狙う 想像ですが...

Slide 23

Slide 23 text

原理の説明(1) 普通のデジタル回路は0と1しか扱えず 微分もできません 入力1 入力2 出力 0 0 1 0 1 1 1 0 1 1 1 0

Slide 24

Slide 24 text

原理の説明(2) アナログ値 デジタル値 PWM変調、1bit⊿Σ変調、D級アンプなどのデジタルでアナログ量を 扱う方式が世の中には存在します(オーバーサンプリング技術) 目をつぶってデジタル値をサンプリングすると、 1が観測される確率 = その時のアナログ値 となります。

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

原理の説明(4) LUTもデジタル回路なので、微分可能なLUTモデルが作れます。 これに Batch Normalization など組み合わせたのが、微分可能LUTモデルです。 ※ 本当は計算式が先にできて、後から Stochastic計算をやっていたに他ならなかったことに気づいて、理屈を後付けしたのですが...

Slide 27

Slide 27 text

(余談) 余談ですが 2入力LUTをモデル化すると多層化せずに1個でXORが解けます WikipediaのPerceptronの項より 可視化するとこんな感じ... CGとかで使うバイリニア補間の式と同じです

Slide 28

Slide 28 text

原理の説明(5) Binary Modulation Binary Modulation Integration Integration Softmax Cross Entropy mini-batch として纏めて投入 LUT-Network (微分可能LUTモデル) 7:horse (馬) Loss 0:airplane (飛行機) Loss 学習フロー forward backward

Slide 29

Slide 29 text

原理の説明(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 普通のカメラの フレーム複製

Slide 30

Slide 30 text

一般的な深層学習との比較 大量の 積和演算器 一般的な深層学習 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

Slide 31

Slide 31 text

独自学習環境(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 ソース出力を補助

Slide 32

Slide 32 text

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年以上やってました ~

Slide 33

Slide 33 text

HLSチャレンジへのアプローチ  演算遅延勝負なのでCNNは使わない  90%ならMLP(多層パーセプトロン)で行ける  だったらLUT-Netでも目指すべき(結構なチャレンジ)  入力が2値なのでバイナリ変調も使わない  1パスの認識のみで90%を狙らう(いける... はず!) さっそく BinaryBrain で学習を開始!

Slide 34

Slide 34 text

HLSチャレンジ(mnist6-free)へ適用 一応、2.6k LUT で 8cycle あれば 90% は出せそう? pip で入れるだけ MNISTデータの準備には TorchVisionを利用 微分可能LUTでネットワーク定義

Slide 35

Slide 35 text

が、しかし、 さっそく問題が...

Slide 36

Slide 36 text

HLSチャレンジへの適用課題(1)  HLSがテーブル引きをLUTに推論してくれない!  LUTをC++ に逆コンパイルするという謎の試み (これはHLS設計者も予想外だったでしょう)。  こんなコードだと駄目っぽい (回路が肥大化したり、コンパイルが終わらなかったり)  case 文や、if 分や、ap_uint<64> の bit 選択やいろいろ試すが挫折。 他の問題とかで気分転換しつつ 時々いろいろやってみること数日...

Slide 37

Slide 37 text

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]; } こう書けばよさそう

Slide 38

Slide 38 text

しかし、 提出しようとしたところで さらなる問題が発生...

Slide 39

Slide 39 text

HLSチャレンジへの適用課題(2)  6入力LUTのテーブルは64bit = 16進数で16桁  しかし HLSチャレンジのコード文字数は 65000 文字  理屈上 4k LUT が上限、実際は接続の記述もあるので 1.5k も入らない ⇒ さすがに半分以上の縮小は無理! 文字数オーバー!!

Slide 40

Slide 40 text

方針転換 深層学習のネット設計から 見直すことに! せっかくのHLSなのだからHLSらしい レイヤーも導入しよう! (ハイブリッドへの挑戦)

Slide 41

Slide 41 text

INT8とかも使えるモデル作りました 性能比較用にFP32しかなかったので、新たに INT1/2/3/4/5/6/7/8~ とかできる バイナリじゃないクラスも作りました 新機能 もともとあった cuBLAS 使ったFP32用の計算前後に 量子化処理を追加

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

LUT-Net 部分の実装 ひたすら64bitのテーブルを並べる ひたすら6入力に接続 メインのコード からは呼ぶだけ 後段の為に 並び替え

Slide 44

Slide 44 text

INT8 Dense Affine の実装 重みとバイアスを普通にテーブル化 メインの積和 (HLSの本領発揮) Dense Affine (要するに普通の密行列の乗算) の実装 テンプレートで加算ツリーを書 いてみた(効果は謎)。 以前、一度これで少し速くなったことが... テンプレートで加算ツリーを書 いてみた(効果は謎)。 以前、一度これで少し速くなったことが...

Slide 45

Slide 45 text

ついに提出へ... HLSチャレンジのページについに投稿! 結果の出るまでのドキドキタイムもHLSシャレン時の醍醐味 トップページでは他の方の提出と 並んで状況が見れます

Slide 46

Slide 46 text

結果 内部で20問解く構成と思われるので、一問 66ns で推論する回路になりました。 (15M fps ぐらいでしょうか?) やったー、やっとタイムアウトせずに流れたぞ!!!

Slide 47

Slide 47 text

まとめ  HLSチャレンジはスキルアップに最適  HLSを勉強したい方の最初の一歩に是非!  ACRi ルームはとても素敵  無償で使えるなんて神環境!  FPGAはやっぱり楽しい  FPGAならではのアルゴリズム探索の余地はまだまだいっぱい残っ てると思います  計算アーキテクチャも前人未到な領域はいっぱい残っていると思い ます、FPGAならアイデアを形にできます ACRi さん、とっても楽しませて頂き 有難うございました!

Slide 48

Slide 48 text

ご清聴ありがとうございました @Ryuz88 フォローよろしくお願いします http://ryuz.my.coocan.jp 皆さま、よきFPGAライフを!