写真提供:マイナビニュース

写真拡大

●ニューラルネット需要を支えるために開発された専用チップ
○GoogleがISCA論文のレビュー版を公開

Google DeepMindのアルファ碁が、トッププロ棋士の韓国の李世乭(イ・セドル) 九段を破ったのは記憶に新しい。事前には李 9段の圧勝という予想であったが、これは半年ほど前に元ヨーロッパチャンピオンとの対局した時の棋譜を見ての予想である。しかし、アルファ碁は半年の間に格段に強くなっていた。

その秘密が、AIの推論の性能を大幅に向上させた、Googleの専用アクセラレータのTensor Processing Unit(TPU)である。TPUを大量に使うことにより、先読みが深くなり、大幅に強くなったと考えられる。

TPUの存在は、2016年5月のGoogle I/Oで明らかにされたが、その詳細は公表されていなかった。そのTPUに関する論文が今年6月のISCA(International Symposium on Computer Architecture)で発表される。ISCAはコンピュータアーキテクチャ関係ではトップレベルの学会である。ということで、正式な発表は6月26日となるが、そのレビュー版の論文がGoogleから公開された。

Googleは色々なサービスにニューラルネットワークを使っており、2013年にニューラルネットの需要を予測したところ、データセンターの処理能力を倍増する必要が出てくるということになり、対策が必要となった。そして、GPUやFPGAなども検討したが、カスタムASICでアクセラレータを作るのがベストということになり、TPUを開発したという。

Googleのデータセンターでは

・MLP(Multi-Layer Perceptron):各層の間が全対全接続
・CNN(Convolutional Neural Network):各層の間の接続は近傍のニューロンだけ
・LSTM(Long and Short Term Memory):入力に前段の層の出力に加えて前の時点の状態を含む

という3種の構造のニューラルネットを使っている。主要なアプリケーションは次の表の6種であり、2016年6月の実績では、MLPの使用が61%、LSTMが29%、CNNが5%、その他のニューラルネットが5%となっている。ニューラルネットというと、画像認識で使われているCNNが頭に浮かぶが、Googleでの使用比率は小さく、CNNだけをターゲットとして考えるのは間違いであるという。

この表のLOCはネットワーク記述の行数(Lines of Code)、Layersは各タイプの層数で、FCは全対全、Convは近傍の信号の畳み込み、Vectorは1次元の時系列データの接続、Poolはある領域の最大値をとるなどの処理を行う層である。Nonlinear Functionは非線形関数のタイプである。Weightsは重みの数で、合計の入力本数と同じである。TPU Ops/Weight Byteは重み1バイトあたりの演算回数、TPU Batch Sizeは一括で計算する入力データの数である。

どのタイプのニューラルネットでも、各ニューロンでは入力に重みを掛けて、それらの和を取るという計算は同じであるが、MLPやLSTMとCNNでは重み1バイトあたりの演算数が大きく異なっている。

演算数の少ないMLPやLSTMでは、重みをメモリから読み出す部分がネックになりやすく、演算数が多いCNNは演算ネックになりやすい。

開発の着手からデータセンターに展開して実用化まで15カ月という短期の開発であったので、できるだけ簡単な構造とすることを心掛け、TPUはPCI Express接続のコプロセサとし、ホストCPUがTPUの命令FIFOに命令を書き込んで、TPUはそれを順次実行するという構造になっている。

●TPUのブロックダイアグラムから仕組みを読み解く
TPUのブロックダイアグラムは、次の図のようになっている。右側の中央が256×256(64K個)の積和演算器からなる行列乗算ユニットであり、上辺に重みを記憶するDDR3 DRAMとDRAMインタフェースがあり、読み出された重みは重みFIFOを介して行列乗算ユニットに供給される。

中央付近にあるユニファイドバッファは24MiBのローカルメモリで、ここに入力をいれて重みと掛け合わせて、アキュムレータで総和を求める。

アキュムレータに格納された結果はユニファイドバッファに書き込まれ、必要に応じてPCI Express経由でホストCPUのメモリに書き戻される。

行列乗算ユニットは左上の角から計算が進んで行くシストリックアレイになっており、そのためのセットアップ回路が付いている。乗算結果の累積は32ビットで行われ、アキュムレータは4K×256個存在する。この値は、後述のルーフラインモデルで、フルの演算性能を発揮するには1350以上の演算強度が必要であるので、これを切り上げて2Kとし、さらにダブルバッファで使うことを考えて4Kエントリとなっているという。

次の図はTPUダイのフロアプランである。24MiBのユニファイドバッファが29%、行列乗算ユニットが24%を占め、この2つで半分を超える。そして、4MiBのアキュムレータの6%を加えると約6割の面積が主要データパスで占められている。一方、コントロールは2%で、CPUなどと比べると簡素なコントロールになっている。

ホストCPUからの命令はCISC命令で、典型的な命令の実行には10〜20サイクルを必要とする。主要な命令としては、

・Read Host Memory
・Read Weights
・Matrix Multiply/Convolute
・Activate
・Write Host Memory

がある。ActivateはNormalize/Poolユニットを使って、ReLUやSigmoidなどの非線形関数を適用したり、プーリングを適用したりする命令である。

この論文で性能の比較を行っているのは、次の表の3つのシステムである。CPUもGPUも、現在ではより新しい製品が出ているが、TPUが完成した2015年の同世代の製品同士で比較を行っている。

TPUのチップサイズは書かれていないが、Haswellの半分より小さいと書かれており、最大で331mm2で、まあ、300mm2程度ではないかと思われる。

この表の左半分は、1チップあたりの比較で、8ビット整数演算ではTPUはXeonの35.4倍の性能となっている。また、K80は8ビット整数演算を持っていないので、32ビット浮動小数点演算との比較であるが、TPUは32.9倍のピーク演算性能となっている。

実測の消費電力では、ビジー状態で、CPUシステムは455W、GPUシステムは991W、TPUシステムは384Wとなっている。

なお、NVIDIAのMaxwell GPUは、この時期に存在しており、これを使えばより高い性能が得られるという指摘があり得るが、Maxwell GPUはサーバ用のECC機能をもった製品が無くGoogleのデータセンターには採用できないので、この比較には含めていない。

●ルーフラインモデルからTPUの性能を読み解く
次の図は、HPCの世界ではよく使われるルーフ(屋根)ラインモデルをニューラルネット向きに改造したもので、縦軸はTOps/s性能で、横軸はOps/Weight Byteで表わした演算強度である。演算強度は、メモリからの1バイトの読み込みで何演算できるかという値で、演算強度が高い領域では、縦軸方向はプロセサのピーク演算性能で屋根の高さが制限される。一方、演算強度が小さい領域ではメモリバンド幅が律速になり、屋根は、演算強度に比例した右上がりの直線となる。

そして、マークがついているのが、6種のアプリケーションの位置である。CNN0とCNN1は演算強度が大きく、プロセサの演算性能ネックの領域にあるが、それ以外のアプリケーションは演算強度が小さく、メモリバンド幅ネックの領域に入る。

そして、CNN1以外は、プロセサの演算性能とメモリバンド幅制限とほぼ一致した性能が得られている。CNN1の性能が屋根より低いのは、重みの値の到着が遅く、半分程度の行列演算器が重みの到着待ちで演算を開始できない時間が発生しているからであるという。

処理のレーテンシは、次の表のようにInference/s性能に影響する。Haswell CPUシステムでは21.3msのレスポンス時間を許容すれば13,194推論/秒の最大性能を出せるが、7ms以内に99%のレスポンスという条件では最大性能の42%の性能しか得られない。

また、K80 GPUシステムでは8.3msのレスポンスタイムを許容すれば36,461推論/秒の最大性能を出せるが、7ms以内に99%のレスポンスという条件では37%の性能しか出せない。

これはキャッシュやOut-of-Order実行など条件が良ければ短時間で処理ができる機構を導入したり、GPUのように多数スレッドの並列実行でレーテンシよりもスループットを優先する機構を使っていると、平均的な性能は高くても、キャッシュミスやGPUメモリアクセスのリプレイの発生などで処理時間が遅くなってしまうことがあるからである。

一方、TPUは複雑な加速機構は使わず、単純な制御を行っているので、10㎳の最大性能の280,000推論/秒に対して、7msのレスポンスという条件でも80%の225,000推論/秒の性能が得られている。

なお、7ms以内に99%のレスポンスという応答時間の基準は、応答時間が長くなるにつれてサービスの利用度が下がることから、Googleが自主的に決めたものである。

次の図はHaswellのルーフラインである。Haswellは、演算性能に比べてメモリバンド幅が大きく、13以上の演算強度があれば演算性能ネックになるが、多くのアプリケーションが屋根よりもかなり低い値に留まっているのと、ピーク演算性能の屋根自体が低いことから、LSTM0で1.1TOps/sになっている以外のアプリケーションでは1TOps/sに届いていない。また、屋根よりも値が低いのは処理のレーテンシが長く、レスポンスが遅いことが影響している。

また、次の図はK80 GPUのルーフラインである。Haswellの図と同様に、多くのアプリケーションで、屋根よりもかなり低い値しか出ていない。

次の図は性能のまとめで、他のシステムに対する性能比率を棒グラフで表わしている。6本の棒グラフからなるグループが4グループあるが、各グループはGPU/CPU、TPU/CPU、TPU/GPU、TPU'/CPU、TPU'/GPUの性能比を表している。ここでTPU'は性能改善効果が最も大きい重みDRAMを、K80 GPUと同じGDDR5 DRAM化したという想定のTPUである。

左側の2つのグループのグラフは制御用のXeon CPUの消費電力を含んだTotal Perf/Wattで、右側の2つのグループはサーバ本体の電力は含まず、アクセラレータだけのIncremental Perf/Wattである。

GMと書かれたグループは、6種のアプリケーションの幾何平均、WMと書かれた右側のグループは、最初に示したGoogleでの使用頻度を考慮した幾何平均である。

この結果から、アクセラレータ単体の比較では、TPUはCPUの83倍の性能/電力、GPUの29倍の性能/電力を持つことが分かる。また、重みメモリをGDDR5に替えると、性能比は196倍と68倍とおおよそ倍増する。

CPUの購入価格は機密情報で開示できないが、データセンターの建設、運営を含めたTCO(Total Cost of Ownership)は、おおよそ、消費電力に比例することが知られており、Perf/WはPerf/$に比例する。ということは、K80 GPUを使う場合と比べて、TPUを使えば1/29の費用で同じサービスを提供できることになり、TPUの開発費を考えても、トータルでは得になるというのは理解できる。

なお、この性能比較は、Googleのデータセンターのニューラルネットアプリケーションとその実行比率に基づいており、例えば、CNNが主要なアプリケーションである場合は、トレードオフが変わってくる可能性がある。

また、TPUは密行列の積を想定しており、MLPでは良いが、疎行列のCNNではムダな0を掛けるという計算を多く実行してしまっている。疎行列の扱いをどうするかは、次世代のTPUの開発で考えるべき項目であるという。また、メモリバンド幅リミットになっているケースも多く、GDDR5 DRAMやHBM2の採用なども視野に入っていると考えられる。

(Hisa Ando)