私は小さなニューラルネットワークを開発しています。そのパラメータは多くの最適化を必要とするため、処理時間が長くなります。私はcProfile
でスクリプトをプロファイリングしており、プロセッサ時間の80%がNumPy dot
関数であり、残りは関数numpy.linalg.solve
の行列逆行列です。 現在のバージョンのnumpyはblas
を使用しています。すなわち、numpy.core._dotblas.dot
が処理の合計時間の80%を占める関数として現れているようです。Pythonで行列乗算を高速化する方法は?
これは神経ネットワークの中核であり、これを多く実行しなければならないので、マイナーなスピード・ゲインは、多数の繰り返しパラメータの最適化に多くの時間を節約することができます。
さらに精度を上げます:行列の乗算は、最小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ライブラリを使用するプロセッサの2倍の高速化が可能です。しかし、それは処理能力の無駄です。マルチプロセッシングモジュールを使用してスクリプト/行列乗算を並行して実行する方がはるかに効率的です。
Openblasは、物事をかなりスピードアップする良いオプションです。これは、たとえば、ほとんどのLinuxシステムでかなり簡単に利用できるはずです。 – seberg
私はMKLが(ビールのように)無料ではないことを知らなかった。 [OpenBLAS](http://xianyi.github.com/OpenBLAS/)はおそらく良い選択肢です。 EPDは学者には無料ですが、 – Dougal
私のニューラルネットは実際にはまばらです(10%の接続性)、私は20%のスピードアップを得ています。 OpenBLASについて、すでにBLASのバージョンを使用している私の現在のバージョンのnumpyよりも高速に動作しますか? – PierreE