8

パラメータが多くの最適化を必要とする小さなニューラルネットワークを開発しているため、多くの処理時間がかかります。スクリプトのプロファイリングを行っcProfileたところ、プロセッサ時間の 80% を占めるのは NumPydot関数であり、残りは関数を使用した行列反転numpy.linalg.solveです。私の現在のバージョンの numpy は を使用しblasnumpy.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 倍高速です。しかし、それは処理能力の浪費です。マルチプロセッシング モジュールを使用して、スクリプト/行列乗算を並行して実行する方がはるかに効率的です。
4

2 に答える 2

7

まだ行っていない場合は、Intel MKLのような非常に最適化された BLAS ライブラリに numpy をリンクしてみてください(これは、非営利目的の場合は無料で、学術目的の場合は割引されます。 -commercial; numpy ) またはOpenBLAS (free-as-in-speech) で使用するための Intel からの指示。Enthought Python Distributionもあります。これは、MKL に事前にリンクされており、研究者にはビールのように無料で提供されます。これにより、行列の乗算を自動的に並列化でき、ほとんどの Linux ディストリビューションでの一般的な参照 BLAS / ATLAS インストール、または使用しているものよりもはるかに高速になります。

そうでなければ、あなたができることを私が知っている唯一のことは、多くの乗算/解法を計算する必要がないようにするための数学的なトリックです。自分が何をしているのかを正確に知らなければ、そこに何か提案をするのは難しい.

通常、ニューラルネットにあるため、マトリックスが密であると想定していますが、何か変わったことをしている場合もscipy.sparse役立つかもしれません。

于 2012-09-02T19:52:15.850 に答える
4

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

一方、Numpy および BLAS ライブラリがアーキテクチャ上で可能な限り効率的にコンパイルされているかどうかを確認できます。たとえば、Numpy コンパイルで OpenMP ライブラリを有効化できれば、複数のコアがデータレベルの並列処理を使用して問題を処理できるようになります。これは、コンピューターに複数のコアがあり、計算が CPU バウンドである場合、高速化の重要な原因となる可能性があります。問題が許せば、タスクベースの並列プログラミング ライブラリ ( SCOOP [免責事項: 私が作成しました]、Celeryなど) を使用して、作業を複数のコンピューターに伝達することもできます。

最後の手段として、新しいハードウェアを購入することもできます。これにより、コードを 1 行も変更することなく、ソフトウェアが高速化される可能性があります。

于 2012-09-02T19:54:26.210 に答える