はじめに
昨今、深層学習を中心に例えば画像認識を行うにしても大量の演算能力を投入して、高度な結果を得ようとするものが増えました。
しかしながら、同期デジタル回路による計算機が持つ演算能力には上限があり、演算器数×周波数以上の時間当たりの演算はできません。 また、LSIの中に集積されるトランジスタの数は半導体プロセスと面積、要するにコストで決まる有限のものです。
したがって、計算効率に関しては、如何にLSI内のトランジスタを無駄なく演算器に割り当てて、かつ、その演算器を休ませずに稼働させるか、という問題になってきます。これは計算機アーキテクチャの工夫で変わってきますのでどのような計算機を設計するべきか頭を捻る価値の高い分野です。 これは何もLSI設計者だけの話だけではなく、CPU/GPU/FPGAプログラミングでも使っているチップのトランジスタを如何に高稼働させるか考える点では共通だと思っています(そもそも私LSI開発したことあるとは言い難いですしw)。
そしてスループット性能(時間当たりにどれだけ大量の計算ができるか)は、演算器の稼働率だけで決まるのですが、一方で、同じデバイス条件で同じ演算量をこなす場合でも、リアルタイム性すなわち低遅延性(低レイテンシ)という点においては、少しだけ条件が変わってきます。 極論をいうと最高性能のでる計算機で、意味もなくリングバッファに一定時間溜めてから出力するような仕組みを加えるだけで、演算量(スループット)を変えることなく遅延(レイテンシ)だけを大きく悪化させることもできてしまいます。
では同じだけの演算量を認識処理に投入できる中で最も低遅延なアーキテクチャとは何なのか?という、疑問が浮かんできます。
今日の記事はその点にフォーカスしてみたいと思います。
汎用計算機の繰り返し適用と専用計算器パイプライン
以前このあたりのブログで描いた絵を再掲しておきます。
なるべくシンプルに演算能力が同じでも計算機アーキテクチャ次第でレイテンシが小さくなる例を示したいと思います。 対象は画像処理とし、カメラの入力画像に対して、その計算機で出来る最高の演算をリアルタイムに適用することとします(例えばFPGAなら、内蔵するDSPを常に全部使っている状態を想像してください)。
まず、汎用計算機を繰り返し適用する例を考えます。

例えば、LSI内のすべての演算能力を投入して、入力データ帯域のN倍の帯域を持つ汎用演算器を用意すれば、同じ汎用演算器を繰り返し利用して、1フレームの間にN種類の処理を逐次的に処理できます。 この時、基本的にはある処理がすべて終わってから次の処理が起動されますので、前の処理の結果は一度すべてメモリに書き出されます。
ここで、同じくLSI内のすべての演算能力を投入するパイプライン型の専用計算機を考えます。

ここでは、入力データ帯域と同じ帯域でデータを処理するように各処理専用の計算ユニットをN種類用意して、それぞれにLSI内の演算リソースを分割して割り当てます。
そして各計算ユニットは計算が終わった端から次の演算器にパイプライン的にオンザフライで直接的にデータを渡していきます。
こちらもLSI内にある計算資源は100%駆動されますので、演算量は汎用演算器方式と変わりません。
入ってきたデータをメモリに溜めることなく、新しいデータが入ってくる度にできる計算をどんどんやっていこうという貪欲なアルゴリズムで、とにかく今入ってきたデータで、今出力できる最善を出力し続けようという試みです。
同じ演算量であっても、レイテンシが減らせる場合があるというのは、理解いただけるのではないかと思います。
そうは言ってもできない計算もあるよね
もちろん、これは理想論で、例えば「画像の各ピクセル値の平均と分散を求めてから画像のコントラストを調整する」ような処理であれば、まず画像全体のデータがないと処理ができません。汎用計算機であれば、メモリを2回走査して、1回目で平均と分散を求め、2回目で各ピクセル値を補正するでしょう。
一方で、パイプライン型の計算機だと、例えばカメラからの画像は左上のピクセルから順に計算ユニットに入ってきます。

この時、あるピクセルが入力されたとき、普通に考えるとまだ、オレンジの部分の情報しかないため、水色の部分の情報を待たないと今入ってきたピクセルのコントラスト補正はできません。
しかしリアルタイム計算機における画像処理とは基本的にカメラ動画に対するリアルタイム計算ですので、1フレーム前の情報でよければ水色の部分の情報がすでにあります。 この時、ローリングシャッターカメラを想定すると、そもそもラインごとに時間経過しているわけですから、どのピクセルが来た時も同じ条件で1フレーム時間内の全ピクセル空間の情報にアクセスできるという事になります(わかりやすくローリングシャッターの例を書きましたが、グローバルシャッターでも本質は同じです)。

これは情報が時刻を持っており、古くなるほど情報の価値が下がる という事を念頭に置いて、価値を最大化するアルゴリズムを考えて出力する という視点に立てば、至極まっとうな考え方であり、フレームの最後まで待って処理をするというアルゴリズムが必ずしも最適でない という点に踏み込めばアルゴリズム変形で解決される場合があります。
(もちろん「フレームの途中でコントラストが変わったらどうするんだ!」という意見も出てくるわけですが、「そもそもローリング歪みに目をつぶってる件は?」という反論もあるわけでして。)
もちろんどんな場合でも解決できるとは言いませんが、従来のアルゴリズムを単に高速に実行するだけではなく、計算中に経過する時間も加味してより最適なアルゴリズムを再考する という事は重要だと思っています。
なお、フレームレートを速くすればするほど、前のフレームを使った場合の誤差は低減していきますので、対象とする実世界のダイナミクスやデバイスとセットでアルゴリズムを考える ということも重要です。
特に深層学習において、このような考え方でネットワーク構造などの学習モデルを作る ということはあまりなされていない気がしており、まだまだ発展の余地がありそうに思います。
レイテンシ以外のパイプライン方式の利点
それ以外の利点として思いつくものをいくつか挙げておきます。
リソース効率がよい
これは各計算ユニットで、それぞれの処理専用に計算機を作れますので、汎用化するコストが減ります。単純に比率としてより多くのトランジスタを計算に割り振れます。こちらで発表した内容とかみたいな話です。
ヘテロジニアスな計算ができる
汎用計算機の場合、例えば INT8 で計算機を作って 深層学習の各レイヤーを逐次処理させるなどという事を行うわけですが、パイプライン方式であれば、1層目はINT8 で、2層目はINT5 で、3層目は INT11 で、みたいなこともできてしまうわけです。
メモリが削減できる
パイプライン方式の利点として、計算ユニット同士がメモリを介さずに直結できる可能性を有しておりますので、メモリそのものが不要になる場合すらあると思います。これはコストや電力にも効いてきます。
結局はアルゴリズム
結局のところ計算機アーキテクチャを考える際には、アルゴリズムをどうするか(深層学習の場合モデルをどうするか)かと思います。
その時に、デバイスの性能を引き出すためのアルゴリズムを考えたり、逆にアルゴリズムを成立させるためにデバイス側に工夫を加えたり、計算機アーキテクチャやデバイス特性まで考えてアルゴリズムを改善していき、それに合わせたシステムを作ってしまうという事が大事なのだと思います。
CPU/GPU で出来るアルゴリズムを前提に勝負をしてしまうと、「NVIDIAを〇〇万枚買える組織」が最強という事になってしまい、アルゴリズムの工夫で勝つ ということがやりにくくなってしまうと思っています。これはとてももったいないことです。
なぜこのようなアルゴリズムに踏み込む人が少ないかというのを考察すると、このようなアルゴリズムをやるには例えば RTLプログラミングのような
が必要であり、さらに悪いことにこれらにしばし HDL(ハードウェア記述言語)という名前がついているせいで、ソフトウェアプログラミングではないという誤解というか、壁を作っている点にある気もします(このあたりは私の被害妄想かもしれませんがw)。
あと、「手軽にそういうことができるカメラとFPGAのセットがない」というのは、まあ間違いなくあるので、こちらのような妄想プロジェクトを進めていたりするわけですが。
おわりに
例によって最後に「FPGAいいよ」という話ですが、このようなアルゴリズムと計算機アーキテクチャとデバイス制御を手っ取り早くむずびつけて、今までなかったものを探索するのにFPGAはお手軽でとてもいいデバイスだと思うわけです。
みんなでやろうFPGAプログラミング!(笑)
おまけ
私の経験上、今あるアーキテクチャで出てる性能維持したまま、リアルタイム性だけ後付けしようとしてもほとんど成功例を見たことがありません。

一方で、FPGA などで出来る超リアルタイムアルゴリズムを順に高度化していくのは案外前に進みますし、従来と全く異なる形でゴールにたどり着けたりもします。 ようするに What は同じでも How を変えないとゴールにたどり着けない気がするのですよね。 特にSOTAなAIは、「すごい精度出すHowを見つけたよ!」という論文ばかりなので、リアルタイム化を考えるときは、参考にはしても鵜呑みにしてはいけない気がしています。
一方で、視点を変えて、別の場所からゴールを目指すアプローチは、前人未踏感があって楽しいですよ。LUT-Net (BinaryBrain) もそうやって生まれました。
