(AI)のアクセラレータとしてFPGAを活用する動きがある。CPUやGPUに加えて、FPGAが人工知能に活用されるのだろうか。Array)」というものがある。何かに付けてハードウェア業界では「FPGAで......」などという説明をするのだが、FPGAなどというものに親しみのない業界の外からすると何か煙に巻かれているような気がするようだ。ところが、ハードウェア業界の内部では、「FPGAで......」などという説明で、みんな腑に落ちたような気持ちになる。それは業界内で普段からFPGAに慣れ親しんでいて、FPGAで何ができて、値段がどのくらいで、どういう用途に向いているか、といった大ざっぱな把握が共有されているからに違いない。そんなFPGAに、最近、ハードウェアに携わるわけではないのだけれど、何か引っ掛かりを持ってしまう人が増えているように見える。大流行の人工知能分野がきっかけの1つになっていることは間違いない。「FPGAが人工知能のアクセラレータになる」などと言われて、「どういう仕組み?」と疑問を持たれるようだ。今回は、FPGAで何をどうしたら人工知能になるのかという話を、主にFPGAの現物を触ったことがない人向けに短くまとめてみたい。人工知能に必要な計算とは最初に「人工知能(AI)」というかなり曖昧な言葉を具体的な計算イメージにまで落とすことにする。AIという言葉に含まれる分野は茫漠(ぼうばく)と広い。Network:ディープニューラルネットワーク)分野に絞られる。このごろ流行しているAIは、ほぼこれと断言してもいいくらいだ。ニューラルネットワークという言葉を聞いたことがない人はいないだろうが、ここにもギャップがある。「機械が学習して自ら認識するようになる」、あるいは、「脳のニューロン的な」という説明を真に受けて、「とても複雑なものだろう」と漠然と認識している人も多いように思われる。実際にニューラルネットワークの計算をやったことがある人は、単純な計算、掛け算と足し算の膨大な繰り返しであることを身に染みて知っているだろう。そんな単純な計算でなぜ認識ができるのかという深淵な問題を深掘りすることは、ここではしない。ここで押さえておきたいのは以下の2つだ。DNNの「Deep=深い」というのは2層ではなく、3層以上(現在の多くのDNN応用事例は数十層以上)のレイヤーと呼ばれる計算構造の積み重なりである、ということ。それらレイヤーの中心となるのは、コンボリューションレイヤーとか全結合レイヤーと呼ばれるものだが、これらはどちらも掛け算と足し算(ただし回数は膨大になる)だけで計算できるということだ。Layer:入力データを扱いやすい形にするために情報を圧縮する層)など各種のレイヤーがあるが、どのレイヤーも計算している処理内容は単純である。DNN系ではトップとかボトムとかいう言葉で層の順序を呼ぶことが多いのでそれに従えば、何らかの入力、画像などはボトムから入って各レイヤーで計算処理されてトップに向かっていく。最後の層を通り抜けると、識別の結果が確率として得られるようにすることが多い。単純に言ってしまえば、入力データと係数を掛けて足し込むという計算をするレイヤーを、何十枚か重ねていけば人工知能のご託宣が得られるのだ。局所的な計算領域の大きさをどのくらいにするか、何個飛ばしにするか、画像の端に外枠を付けて、はみ出しても計算できるようにするか、など同じレイヤーでもパラメーターは多数ある。どのようなパラメーターのどのようなレイヤーをどのような順番で何枚重ねていくのか、ここが腕の見せどころであり、日々改良されていると言ってよいだろう。単純化してしまえば、そういうレイヤー構造の内部の掛け算と足し算を高速に処理できれば人工知能を「アクセラレート」できるわけである。実際、AI分野にGPUを使う場合はそのような計算をしているわけだ。上位のGPUでは3000個を超えるコアを持っているから、条件が整えばそれだけの数の掛け算足し算を並列に計算できる。数千個もの計算コアで十分かといえば、それで満足していないのが現代のAI応用だ。専用半導体チップだとダメな理由もっと速くしたい。それはハードウェアで自然にできることが自明なのだ。掛け算と足し算の繰り返しに尽きる。それこそ必要な数だけ乗算器と加算器(積和演算器)を並べてやればよい。あるレイヤー構造をそのままハードウェアに置き換えてしまえば、全てが並行に計算され、究極的な速さを得られることになる。専用ハードウェア化には大きな問題がある。主として経済的な理由である。昔はトランジスタやTTLをハンダ付けして回路を作っていたが、現代におけるある程度以上のデジタルハードウェアは半導体チップの上に実現される。特定の回路は、半導体上の物理的なセルとその配線により実現されるわけだ。半導体工場に「注文」して物を作ってもらわなければならない。半導体チップは大量(数万個といった単位は半導体ではごく少量であることに注意しよう)に作れば、1個1個の価格は安くなるが、初期費用は大きい。一声数億円といった費用が普通に必要になる。その上、たった1カ所を設計変更しようとした場合にも相当な費用と時間がかかることにも注意しなければならない。ところがDNNのネットワークの設計というのは、いろいろとパラメーターなどを修正したい、改良したいというモチベーションに取りつかれているのだ。枯れた設計でない限り専用半導体チップを作るというのはリスクが大きい。FPGAが人工知能アクセラレータになるこれを解決し、専用半導体チップに近いような回路を実現する方法こそ、FPGAなのである。FPGAは「プログラム可能な半導体」といわれるが、これも単純化してしまえば、いろいろな基本回路に「なり得る」汎用(はんよう)部品多数と、部品間の所望の配線を実現できるような配線スイッチが多数からなるチップである。近代的なFPGAでは、掛け算器やメモリなども内蔵しており、掛け算と足し算の繰り返し構造などは、容易に実現できる。ちなみにFPGAのプログラミングには、「VHDL」とか「Verilog」といった論理設計用の言語を使用することが多い。そのような言語のソースを見るとパッと見は、少々古めかしい「begin」「end」などありPascal系っぽい言語に見える。基本全ての代入は同時に起きてしまう。上から下に順序を付けて実行されていく普通のソフトウェア言語とは違うのだ。ハードウェアなのでそれが自然であり、また、そうだから高速化できるわけだ。大昔からハードウェア屋は、電源を入れれば、全ての部品が動作し続ける建前で回路を作ってきたが、どうしてもソフトウェア屋は、1行1行ステップを追って処理が実行される意識が強い。そこのギャップさえ乗り越えれば、計算処理の本質にはハードウェアもソフトウェアも変わりはない。計算構造をFPGA用に「コンパイル」すれば、汎用品として通販でも売られているFPGA上で動作する所望の専用回路が実現できる。PCIeのカードスロットに差し込める汎用FPGAボードも多数売られているから、そのようなボード上のFPGA向けに回路をコンパイルすれば、「専用アクセラレータボードが一丁上がり」といった具合だ。工場に多額の初期費用を払わなくてもよく、作業といえばPCの上で「コンパイル」するだけである。遠くから見ていたらソフトウェアを作るのと見分けがつかない。そんなFPGAにもネックはある。昔に比べたらFPGAの価格は劇的に下がり、また集積度の向上も著しい。比較的規模の小さいものでは数千円程度で、量産対応可能なものも増えた。それでもAI向けのアクセラレータにできるような規模のFPGAの価格となると、ウン十万円以上、百万といった価格もあり得る。価格だけであれば、サーバ向けの高性能CPUや、最新のGPUもウン十万する機種はゴロゴロしてはいる。量産されている最新CPUやGPUの回路規模と比べてしまうとFPGA上で実現できる回路規模は一桁くらい小さくなる。回路規模は小さいけれども、回路の専用化で大きなメリットが出せる、という設計にしないとCPUやGPU上でのソフトウェア実装に打ち勝てないわけである。数々のギャップはあるものの、それらを埋める努力がある程度功を奏しつつあるようにも見える。少なからぬ組織がFPGAをAI向けのアクセラレータとして採用しているからだ。ソフトウェアエンジニアが、ハードウェアも勉強しているというケースも増えているようにも感じられる。流れとしては悪くない。実際、FPGAがAI処理の本流に入れるか否かは、純粋に経済的な問題やコスト対効果に尽きるのではないだろうか。何でやろうと、結局やらなければならない計算は一緒なのだから......。Izumida日本では数少ないx86プロセッサのアーキテクト。某米国半導体メーカーで8bitと16bitの、日本のベンチャー企業でx86互換プロセッサの設計に従事する。マルチコアプロセッサを中心とした開発を行っている。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。