マサチューセッツ工科大学(MIT)などの研究チームは、ビッグデータや機械学習などの分野で多用されているテンソル代数の計算操作を効率化するためのプログラミングコードの自動生成システムを開発したと発表した。テンソル代数の操作は計算に時間がかかるため、高速化のためにプログラマーが手書きした複雑なコードが使われてきたが、この作業を自動化できる可能性があるという。

0の値を多く含む多次元の疎データ配列の計算を自動で高速化できるシステムを開発した(出所:MIT)

近年さまざまな分野で「ビッグデータ」の利用が進められるようになってきているが、ビッグデータというものの中身は、実際にはデータのほとんどの部分に0が並んだスカスカの状態であることが多い。たとえば、Amazonの全商品に対して、ある特定のユーザーの購入履歴をデータ化して表形式で表すことを考える。購入したことがある商品には「1」、購入したことのない商品には「0」の値を与えるとすると、この表のほとんどの部分は0で占められることになる。

このように構成要素のほとんどの値が0で占められるようなスカスカのデータは「疎データ」と呼ばれる。疎データを利用する場合、解析アルゴリズムは0を含む大量の加算、積算に費やされることになるが、0に何をかけても0であるし、何かの数値に0を足しても元の数値は変化しないので、こうした処理を1個1個そのまま実行するのは計算資源の無駄使いということになる。

そこでプログラマーは、なるべく0の入力・計算をしなくても済むようなコードを書いて、計算時間を短縮することを考える。しかし、こうしたコードは複雑であり、個別の限られた範囲の問題にしか適用できない場合が多い。

また、ビッグデータや機械学習分野では、行列やテンソルなどの計算が多用されるようになっているが、これも計算を効率よく行うにはさまざまなソフト上の工夫が必要で、コードを書くのに人手が使われている部分である。

従来、テンソル代数を扱うときには、数学ソフトでテンソル操作をその構成要素に分けて処理する方法をとってきた。たとえば、1番目と2番目のテンソルを積算して、その結果に3番目のテンソルを加えるといった操作を行う場合には、ソフトウェアはまず積算用の標準ルーチンを実行して最初の2つのテンソルを積算し、その結果を保存する。そして、次に加算の標準ルーチンを実行して積算結果に3番目のテンソルを加える、というように働く。

しかし、巨大なデータセットを扱うようになるにつれ、このようにいちいち計算ルーチンを呼び出したり、途中の計算結果をメモリに保存したり読み出したりといった処理に非常に長い時間がかかるようになってきた。

そのため、テンソル代数の操作をテンプレート化した一種の「カーネル」を作ることで計算を効率化するようになっていくわけだが、このカーネルの作成もまた面倒な作業になる。テンソル代数の操作の違いによって、カーネルも異なるものが必要であり、しかもカーネルの数は可能性としては無限にあるためである。

たとえば、3個のテンソルを加える操作と4個のカーネルを加える操作ではカーネルが異なるし、3次元のテンソル3個同士を加える操作と4次元のテンソル3個同士を加える操作でもやはりカーネルが異なるといった具合である。したがって、これらのカーネルの作成作業も、すべて人間のプログラマーが行うとすると大きなコストになってくる。

今回提案されたシステムは、疎データの処理やカーネル作成に相当するコード生成作業を自動化するというものである。テンソル代数コンパイラ(tensor algebra compiler)の頭文字をとって「Taco」と名づけられている。自動生成したコードによって、最適化される前の既存のソフトウェア・パッケージよりも計算速度を約100倍向上することができるとする。特定の疎データの操作のために人間のプログラマーが細心の注意を払って書いたコードと比べても遜色ない性能を示すという。

また、Tacoでは、疎テンソル中の0でない値だけをインデックスして保存する仕組みも使われている。Amazonがディープラーニング向けオープンソースとして公開しているカスタマーIDと購入品、評価コメントなどのデータのテンソルは107エクサバイト(Googleの保有する全サーバ容量のおよそ10倍)という大きなデータ量があるが、Tacoの疎データ圧縮スキームを使用すると、これを13GBまで軽くできるという。