Multithreading bei numpy / pandas matrix Multiplikation?

9

Ich möchte wirklich wissen, wie man die Multi-Core-Verarbeitung für Matrixmultiplikation auf numpy / pandas verwendet.

Was ich versuche, ist hier:

%Vor%

Dies erfordert eine große Verarbeitungszeit wegen vieler Summen von Produkten, und ich denke, dass es einfach ist, Multithreading für eine große Matrixmultiplikation zu verwenden. Also habe ich sorgfältig gegoogelt, aber ich kann nicht finden, wie man das auf numpy / pandas macht. Muss ich Multi-Thread-Code manuell mit einer Python-integrierten Threading-Bibliothek schreiben?

    
rkjt50r983 04.04.2014, 01:11
quelle

2 Antworten

3

In NumPy kann die Multithread-Matrixmultiplikation mit einer Multithread-Implementierung von BLAS, den Basic Linear Algebra Subroutinen, erreicht werden. Sie müssen:

  1. Habe eine solche BLAS-Implementierung; OpenBLAS, ATLAS und MKL enthalten alle eine Multithread-Matrixmultiplikation.
  2. Lassen Sie ein NumPy kompilieren, um eine solche Implementierung zu verwenden.
  3. Stellen Sie sicher, dass die Matrizen, die Sie multiplizieren, ein dtype von float32 oder float64 haben (und bestimmte Ausrichtungseinschränkungen erfüllen; ich empfehle, NumPy 1.7.1 oder höher zu verwenden, wenn diese gelockert wurden).

Einige Einschränkungen gelten:

  • Ältere Versionen von OpenBLAS, wenn sie mit GCC kompiliert werden, stoßen auf Probleme in Programmen, die multiprocessing verwenden, was die meisten Anwendungen einschließt, die joblib verwenden. . Insbesondere werden sie hängen. Der Grund ist ein Fehler (oder das Fehlen eines Features) in GCC. Ein Patch wurde gesendet, ist aber noch nicht in den Hauptquellen enthalten.
  • Die ATLAS-Pakete, die Sie in einer typischen Linux-Distribution finden, können für die Verwendung von Multithreading kompiliert sein oder nicht.

Wie für Pandas: Ich bin mir nicht sicher, wie es dot Produkte macht. Konvertieren Sie in NumPy-Arrays und zurück, um sicher zu sein.

    
Fred Foo 04.06.2014 17:05
quelle
1

Zunächst würde ich auch vorschlagen, zu holprigen Arrays zu konvertieren und die Punktfunktion numpys zu verwenden. Wenn Sie Zugriff auf einen MKL-Build haben, der im Moment mehr oder weniger die schnellste Implementierung ist, sollten Sie versuchen, die Umgebungsvariable OMP_NUM_THREADS zu setzen. Dies sollte die anderen Kerne Ihres Systems aktivieren. Auf meinem MAC scheint es richtig zu funktionieren. Außerdem würde ich versuchen, np.einsum zu verwenden, das scheint schneller zu sein als np.dot

Aber pass auf! Wenn Sie eine Multithread-Bibliothek kompiliert haben, die OpenMP zur Parallelisierung verwendet (wie MKL), müssen Sie berücksichtigen, dass das "gcc" auf allen Apple-Systemen nicht gcc ist, es ist Clang / LLVM und Clang kann nicht mit bauen OpenMP-Unterstützung im Moment, außer dass Sie den noch experimentellen OpenMP-Trunk verwenden. Sie müssen also den Intel-Compiler oder irgendeinen anderen, der OpenMP unterstützt, installieren

    
lemitech 23.08.2014 21:06
quelle