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

写真拡大

●ディープラーニング専用LSIを開発するスタートアップ企業
Wave Computingは、ディープラーニング用の高性能のLSIを開発しているスタートアップであるが、そのLSIや計算のやり方については公開情報が無く、どのような仕組みであるかは分からなかった。

しかし、4月26-27日に米国サンタクララにて開催された「Machine Learning Developers Conference」において、同社は「Coarse Grain Reconfigurable Array (CGRA)」と呼ぶ方式で処理を行う「Dataflow Computing Unit(DPU)」と呼ぶ高性能LSIを開発していることを発表した。また、DPUを使った開発システムのアーリーアクセスプログラムを開始しており、今年の第4四半期には製品を出荷することも発表した。

この発表資料などを基に、DPUとDPUを使ったディープラーニング用のシステムを見て行こう。

ディープニューラルネットワークは、多数の入力がニューロンに与えられ、ニューロンが計算を行って出力を出し、それを次のニューロンに伝えるというユニットが複合したグラフ構造となっている。Wave Computingの方式は、このグラフをチップ上に作ってしまい、それぞれのニューロンは通常は低電力のスリープ状態で、信号が到来したときだけ動くという非同期型の信号処理を行うという、ある意味では、本当の神経網に近い動きをする。

このProcessing Element(PE)のグループがCoarse Grain(粗い粒度)で、その間の接続をFPGAのように再構成可能にしているので、このアーキテクチャをCoarse Grain Reconfigurable Array(CGRA)と呼んでいる。

次の図に示すように、左上のニューラルネットは、フレームワークで表現すると右上のようなグラフになる。これをハードウェア的に表現すると、右下のように、それぞれのノードの機能はPEのグループで実現され、機能間を接続する矢印のエッジを持つグラフとなる。これを左下の図のようにDPUのPEにマッピングし、チップ内ネットワークで接続してチップ上にグラフを作ってしまう。

C言語などで書かれたプログラムもグラフ表現に変換することができるので、Wave ComputingのDPUは、GPUのディープラーニングシステムのようにCPUを必要とせず、DPUだけで推論や学習を行うシステムを作ることができるという。

1つのDPUチップ、あるいは開発システム内のDPUですべてのネットワークを収容できる場合は良いが、ニューラルネットの規模が大きく、一度に全体を収容できない場合には、部分的にハードウェアにマッピングして計算を行いその結果はメモリに格納し、次は別の部分をマッピングして、必要に応じてメモリから前の計算結果を読み出して、計算するという方法で順に計算を行っていくと思われる。

Wave ComputingのDPUは16K個のPEを1チップに集積し、今回発表した開発システムは、3U筐体に16個のDPUを搭載している。この筐体1台で、8ビット整数のピーク演算性能は2.9PetaOps/sである。これは16個のDPUの性能であるから、DPU 1個あたりでは、181.25TeraOps/sという計算になる。

NVIDIAのP40 GPUの8ビット整数でのピーク演算性能は47TeraOps/sであるので、DPUはP40の4倍弱の性能を持っている。また、DPUはGoogleのTPUと比較しても2倍程度のピーク演算性能となっている。

そして、開発システムは高バンド幅の3D積層DRAMであるHybrid Memory Cube 2を4個使用しており、128GBの容量の高バンド幅メモリが搭載されている。また、2TBのDDR4メモリと32TBのSSDを持ち、16レーンのPCIe3.0ポートを持っている。

なお、開発システムは、最大4筐体の開発システムを接続して、64DPU、11.6PetaOps/sまで拡張することができる。

●DPUの構造を読み解く
次の図はDPUのPEアレイの階層構造を示したものである。DPUの基本素子はPEと呼ぶ処理ユニットであり、PEには命令メモリとデータメモリが付いている。次の階層はクラスタと呼ぶ16個のPEと8個のアリスメティックユニットを含むものである。クラスタは4個のPEからなる4個のクワッドからなり、クワッドの中の4個のPEは密に直結されている。一方、クワッド間は2次元メッシュネットワークで接続されている。

図の左下に示すように、PEは32×32のアレイ上に配置されており、その内部は24個の領域に区分されている。この領域はCompute Machineと呼ばれ、それぞれがAXI4バスとのインタフェースを持っている。このAXIバスを経由して、Compute MachineはメモリやI/Oにアクセスすることができる。

そして、DPUチップは、32×32のPEアレイを16個集積しており、全体では16K個のPEが搭載されている。

次の図はPEの内部構造を示すものである。PEは256語の命令メモリと1KBのデータメモリを持っている。

PEは通常は低電力のアイドル状態になっており、入力の信号が到着すると命令の読出しを行って動作を開始して、処理が終わると出力を出すというデータフロー型の処理を行う。

PEは命令メモリから命令を読み出して実行するが、PEの命令実行には分岐は無く、単純に0番地の命令から順番に実行して行く。ただし、命令にはプレディケートがあり、実行をスキップすることはできるようである。

アリスメティックユニットは、自分のアキュムレータの出力Aと同一クワッドにある他の3つのPEのアキュムレータ(b、c、d)の内の1つを入力として選択して演算を行う。そして、次のサイクル以降に同一クワッド以外のPEからのデータを受け取って演算を行うという方法で、最初の演算と3番目の入力データの転送時間をオーバラップさせることができる。

アリスメティックユニットのクロックは6.7GHzであり、積和演算/クロックとすると、積和演算は2演算であるので、8192個のアリスメティックユニットのピーク演算性能は219.5TeraOps/sとなる。このDPUチップを16個使用すると、3.5PetaOpsという計算になるのであるが、2.9PetaOps/sという発表であるので、なにか完全には連続して演算できない制約があり、それを織り込んだ発表性能値になっていると思われる。

通常、データフローマシンはトークンベースで、トークンが来るまで次の命令は分からないが、DPUは命令ごとのデータフローでなく、その上位の粗い粒度のエージェントへのデータ到着レベルのデータフロー制御であり、エージェントの機能を実現するPE命令のプリフェッチを行うことができ、高バンド幅の命令供給ができる。PEは、通常は低電力のスリープ状態になっているが、データが到着するとエージェント(とそれを実行する何個かのクラスタ)がWake upされて動作を始めるようになっている。

アリスメティックユニットがPEとは別に作られているのは、アリスメティックユニットでの演算とPEでのメモリアクセスを並列に実行できるようにして、性能を向上させるためである。

メモリはパイプラン化したシングルポートメモリで、コンパイラがスケジュールしたスタティックな調停に従ってPEやスイッチがアクセスすることができる。アリスメティックユニットは、パイプライン化されたMAC(Multiply Accumulate)ユニットを持っている。

大規模並列LSIではクロックジッタやクロックスキューがクロックの上限を制限してしまうので、DPUでは、グローバルのクロック分配は行っていない。いわゆるGALS(Globally Asynchronous Locally Synchronous)というクロック方式を使い、ローカルな同期回路でクラスタ間のローカルな通信が正しく行えることを保証している。2012年に作った28nmプロセスのテストチップで10GHzを超えるところまで、回路が安定に動作することを確認しているという。

他のGALSでは通信のためにFIFOを使っているが、Wave ComputingのCGRAの場合、クラスタ間の信号伝送はFIFOなどを使わなくとも6.7GHzで動作するという。

DPUのチップ内ネットワークのバイセクションバンド幅は8.6TB/sとなっており、この回路については別途、発表する予定である。また、全部のPEが同時に命令0を実行するように、ブートストラップするやり方についても今後開示する予定であるという。

●DPUのメモリ階層を読み解く
次の図はDPUチップのメモリ階層を示すもので、16PEのクラスタごとに8KBの命令メモリと16KBのデータメモリがあり、96個のレジスタがある。これは1PEあたりにすると、命令メモリは512B、データメモリは1KB、レジスタは12個である。

そして、メッシュネットワークのスイッチがあり、スイッチの制御を行う1.5KBの命令メモリが付いている。このスイッチからSonicsのAXI4 NOC(Network on Chip)に128bitのバスで繋がっている。AXI4 NOCから4つのHMC 3D積層DRAM、2ポートのDDR4 DRAMが接続され、さらに16レーンのPCIe3.0がでている。

また、AXIバスには、プログラムのロード、ランタイムの再構成、チェックポイントの作成などを行う小規模なホストプロセサと、そのセキュアな命令メモリが付いている。

なお、DPUは、GPUやGoogleのTPUとは異なり、大きなホストプロセサは必要とせず、推論や学習などの処理はDPUだけで実行することができるようになっているという。

アリスメティックユニットは8ビット、16ビット、32ビットの整数演算ができ、一部の64ビット演算もできるようになっている。そして、8ビット演算は2演算を並列に実行できる。当然、ソフトウェアを使えば任意の精度の計算が行えるし、エミュレーションで浮動小数点演算も行える。浮動小数点演算結果の正規化のためにLeading Zero Countの機能をハードウェアで実装している。

ニューラルネットなどをプログラムする場合は、個々のPEレベルでプログラムするのではなく、2Dメッシュに接続される積和演算、非線形の活性化関数などのエージェント群とその接続をWave Computingのツールフローでプログラムする。入力はLLVMを生成できる任意の言語で書くことができる。ほとんどすべてのプログラム言語はデータフローグラフにコンパイルでき、DPUのエージェントをプログラムするのに使えるという。

ツールは、タイミングクリティカルなパスを近くにまとめて配置する。一方、それほどクリティカルでないパスは配置の制約を緩める。このようなコンパイルを行うためには、コンパイラは、計算、通信とメモリアロケーションを把握してPEの位置、変数の格納方法、スイッチネットワークのスケジュールを決めることが必要になる。 Wave Computingのコンパイラは、グラフを効率よくハードウェアにマッピングし、並列に実行できる部分を最大化する。ここが一番難しい部分で、これが出来てしまえば、ランタイムは簡単であるという。

次の図の背景に描かれているのはデータフローグラフで、左の箱の中にはPE0-15の命令が縦に書かれている。この命令が1つのクラスタに含まれる16個のPEに供給される。

細かくて文字は読めないが、オレンジの命令は演算やメモリアクセス命令で、黄色の命令はPE間でデータを転送する命令で、白はNOP命令である。大雑把にいうと、1/6かそれ以下の命令スロットが演算、あるいはメモリアクセス命令である。ということは、この例では、実効の演算性能はピークの10%-15%程度と思われる。

Wave Computingは、5年に渉ってマッピングツールを改良し、人間がやるより良い結果が得られるまで改良してきた。その結果、このツールは理想に近い95%の命令発行スロットを埋めることが出来るようになっているという。

面白いアプローチであるが、ディープラーニングチップは、NVIDIAやGoogleのような大手に加えて、Wave Computingを含めて何社ものスタートアップが開発を行っている激戦区でどこが勝ち残るのかは、まだ、分からない。

(Hisa Ando)