パラメータが多くの最適化を必要とする小さなニューラルネットワークを開発しているため、多くの処理時間がかかります。スクリプトのプロファイリングを行っcProfile
たところ、プロセッサ時間の 80% を占めるのは NumPydot
関数であり、残りは関数を使用した行列反転numpy.linalg.solve
です。私の現在のバージョンの numpy は を使用しblas
てnumpy.core._dotblas.dot
います。つまり、 が合計処理時間の 80% を占める関数として表示されるためです。
これは私のニューラル ネットワークのコアであり、これを何度も実行する必要があるため、わずかな速度の向上で何度も繰り返されるパラメーターの最適化にかかる時間を大幅に節約できます。
精度の向上: 行列の乗算は、最小 100*100 から最大 500*500 の形状を持つ行列で行われます。私は 12 コアのコンピューターを持っており、これまでそれらを使用してさまざまなニューラル ネットワーク パラメーターの最適化を並行して実行していましたが、行列の乗算は並行して実行できるのでしょうか?
お時間をいただきありがとうございます!
答え:
ライブラリのアンインストールのテストとインストールに数日を費やしました...テストした結果は次のとおりです。デフォルトでは、私のバージョンのUbuntu(12.04)とレポジトリにインストールされたNumpyのバージョンでは、BLASライブラリはATLASライブラリです。私が興味を持っている計算の改善を具体的に反映するいくつかのテストを行ったので、これらの結果は最終的な答えとして解釈されるべきではありません. これらの計算には、500*500 および 1000*1000 の行列を使用した 55000 回の反復ループでの行列乗算 (内積) が含まれます。12 コアの Xeon X5675 @ 3.07GHZ を搭載した HP Z800 ワークステーションを使用しています。すべての結果 (パーセンテージ) は、記述された条件と、パッケージ化された ATLAS ライブラリであるリファレンスとの比較です。
Scipy.sparse module
: 正しく設定したかどうかはわかりませんが、10% のスパース性で、このモジュールを使用すると、OpenBLAS と MKL で 1500*1500 行列から始めると便利になります。それらを適切に使用する方法について提案があれば、私は興味があります!- OpenBlas を使用すると、500*500 行列では 33% の速度向上が得られますが、1000*1000 では 160% の速度向上が得られます。しかし、OpenBLAS を使用すると、scipy.sparse モジュールのパフォーマンスは向上しませんが、実際には低下します。
- ここでの最大の勝者は MKL ライブラリです。元の ATLAS ライブラリの 1000*1000 行列を使用すると、加速は最大 230% になります! 500*500 行列の場合、加速はより控えめ (100%) ですが、それでも非常に良好です。さらに、OpenMP を使用したコンパイルにより、行列乗算は私の 12 個のプロセッサで実行でき、MKL ライブラリを使用した 1 個のプロセッサよりも 2 倍高速です。しかし、それは処理能力の浪費です。マルチプロセッシング モジュールを使用して、スクリプト/行列乗算を並行して実行する方がはるかに効率的です。