Ryuz's tech blog

FPGAなどの技術ブログ

FPGAに対する誤解と「どうFPGAを使うべきか」

はじめに

以前、FPGAを始めるときの壁 というのを書かせて頂きました。 また最近、CPUGPU についても幾つか個人的意見を書かせて頂きました。

今日は、今のところ私が最も熱を入れている FPGA について私見を書いてみたいと思います。

FPGA に対する誤解

今、特に GPU などで AI に取り組んでいる方々が「FPGAというデバイスがあるらしい」と興味を持ってこの分野の門をたたいてくださる機会が増えているように思います。

一方で、高価なFPGAボードを買ってきて、ものすごく苦労してベンダーの出しているツール(AI開発ツール含む)を覚え、慣れない難しいプログラムのデバッグに翻弄され、GPU の 10倍も100倍も苦労して作った挙句、GPU の 1/10 も性能が出ず、性能も電力もコストもリアルタイム性すらGPUに負け、いいとこなしで「意味のない研究だったね」と酷評されて終わってしまうなどという、なんとももったいない話ですが、こんなことも往々に起こっているのではないかと思います。

このパターンが発生する理由は意外とシンプルで、「GPU が最も得意とする処理を、わざわざ余分な苦労を追加して FPGA で無理やり同じことをやっている」からに他ならないケースが多い気がします。そして図らずも 苦労して追加した余計な事 が性能を下げてしまっていることに最後まで気づけないケースです。

そしてこのケースを生み出している要因の一つに、FPGAベンダーが「このツールを使えばGPUでやってるAIをFPGAで開発できるよ」と、GPUの代替になるFPGA を声高に宣伝文句にしている点があるように思います。ベンダーのこのうたい文句は、既にFPGAを使いこなしている人に対して「さらに GPU 市場の AIが簡単に取り込めるよ」という意味も含むので一概に批判もできないのですが、一部の人に誤解を生んでいる可能性はあるように思います。

先日、X で FPGA に USBカメラを繋ぐことについて下記のようなことを書いたら少し反響がありました。

FPGAを カメラのISP(Image Signal Processor) 代わりに使うのが便利だとして使っていたような層には、私と同様に FPGA + USBカメラに違和感を感じる方もおられたようです。

一方で、「GPU の代わりに FPGA を使ってみよう」というところから入ってくる方は、今の Jetson を KV260 に置き換えてみたり、PC で GPUボードが挿さっているところに替わりに Alveo や Agilex を挿さしてみるなどの話になるので、「カメラはそのまま今まで使っていたUSBカメラでいいよね」となってしまい、そこに疑問すら持たないわけです(むしろ条件を揃えて比較しないといけないと思ってわざわざGPUの土俵で比較評価をしてしまうわけです)。

一方で、先に違和感を感じた方からすると「そんなことしたらそれだけでFPGAのいいとこ全部死んじゃうよ!」という悲鳴が上がるのもまたよくわかります。

このやり方で FPGA に入ってきた場合、GPU と同じ条件で GPU に勝たないといけないので、実はかなり大変です。

  • GPUの得意な「同時に同じ計算を大量に」が効かないアルゴリズムで戦う
  • INT7以下とか 独自定義の非線形浮動小数点型とか、GPUにない演算を多用する
  • ホモジニアスなGPUに不利でヘテロジニアスな演算器構造を使うモデルを捻りだして勝ちに行く

などなど、GPUと同じ土俵で戦う際のノウハウと戦略を持っていないと、手も足も出ませんし、これらを駆使しても、常に先端製造プロセスで作られているGPUの地力でねじ伏せられてしまい、とても苦しむことになります。

RECONF研のこちらの天野先生のメッセージリコンフ8策 というのを見かけました。まさに金言だと思います。

ではどういうときにFPGAを使うべきなのか

ここではカメラの例を出しましたので引き続きそのまま例にしますが、FPGAISP として使っている層は、ISP に関しては GPU でやるより FPGA でやる方が、はるかに計算効率が良く、電力もコストもリアルタイム性も勝てることを知っています。

つまり、FPGA がすでに GPU に勝っている領域からスタートし、そこに AI など新しいものを足していく というのが個人的に最もお勧めするやり方です。

画像処理(マシンビジョン)であったり、スマートNICやネットワークスイッチのような通信分野、ロボットなどのリアルタイム制御、特殊なセンサー/アクチュエータなどのデバイス制御、などなど何もしなくても FPGA が圧勝していたり、そもそもCPU/GPUでは不可能なものだったり、FPGAが得意な分野は多数あります。

ここを出発点として、FPGAの強みを失わない範囲で拡張していくことが重要です。

これはズルでも何でもなく、裏返せば GPU も同じことを既にやっていて、自分の得意分野で戦っているから、FPGA より優位に見えているだけです。

計算機科学に触れよう

ここで、多くの場合、GPUはなぜAIが得意で、CPU は何故AI計算でGPUに負けているのか、などの なぜ? に踏み込まず、「FPGAと言うものがあってなんかGPUより高性能らしい」という話だけで、意味も分からず使ってしまうと失敗します。

先のリコンフ8策の分中でも「ハードウェアで実装したんだからソフトウェアに比べて速くなるに決まっている」なんて言葉が飛び出しておりましたが、アカデミック分野に属する先生方からですらこんな声が出る事もあるわけですから、やる側がそのレベルで飛びついてしまってはいけないのです。

もちろん、FPGA は正しく使えば、GPUより高性能になりえますし、わかってくるととても楽しいものです。

ですので、入り口で躓かないために計算機科学に興味を持っていただきたい ということをすごく感じてしまうのです。

ヘネパタ読めとまでは言いませんので、ネット上でいろいろ計算機の仕組みを調べてみたり、実際に CUDAのコードを書いてみて GPU の仕組みに触れてみるとか、いろいろ試してほしいと思います。 そのうえで、自分のやりたいこと、考えているアイデア、拘りたいポイントなどよく考えて、「これFPGAなら試せるアイデアじゃないか?」というゴールまでの道筋をしっかり考えて取り組むことをお勧めする次第です。

新しい時代の FPGA-AI 8策が必要

最後に、今なぜこんなことになっているかを少し振り返っておきます。

私にとって比較的なじみの深い画像信号処理の分野で言えば、アルゴリズムと計算機アーキテクチャをセットで考え、新規性と進歩性のある、新しいシステムを生み出すことが重要です。

ところが、認識率という観点でのみアルゴリズムを研究されている方々の中で、「それはAIと比べてどうなのか?」という ルールベースアルゴリズムの研究の成果の価値がAIと比較されてて、精度観点だけで駆逐されていった と言うのがあります。

また、ビジネスの観点でも、AIにあらずんば投資対象にあらず と言わんばかりに、AIでないと研究予算が取れなくなり、AI人材でないと就職先が絞られていく という事情変化もありました。

必然的に、多くの学生や研究者が何かしら AI と絡めた研究をこぞってやり始めて現状に至ります。

加えて AI の台頭で、GPUを使った GPGPU計算が台頭してきたため、今まで CPUに勝てればOK であったアーキテクチャ研究が、GPU にも勝たなければいけなくなりました。しかもGPUが得意とするAI分野でです。

正直、私はそこまでAIに拘りも無いのですが、時代がそれを許してくれないので、何とか、世の中の需要を満たす建前も必要です。

拙作の LUT-Network などが生まれてきた背景にもそういう部分は無視できません。

時代の変化に合わせて 8策 をアップデートするが必要があるのかもしれません。

GPU と比較されたときの理論武装が必要です。

  • GPU向けのモデルをそのまま使わない(同じ土俵で戦わない)
  • GPUが持つハードマクロ演算器が役立たない演算を入れる(GPUの苦手を狙う)
  • FPGAのLUTやDSPやBRAMの特性を生かしまくるモデルにする(FPGAの得意を活かす)
  • Sparce性、ヘテロ性など、均一でない計算を作る
  • 演算器へのデータ投入でキャッシュより効率の良いメモリアーキテクチャで差をつける
  • リアルタイム性を活かしたアルゴリズムモデルを考える(リカレント構造など)
  • 他の特殊なデバイスと連携する、RGB以外のデータを扱う
  • 複数のセンサーやタイミングを組み合わせる

などなど、様々な要素を考えてみて欲しいと思います。

FPGA はストリーム処理が得意

FPGA は基本的にストリームデータに対するパイプライン処理が得意です。

カメラからのデータはストリーム的に出てきますし、出力もDVIやHDMIなどにストリーム的にそのまま出力できます。

一方で、ストリームデータは一度メモリに貯めれば、GPU などで並列演算可能であり、メモリに格納された GPU の処理結果をまた ストリームに戻すことができます。

この際に

  • メモリに溜めた遅延が増加する
  • メモリと言う新しいコストと電力が発生する
  • メモリとデータ転送を行うDMAなりの新しいコストと電力が発生する

などの不利が発生します。

しかしながら、先に述べた USBカメラの例の場合、

  • USBのプロトコルスタックや V4L などが画像読み出しの段階で、GPUに便利なフレーム単位にメモリに貯めてしまう
  • 結果を表示するにも OpenGL などの為に GPU と同じようにビデオバッファにデータを並べないといけない

という制約の為に、

  • わざわざ GPU用に並列化されたデータをコストを掛けてFPGA用に再ストリーム化する
  • FPGAの出力ストリームをわざわざフレームバッファに貯めなおして、GPUと同じ結果にした後、実は再度、再ストリーム化されて表示される

という非常にもったいないことになっていたわけです。

これで勝とうとすると、よほど「並列に実行したときでもGPUに非効率な計算列」になってない限り勝てず、とても不利な戦いを求められます。

なので、ストリーム入力&ストリーム出力で、リアルタイム性が重要なFPGAの得意な土俵で戦うべきなのです。

リアルタイム性については、「単にサクサク応答すると気持ちい」と言うだけではなく

  • 今の音を逆位相の音で打ち消すノイズキャンセリングのような信号処理
  • 揺れているドローンを安定させる
  • 転ぶ前に足を出してバランスをとるロボット
  • 新しい情報を瞬時に判断して株の売買をするシステム
  • 絶対に負けないジャンケンゲーム

みたいなものを考えていくと、AIを使う事も生きてきますし、FPGAの強みが出てくるわけです。

おわりに

これまで FPGA 人口ってどんどん高齢化していると思っていたのですが、最近 FPGAやってみたいという若手とお話しさせて頂く機会も増えました。大変ありがたいことです。

一方で「FPGA やってみたけど成果が出ない」という相談も増えるようになってきております。

FPGAは苦労も多く手戻りも大きい為、早い段階で 成果の出る道筋 に軌道を向けることが大事です。

同じようなことで悩んでおられる方、「これからFPGAに触ってみたいという方」に、失敗しないFPGAの始め方 を模索する上でのヒントになれば幸いです。