LUT-Network を振り返る - Ryuz's tech blog

Ryuz's tech blog

FPGAなどの技術ブログ

LUT-Network を振り返る

はじめに

BinaryBrain の最初のコミット日を調べてみると 2018年8月1日でした。

github.com

LUT-Network という名前のネットワークとその学習環境である BinaryBrain の開発を始めてから 6 年以上が経ったことになります。

世の中の AI が LLMなどで盛り上がるなか、作った本人もなかなか置いてけぼり感を感じながら時間だけ過ぎ去っていった感じはあったのですが、最近になって CQ出版様の Interface誌付録の別冊付録 FPGAマガジン No.3や、別冊付録GOWIN Vol.4 に記事にさせて頂いたりしたこともあり、少し引き合いを頂いたりもしております。有難い限りです。

ということで、今更ながら少し掘り返してみたいと思います。

そもそも何を狙ったものだったのか?

今更ですが当方のライフワークは リアルタイムコンピューティング にあります。 その時点で、「ノンリアルタイムOSの上で動いている AI のフレームワークGPGPU を使って実行」というようなものの相性の悪さが想像していただけると嬉しいのですが、ピンとくる方には来るでしょうし、そうでない方もいらっしゃるでしょう。

リアルタイムコンピューティングでは、フィードバック系での時間保証であったり、そのデータが「いつのものか?」が誤差なく正確であることに重要性があったり、「変化(時間方向への微分)」を正確に測ることが大事だったり、他のアクチュエータと正確に同期していることに価値があったり、まあ様々ですが、計算している間に嫌でも経過していく時間 というものをアルゴリズム要素に加えていこうという試みです。

早い話が、計算において、それに伴う時刻や時間経過が確定的に取り扱えないと困る人たち向けの計算機を考える分野なわけです。

ここで FPGA というのはとても便利なデバイスでして、アルゴリズムをコーディングする段階で、Verilog の always文とかでサイクル毎の処理を記述していくので、いつのデータを計算して、いつ結果を出すか完全に把握できるわけです。さらには PLL を弄って周波数調整したり、クロックの位相ずらしたり、I/Oにある遅延タップを弄ったり、と、ナノ秒超えてピコ秒までソフトウェアで扱えてしまいます。

もちろんいつ来るかわからないデータを待つとか、処理時間の読めないDRAMへのアクセスと同期するとか、不確定要素を持ち込むことはいくらでもできるわけですが、逆に言うとそれさえしなければとても高いリアルタイム性が得られるわけです。

で、まあ、そういう世界でいろいろな事をやっていたわけですが、世の中が AI 一色になってくると無視も出来ないので、AI 的なことやれないかとあれこれ考えるわけですが、DRAM 等を使わずになるべく低レイテンシでサイクル単位で処理時間を固定しようとすると FPGA 内で処理フローを閉じる必要があるわけです。

で、特に画像処理をカメラピクセルクロックで1クロック1データのスループットを保証する世界であれこれやっていた私にとってどういう制約になってくるかと言うと、例えば 100入力100出力のパーセプトロンを1層作ろうとするとDSP(積和乗算器)を 10000個 固定的に並べないといけないという事になるわけです。 まあ、高価なFPGA なら何層かぐらいは入るわけですが、まともに考えると趣味でやるには非現実的な規模になってきてしまうわけです。

とはいえ、そこで諦めるのももったいないので、今ある目の前の お安い FPGAボードに入りきる深層学習の理論限界ってどこよ? という、これまたとりとめのない事を考え始めて LUT-Network が爆誕したわけです。

何が嬉しいのか

大雑把に

  1. 演算のレイテンシが固定
  2. バイス限界の動作周波数が狙える
  3. 回路規模(消費リソース)が読める

となってきます。

まず一つ目ですが、FPGAロジックなので、当然、「XXサイクル後に結果が出る」というのは確定です。例えば 10層のMLP を 500MHz で動かせば、常に 20ns の固定遅延で入力に対する結果が出続けて、揺らぎはナノ秒レベルになります。

これは 非常に時間制約のあるフィードバック信号処理系に AIを突っ込める という可能性の提示に他なりません。

次に周波数ですが、これはまあ副産物みたいなものですが、FPGA の最小演算単位である LUT 1 段で1層出来てしまいますので、1クロックで1層づつ計算させれば配線遅延以外周波数を制約する要素が何もないわけです。

そして最後の回路規模については、学習用のネットワークを作る段階で規模が見えているというか、むしろ 先にデバイスが決まってからそれを学習させている 感じなので、たいへん見積もり性が良いわけです。

今信号処理につかってるFPGAの隙間リソースに「ちょこっとAI」を入れて、出来高払いで精度を見てみよう。みたいなお気楽な事も出来ちゃうわけです。

まだ発展余地はあるのか?

LUT-Network のネット規模はデバイスサイズで制約されます。また、高いリアルタイム性を求められる決まった時間内にできる計算量もたかが知れています。 結局ここが一つの限界点ではあるのですが、リアルタイム処理においてはまだ 過去の計算結果を使って動的計画法的に性能を上げていく という道筋は残っています。 特にハイサンプリングレートの世界ではシンプルな計算で過去から現在を予測しやすいケースがあります(なにしろ周期が早いので、その分世の中があまり変化しないので予測が容易になる)。過去からの情報も使いつつ最新のデータを使ってあくまで最新の出力に最善を尽くす というのは、例えばカルマンフィルタの考え方なんかはほぼこれですし、深層学習で言えば RNN などがこれにあたるかと思います。(結局、状態空間モデルの取り扱いを如何にAIで知的にするかという話に終始して来るのかな?)

とはいえ RNN はなかなか扱いが難しく、いろいろやったあと手が止まっていたりしますが(汗)。

おわりに

まあ、そんな LUT-Network なわけです。世間の「AIでできること」の期待値が LLM の登場であがりすぎて、AI と言うと超知的な事ができることを期待されがちなので、なかなか「AI できます」と言うのが憚られるようになってはいるのですが、それでも「ちょこっとAI」みたいなところに需要があるといいなと思う今日この頃です。

結局、「凄いAI」も「チープなAI」も、ルールベースで攻めるととても大変なタスクを人間に変わって何とかしてくれるという点では共通ですので、かならずしも ChatGPT みたいな凄いものでなくても、機械学習の使いどころはあるのではないかとは思っている次第です。

どこかでまた日の目が見れるといいなと思う次第です。

おまけ

見返してみると 私が最初に fpgax にお邪魔させて頂いた時のサブタイトルや導入が、リアルタイムコンピューティングの話ですね。

きっと聞いてた人は何のことやらだっただろうなと、今更ながら(汗)

speakerdeck.com