2012-09-02 20 views
8

私は小さなニューラルネットワークを開発しています。そのパラメータは多くの最適化を必要とするため、処理時間が長くなります。私は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倍の高速化が可能です。しかし、それは処理能力の無駄です。マルチプロセッシングモジュールを使用してスクリプト/行列乗算を並行して実行する方がはるかに効率的です。

答えて

7

あなたはまだしていない場合は、あなたがIntel MKLのような非常に最適化されたBLASライブラリにnumpyのリンク試みることができる(どうやら、非商用のカウントされませんfree-as-in-beer for non-commercial useまたはdiscounted for academic useで、; instructions from Intel for using it with numpyを)またはOpenBLAS(無料-as-in-speech)である。また、Enthought Python Distributionもあります。これは、MKLにプレリンクされており、学者にとってはビールとしても利用可能です。これは行列の乗算を自動的に並列化することができ、ほとんどのLinuxディストリビューションの典型的な参照BLAS/ATLASインストールよりもはるかに高速になる可能性があります。

そうでなければ、私が知っている唯一のことは、多くの乗算/解を計算する必要のない数学的なトリックです。あなたがしていることを正確に知らなければ、そこに何か示唆を与えるのは難しいです。

私はあなたの行列が密であると仮定しています。なぜなら、それらは通常神経網にあるからです。しかし、珍しい何かをしているのなら、scipy.sparseも役に立ちます。

+0

Openblasは、物事をかなりスピードアップする良いオプションです。これは、たとえば、ほとんどのLinuxシステムでかなり簡単に利用できるはずです。 – seberg

+0

私はMKLが(ビールのように)無料ではないことを知らなかった。 [OpenBLAS](http://xianyi.github.com/OpenBLAS/)はおそらく良い選択肢です。 EPDは学者には無料ですが、 – Dougal

+0

私のニューラルネットは実際にはまばらです(10%の接続性)、私は20%のスピードアップを得ています。 OpenBLASについて、すでにBLASのバージョンを使用している私の現在のバージョンのnumpyよりも高速に動作しますか? – PierreE

4

Numpyは、すでにSSEの最適化を使用しているサードパーティのライブラリ(BLASなど)に基づいた、非常に高速な内部アルゴリズムと表現を使用しています。元のBLASは(パフォーマンスよりも精度に重点を置くリファレンス実装を目指しているため)遅いため、OpenBLASなどのパフォーマンスに焦点を当てた別のフレーバーを使用することをお勧めします。 OpenBLASを使用するには、あらかじめ構築されたOpenBLAS対応のNumpyパッケージを見つけるか、OpenBLASにリンクされたバージョンを再コンパイルする必要があります。効率的なBLAS実装を使用すると、Cでライブラリを作成して最適化するまでに時間がかかる場合を除き、純粋なPythonでより高速なオプションを見つけることはできません。

一方、あなたのNumpyとBLASライブラリがあなたのアーキテクチャ上でできるだけ効率的にコンパイルされているかどうかを確認することができます。たとえば、NumpyコンパイルでOpenMPライブラリをアクティブ化できる場合、データレベルの並列処理を使用して複数のコアを問題に対応させることができます。これは、コンピュータに複数のコアを持ち、計算がCPUに拘束されている場合、スピードアップの重要な原因となります。問題の種類が許せば、タスクベースの並列プログラミングライブラリ(SCOOP [Disclamer:私が書いた]、Celeryなど)を使用して、複数のコンピュータで作業を伝播することもできます。

最後に、新しいハードウェアを購入する可能性があります。 1つのコード行を変更することなく、ソフトウェアを潜在的に速くすることができます。

+0

ありがとう、私はどのバージョンのBlasがインストールされているかを確認し、OpenMPでコンパイルを試みます。それはどれくらい複雑ですか? – PierreE

+0

@pierotiste:* nixベースのシステムではそれほど難しいはずはありません。新しいライブラリやフラグにリンクしながらNumpyを再コンパイルする必要があります。詳細については、ブログやNumpyのマニュアルをオンラインで確認してください。選択したライブラリに応じて、必要な手順が変更されることがあります。 – Soravux