【数値計算】深層学習に用いるプログラミング言語とフレームワーク

昨年から,深層学習の応用研究を始めました.深層学習は数年前から非常に注目を集めており,プログラミングを簡単化するための「フレームワーク」と呼ばれるライブラリがオープンソースで公開されています.Googleの開発したTensorflow,UC Berkeleyの開発したCaffeといったものの他,日本の会社が開発したChainerも特に日本国内では人気があるそうです.私もChainerの他,TensorflowとそのwrapperであるKerasを最近用い始めましたが,特にKerasは使いやすさが際立っているように思いました.

 

これらのフレームワークの多くに共通する特徴として,Python上に実装されていることが挙げられます.Pythonはインタプリタ言語と呼ばれる種類のプログラミング言語で,プログラムコードが書きやすい一方で,FortranやC++といった言語に比べてそのままでは計算速度が比較にならないほど遅く,高性能計算分野では一般に使われていませんでした.しかし,深層学習は応用先によっては非常に大きな規模の計算を高速に行う必要があるにも関わらず,上記のように数多くのフレームワークにはPythonが用いられており,実用的にもそうしたフレームワークが多く用いられています.

 

PythonとPython上のフレームワークを計算に用いることについては,そのままでは計算速度の遅いPythonも,行列積などの計算負荷の高い部分をIntel MKLやcudNNといった高速な計算ライブラリに任せることで高速化できるようになっていることが大きいと考えます.Pythonを使った科学計算ではほぼ必須となっているnumpyや,深層学習の各種フレームワークは計算にそれらのライブラリを用いており,高いレベルで最適化された計算を意識することなく利用することができます.したがって,プログラミングの際はデータの管理やプロセス制御といった,計算以外のタスクのコーディングが主になり,この時にはPythonの書きやすさが活かされます.

 

このような,ライブラリを用いた計算の高速化とコーディングの容易性は,プログラム全体の開発速度を向上させます.開発速度の向上というメリットは多くの科学計算に当てはまることですが,特に深層学習にはこのメリットが効いてくるものと考えられます.これは,深層学習ではモデル内部の適切なネットワーク形状や各種パラメタの適切な値を試行錯誤的に探していくため(モデル内部のパラメタの学習という意味ではなく,ハイパーパラメタの試行錯誤を意味しています),計算結果を確認しながら何度もプログラムコードを修正する必要があるからです.Fortran等による高度に最適化されたコードに比べて実行時の計算速度が多少落ちても,コード修正の都度に計算部の実装の最適化やプロセス制御の変更のために多くの時間を割かないことは,プロジェクト全体で見た時に時間の短縮幅が大きくなります.

 

Intel MKLやCUDA上のライブラリを用いたPythonでの計算は,使用した限りでは少なくとも単一のCPU/GPU利用時は高い演算効率を出しており,少ないコストで高性能計算の恩恵を受けられているように感じます.こうしたコーディングでは,Pythonはほとんどインターフェースとして用いられているような印象ですが,ライブラリの利用は「車輪の再設計を行わない」という視点からも推奨されており,コンピュータ工学の研究者の方からも高性能計算の一つの方向性であると伺いました.高性能計算を応用して問題を解くという立場であれば,Pythonを有用なインターフェースとして用いながら主要な計算を既存の高速ライブラリに担当させる,というコーディングモデルは深層学習に限らず有用であるように思います(もちろん,車輪の最適性を疑うという立場から,ライブラリを用いずに一からの実装を検討する研究もまた,非常に重要であると考えます.)

2017年04月18日