Ryuz's tech blog

FPGAなどの技術ブログ

(おまけ) 続・FPGAに対する誤解

はじめに

前回、FPGAに対する誤解と「どうFPGAを使うべきか」 という記事を書きました。

ちょっと調子に乗ってアンチパターンをイラスト化してみたのでおまけ記事として書いておこうと思います。

本来のFPGAの活用シーン

本来のFPGAの活用シーン

ISPなどの典型ですが、例えばカメラから入ってきた画像を入ってきた順で処理して、そのまま出力するのでとても効率的です。

従来は画像の現像や高画質化処理ノイズ除去などが一般的でしたが、当サイトではこのやり方で「動き計測」とか「AI認識」など、いわゆる CV(Computer Vision) と言われる領域に手広く適用可能であることがだいぶ示せてきていると思います。

CG分野でもこのアーキテクチャでの低遅延ポリゴン描画など示せてきました。

アルゴリズム研究者が使う環境

便利な並列計算機であるGPUの為に、一度データをメモリに溜めて並列化することで並列演算を可能にするように構成したものです。 最先端の半導体製造プロセスで作られた高速大容量の計算能力の恩恵に預かりやすいです。

アルゴリズム研究者が使う環境

画像処理アルゴリズム研究の分野では、多くの領域でAI(深層学習)を使った研究が、特に認識精度(accuracy)の観点で SOTA(state of the art) となっていきました。 必然、非AIの研究はしばし「AIと比べて性能で勝てるの?」と言われてしまう辛い時代になりました。

遅延や電力やコストを置いておけば、GPU上で机上でアルゴリズム精度の研究を行うのは非常に便利ですので、この形で研究されたアルゴリズムが世にあふれることになりました。

もちろん一度メモリに溜めた分遅延は増えますし、コストや電力も増大しますが、「簡単にアルゴリズム実験がいろいろできる」という効率性の前には些細な事です。

これはこれでもちろん世の中をすごく進歩させてくれたのですが、計算機は とにかく AI 性能がいいことだけを求められるようになってきました。

また、遅延等が課題になる分野の研究が置き去りになってしまうという、困ったことも起こっていると思っています。

誤解1:GPU計算をそのままFPGA化してしまうパターン

で、前回記事の続きで、GPU方面からFPGAに興味を持って下さった方が、陥る可能性のアンチパターンその1です。

GPU計算をそのままFPGA化してしまうパターン

FPGAにする(というかハードウェア化する)と高性能化する」と聞いて、今あるGPU用のプログラムをそのままFPGA化しちゃうパターンですね。

往々にして最先端プロセスで作られ、大量の浮動小数点演算器のハードマクロを持ち、GDDRなどの高速メモリを持つGPUに、汎用ロジックで勝てるわけがなく、苦しむことになります。もっとも計算機の勉強にはなると思います。

誤解2:そのままそこだけストリーム化してしまうパターン

そこだけストリーム化してしまうパターン

FPGAはストリーム処理が得意だと聞いて、そのままそこだけストリーム化してしまうパターンですね。

見ての通り、GPUの為に ストリームを並列データに変換してあるものを、再度ストリーム化するというもったいないことになっています。

とはいえ、「原理的には低遅延なリアルタイム処理に持っていけるアルゴリズム」が生まれてくる可能性がある点では、そこまで悲観的ではないです。

ただ、ストリーム処理は「演算器を再利用する」ことが苦手なので、しばし「リソースが足りなくて収まらない」という事になりがちです。

アルゴリズムを出発点にせずに、ハードウェアアーキテクチャを出発点にアルゴリズムを組み立てる という事が必要です。

考えて欲しいこと

冒頭のFPGAに適した処理は、実はアナログ時代の信号処理に似ています。 アナログ時代は、「信号をメモリに溜める」ということが極めて困難だったため、必然的にメモリによる遅延はありませんでしたが、できる演算に限りがありました。

一方で、デジタル時代ではメモリが使えますので過去のデータが自由に使えます。 (なお、未来のデータを使おうとするとそのデータが来るまで処理を遅延させることになります)。

これをアルゴリズムにうまく組み込むことが重要です。

冒頭の絵では入力が一直線に処理されているだけでしたが、下記のようにメモリを追加すれば、低遅延なストリーム処理に加えて、過去のデータへのアクセスが可能になります。

FPGAで効率よくメモリを使うモデル

AI で言えば RNN などのリカレント構造が作れるという事ですね。

以前「リアルタイムコンピューティングのメモリ階層」という記事を書き、こんな絵を載せました。

リアルタイムコンピューティングのメモリ階層

メモリ階層をしっかり考えて、アルゴリズムや学習モデルに反映させるというのは、リアルタイム性を高める上では非常に重要です。

おわりに

AIとGPUの台頭で、本来 FPGA が得意だったリアルタイム性の高い分野が、非リアルタイム分野で研究されていた画像処理研究からだいぶ置いて行かれてしまってているように思います。

  • 計算機アーキテクチャを勉強しないと太刀打ちできない
  • 難しいFPGAプログラミングを覚えなければ実験データすら取れない

などの壁はあるものの、これらを乗り越えれば

  • GPUのことしか考えていない人とは一線を課す新しいモデルの提案
  • みんなが使っているのとは全く異なるオリジナルなデータを使った研究

という差別化が可能です。

大事なのは本質がわからないまま表面的な理解でFPGAを使うと、余計な苦労をした挙句に成果が出ない、なんていうもったいないことになるので、よく理解して、作戦を立ててから使って欲しいという事です。 ちゃんとわかってしまえば、とても楽しいですし、レッドオーシャンで血の涙を流している研究者を横目に、前人未踏のブルーオーシャンを次々開拓していける事でしょう。

若い学生さん、研究者の皆様、FPGAは楽しいし狙い目ですよ!

私は研究者というよりはエンジニア側の人間ですので、「こんな研究があると面白い」という情報交換だったり、「こんな環境なら作れるよ」というったエンジニアリング側からのお手伝いしか出来ないのですが、新しくて面白い研究が生まれてくるのを楽しみにしております。そしてなにより、研究者の方々にも不毛な作業を減らし充実した日々を送っていただけれれば幸いに思う次第です。