実験と実用の乖離

以前、強化学習効率化のために自分の時間リソースを消費して、パフォーマンスの向上を図った。
nnt339es.hatenablog.com

実験結果によると、純 Python ならば 400ms かかる処理を 30ms で処理できるはずだ。

ところが実際のアプリケーションに導入してみると、体感 1.5 倍~2.0 倍程度しか出ない。(時間がかかる実験なので正確な実験はまだ行っていない)

実験と実用で異なるのはネットワークの大きさだ。
実験は1桁オーダーであるのに対して、実用ネットワークは 1000x100 の行列を扱う。

double 型で 8Bytes だから、データサイズは 8\times10^5Bytes となる。

自マシンの L1 キャッシュは 128kB だから、L1 キャッシュにはデータが乗り切らない。したがって、計算中にメモリアクセスが発生してパフォーマンスが低下すると予想される。

この仮説を裏付けるには、ネットワーク構造を大きくしていってパフォーマンスが低下する行列の大きさを調べればよい。#ToDo

今回行列計算にはライブラリを通して BLAS を利用している。
しかし、OpenMP を利用して余っている計算リソースを全てつぎ込んで行列演算を実装したほうがもしかしたら速くなるかもしれない。
それを確かめるために、Eigen と自作 OpenMP 行列演算プログラムの実行時間、あるいは FLOPS を比較する実験を行う必要がある。#ToDo

あるいは学習過程を並列化できるならば演算はコア1で行っても問題ないのだが、残念ながらそのような手法はまだ思いついていない。

以上、実験と実用の乖離に対する考察と ToDo リストでした。