Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
オリジナルの深層学習で HLS Challenge にチャレンジ
Search
Ryuji Fuchikami
February 28, 2023
Technology
0
520
オリジナルの深層学習で HLS Challenge にチャレンジ
第12回ACRiウェビナー(2023/02/28) 用の発表資料です。
https://acri.connpass.com/event/274425/
Ryuji Fuchikami
February 28, 2023
Tweet
Share
More Decks by Ryuji Fuchikami
See All by Ryuji Fuchikami
Zynq MP SoC で楽しむエッジコンピューティング ~RTLプログラミングのススメ~
ryuz88
0
1.8k
LUT-Network ~その後の話~
ryuz88
0
58
Rust で RTOSを考える
ryuz88
0
56
Verilatorやってみた! ~ OpenCVでテストベンチを書いてみた ~
ryuz88
0
36
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using LUT-based Signal Processing and its Time-domain Extension for Multi-bit Processing
ryuz88
0
46
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
ryuz88
0
50
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
ryuz88
0
340
Other Decks in Technology
See All in Technology
信頼性に挑む中で拡張できる・得られる1人のスキルセットとは?
ken5scal
2
540
個人でもIAM Identity Centerを使おう!(アクセス管理編)
ryder472
3
220
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.6k
TanStack Routerに移行するのかい しないのかい、どっちなんだい! / Are you going to migrate to TanStack Router or not? Which one is it?
kaminashi
0
590
AIチャットボット開発への生成AI活用
ryomrt
0
170
強いチームと開発生産性
onk
PRO
34
11k
インフラとバックエンドとフロントエンドをくまなく調べて遅いアプリを早くした件
tubone24
1
430
データプロダクトの定義からはじめる、データコントラクト駆動なデータ基盤
chanyou0311
2
320
Engineer Career Talk
lycorp_recruit_jp
0
170
マルチプロダクトな開発組織で 「開発生産性」に向き合うために試みたこと / Improving Multi-Product Dev Productivity
sugamasao
1
310
スクラムチームを立ち上げる〜チーム開発で得られたもの・得られなかったもの〜
ohnoeight
2
350
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
120
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
180
21k
Optimizing for Happiness
mojombo
376
70k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
Teambox: Starting and Learning
jrom
133
8.8k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Being A Developer After 40
akosma
86
590k
RailsConf 2023
tenderlove
29
900
Navigating Team Friction
lara
183
14k
Transcript
オリジナルの深層学習で HLS Challenge にチャレンジ 渕上 竜司 @Ryuz88
自己紹介 (渕上 竜司@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 ↑ すべて個人の趣味です ふちかみ りゅうじ
本日お話ししたいこと はっきり言ってHLSは初心者 なぜ一部の問題で好成績が出せたのか、コーディングテク ニックだけではないFPGAの奥深さや楽しさを共有したい HLSチャレンジの魅力 HLSの入門の場として、初心者視点で魅力をお伝えしたい
FPGAの魅力 FPGA自体が計算機としてとても魅力的 LUTを直接学習させる FPGA でしかできない深層学習(LUT- Network)の紹介とHLSへの適用を紹介します
HLSチャレンジの魅力
HLSチャレンジとは https://acri-vhls-challenge.web.app/ 誰でも無料で簡単に参加でき、HLSでプログラミングに挑戦できるサイト
HLSチャレンジとは https://acri-vhls-challenge.web.app/ 誰でも無料で簡単に参加でき、HLSでプログラミングに挑戦できるサイト 今回、直近の6問に 挑戦させて頂きました
HLSチャレンジについて初心者の所感 これが無かったらHLSの世界に触れてい なかったかもしれません(感謝) オススメポイント 実行環境が良くできている ステップアップしながら学べる
HLSチャレンジのオススメポイント その1 実行環境 Web上ですぐに試せる Vitisの入ったローカル環境でもすぐ動かせる ACRi ルーム(クラウド)ですぐに試せる
Webからすぐにはじめられる 最初から回答例があるのでそのま ま提出でもOK 少し pragma を足してみるとスコ アが変る
誰でもすぐにHLSが体感できる 何の準備もしなくても、アカウント登録すればすぐに始められます!
実行パッケージの使いやすさが凄い 貼り付け(Ctrl+V)るだけで、ローカルやACRiルームに環境ができる vhls-check を実行するだけ
ACRi ルームの魅力 実ボードが試せるだけではない! HLSチャレンジの為のACRi ルームの魅力 複数バージョンがインストール済み FPGA合成に最適な豪華スペック ローカルのバージョン違いのVitisでやってた らスコアが合わずに地味に嵌まりました(笑) ※
HLSチャレンジのページの説明より抜粋
ACRi ルームを VS Code で使う .ssh/config の記述 私は Windows11 から、ローカルのWSL2環境
と ACRi ルーム環境を活用しています PowerShell の ssh を使う場合の設定 ※ まず gw.acri.c.titech.ac.jp に繋いでから、各サーバーに繋ぐ必要があります また、authorized_keys などの公開鍵設定は事前に行ってください ローカルのWSLと区別がつかない使い心地
VS Code でのチャレンジ風景 実行待ってる間に、次々別パターンを考えるので、ディレクトリがカオスになりがち(お恥ずかしい)
HLSチャレンジのオススメポイント その2 ステップアップしながら学べる 最初は回答例をそのまま提出でもOK #pragma をちょっとづつ足していく 最初は unroll
と pipeline をなんとなく理解 入力をAXI-Streamにする魔法を覚える FPGA向きのアルゴリズムに変えていく #pragma HLS dataflow を覚える 他の pragma も覚えていく 出来ることから少しづつ 下手に「RTLだったらこう書くのに」という背伸びをしたゴールを望むと、 問題ではなくコンパイラと戦ってしまい、不毛な苦しみを生むことも...
今回取り組んだこと
最新の6問の中に1つだけ異色なものが 1~5も一通り挑戦しましたが、6に注力しすぎて後半は力尽きました...
最新の6問の中に1つだけ異色なものが 自由に!?
mnist6-free の魅力 何が異色か? 他のHLSの問題と違って唯一の期待値がない! (90%以上の認識のみが条件) Kaggle とかと違って、認識率がスコアに関係ない!
(出来上がった回路の計算時間が重要) MNISTなので別に学習用のデータセットが手に入る こんな条件の競技今までなかった!
(たぶん)FPGAでしか機能しない 独自アルゴリズムのネットワーク (LUT-Network) と 独自の学習プラットフォーム (BinaryBrain) で 挑戦したので 紹介させてください
FPGA専用深層学習 LUT-Network の紹介 FPGAのLUT内の64bitテーブルの値を直接学習させる独自の深層学習 既存の組み込みFPGAで 使えるコンパクトAI
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個利用可能
FPGAの神髄、超並列のテーブル引き 1個のLUTで 2^64 = 18,446,744,073,709,551,616 通り CPUでも テーブル引きした方が速い [FPGAが得意] CPUのALU計算でも速い
膨大な組み合わせの中でALU演算に負けるのは僅か (でも普段のFPGAプログラムはそこを使いがち) 積極的にこの空間を活用した、データプロセッシングを狙う 想像ですが...
原理の説明(1) 普通のデジタル回路は0と1しか扱えず 微分もできません 入力1 入力2 出力 0 0 1 0
1 1 1 0 1 1 1 0
原理の説明(2) アナログ値 デジタル値 PWM変調、1bit⊿Σ変調、D級アンプなどのデジタルでアナログ量を 扱う方式が世の中には存在します(オーバーサンプリング技術) 目をつぶってデジタル値をサンプリングすると、 1が観測される確率 = その時のアナログ値 となります。
原理の説明(3) 1110111101 0100111010 1011000111 1の出現確率 0.8 1の出現確率 0.5 1 -
0.8×0.5 = 0.6 1の出現確率 0.6 デジタル値ではなく、確率変数が入力されると仮定すると NANDゲートは掛け算と引き算で記述でき 微分可能 となります。 NANDゲートがあればどんなデジタル回路も作れます。 Stochastic演算
原理の説明(4) LUTもデジタル回路なので、微分可能なLUTモデルが作れます。 これに Batch Normalization など組み合わせたのが、微分可能LUTモデルです。 ※ 本当は計算式が先にできて、後から Stochastic計算をやっていたに他ならなかったことに気づいて、理屈を後付けしたのですが...
(余談) 余談ですが 2入力LUTをモデル化すると多層化せずに1個でXORが解けます WikipediaのPerceptronの項より 可視化するとこんな感じ... CGとかで使うバイリニア補間の式と同じです
原理の説明(5) Binary Modulation Binary Modulation Integration Integration Softmax Cross Entropy
mini-batch として纏めて投入 LUT-Network (微分可能LUTモデル) 7:horse (馬) Loss 0:airplane (飛行機) Loss 学習フロー forward backward
原理の説明(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 普通のカメラの フレーム複製
一般的な深層学習との比較 大量の 積和演算器 一般的な深層学習 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
独自学習環境(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 ソース出力を補助
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年以上やってました ~
HLSチャレンジへのアプローチ 演算遅延勝負なのでCNNは使わない 90%ならMLP(多層パーセプトロン)で行ける だったらLUT-Netでも目指すべき(結構なチャレンジ) 入力が2値なのでバイナリ変調も使わない
1パスの認識のみで90%を狙らう(いける... はず!) さっそく BinaryBrain で学習を開始!
HLSチャレンジ(mnist6-free)へ適用 一応、2.6k LUT で 8cycle あれば 90% は出せそう? pip で入れるだけ
MNISTデータの準備には TorchVisionを利用 微分可能LUTでネットワーク定義
が、しかし、 さっそく問題が...
HLSチャレンジへの適用課題(1) HLSがテーブル引きをLUTに推論してくれない! LUTをC++ に逆コンパイルするという謎の試み (これはHLS設計者も予想外だったでしょう)。 こんなコードだと駄目っぽい (回路が肥大化したり、コンパイルが終わらなかったり)
case 文や、if 分や、ap_uint<64> の bit 選択やいろいろ試すが挫折。 他の問題とかで気分転換しつつ 時々いろいろやってみること数日...
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]; } こう書けばよさそう
しかし、 提出しようとしたところで さらなる問題が発生...
HLSチャレンジへの適用課題(2) 6入力LUTのテーブルは64bit = 16進数で16桁 しかし HLSチャレンジのコード文字数は 65000 文字
理屈上 4k LUT が上限、実際は接続の記述もあるので 1.5k も入らない ⇒ さすがに半分以上の縮小は無理! 文字数オーバー!!
方針転換 深層学習のネット設計から 見直すことに! せっかくのHLSなのだからHLSらしい レイヤーも導入しよう! (ハイブリッドへの挑戦)
INT8とかも使えるモデル作りました 性能比較用にFP32しかなかったので、新たに INT1/2/3/4/5/6/7/8~ とかできる バイナリじゃないクラスも作りました 新機能 もともとあった cuBLAS 使ったFP32用の計算前後に 量子化処理を追加
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
LUT-Net 部分の実装 ひたすら64bitのテーブルを並べる ひたすら6入力に接続 メインのコード からは呼ぶだけ 後段の為に 並び替え
INT8 Dense Affine の実装 重みとバイアスを普通にテーブル化 メインの積和 (HLSの本領発揮) Dense Affine (要するに普通の密行列の乗算)
の実装 テンプレートで加算ツリーを書 いてみた(効果は謎)。 以前、一度これで少し速くなったことが... テンプレートで加算ツリーを書 いてみた(効果は謎)。 以前、一度これで少し速くなったことが...
ついに提出へ... HLSチャレンジのページについに投稿! 結果の出るまでのドキドキタイムもHLSシャレン時の醍醐味 トップページでは他の方の提出と 並んで状況が見れます
結果 内部で20問解く構成と思われるので、一問 66ns で推論する回路になりました。 (15M fps ぐらいでしょうか?) やったー、やっとタイムアウトせずに流れたぞ!!!
まとめ HLSチャレンジはスキルアップに最適 HLSを勉強したい方の最初の一歩に是非! ACRi ルームはとても素敵 無償で使えるなんて神環境!
FPGAはやっぱり楽しい FPGAならではのアルゴリズム探索の余地はまだまだいっぱい残っ てると思います 計算アーキテクチャも前人未到な領域はいっぱい残っていると思い ます、FPGAならアイデアを形にできます ACRi さん、とっても楽しませて頂き 有難うございました!
ご清聴ありがとうございました @Ryuz88 フォローよろしくお願いします http://ryuz.my.coocan.jp 皆さま、よきFPGAライフを!