6

では、numpyを計算する最も効率的な方法は何ですか。 は大きな (200,000 x 1000) 密行列で、は転置演算子ですか?x.T * xxfloat32.T

誤解を避けるために、結果は 1000 x 1000 です。

編集:私の最初の質問で、私はそれnp.dot(x.T, x)が何時間もかかっていると述べました. NaNsマトリックスに潜入したことが判明し、何らかの理由でのパフォーマンスを完全に殺していましたnp.dot(理由についての洞察はありますか?) これは現在解決されていますが、元の質問は残っています.

4

3 に答える 3

10

これはあなたが探している答えではないかもしれませんが、大幅に高速化する 1 つの方法は、CPU の代わりに GPU を使用することです。かなり強力なグラフィックス カードがあれば、システムが非常によく調整されていても、いつでも CPU のパフォーマンスを上回ります。

numpy とうまく統合するには、theano を使用できます (グラフィック カードが nvidia 製の場合)。次のコードの計算は数秒で実行されます (非常に強力なグラフィック カードを使用していますが)。

$ THEANO_FLAGS=device=gpu0 python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import theano
Using gpu device 0: GeForce GTX 480
>>> from theano import tensor as T
>>> import numpy
>>> x = numpy.ones((200000, 1000), dtype=numpy.float32)
>>> m = T.matrix() 
>>> mTm = T.dot(m.T, m)
>>> f = theano.function([m], mTm)
>>> f(x)
array([[ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       ..., 
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.]], dtype=float32)
>>> r = f(x)
>>> r.shape
(1000, 1000)

比較のためにどれくらいの時間がかかるかを待つつもりでしたが>>> numpy.dot(x.T, x)、退屈しました...

PyCuda または PyOpenCL (nvidia グラフィックス カードを持っていない場合) を試すこともできますが、それらの numpy サポートが簡単かどうかはわかりません。

于 2010-12-07T12:44:50.000 に答える
5

まず、最適化された blas/lapack を使用していることを確認してください。これにより、大きな違いが生じる可能性があります (最大で 1 桁)。たとえば、スレッド化された ATLAS を使用すると、すべてのコアが比較的効率的に使用されます (ただし、最近の ATLAS を使用する必要があり、ATLAS のコンパイルは PITA です)。

Nan がすべての処理を遅くする理由については、これはほとんど避けられません。NaN の処理は、CPU レベルでの「通常の」フロートよりもはるかに遅くなります: http://www.cygnus-software.com/papers/x86andinfinity.html。CPU モデル、使用している命令セットの種類、そしてもちろん使用しているアルゴリズム/実装によって異なります。

于 2010-12-09T05:46:28.313 に答える
2

うーん、xは約800 Mbですが、結果に同じものが必要だとすると、十分な物理メモリがあり、スワッピングしていないことを確認しますか?

それ以外は、numpyはBLAS関数を使用する必要があり、numpyが使用するデフォルトのライブラリは比較的遅い場合がありますが、このサイズでは問題なく動作するはずです。

編集

import numpy as npy
import time

def mm_timing():
  print "   n   Gflops/s"
  print "==============="
  m = 1000
  n = 200000
  a = npy.random.rand(n, m)
  flops = (2 * float(n) - 1) * float(m)**2
  t1 = time.time()
  c = npy.dot(a.T, a)
  t2 = time.time()
  perf = flops / (t2 - t1) / 1.e9
  print "%4i" % n + "     " + "%6.3f" % perf

mm_timing()
于 2010-12-07T10:52:42.370 に答える