2012-09-02 6 views
8

나는 그 매개 변수가 많은 최적화를 필요로하는 작은 신경망을 개발하고 있으므로 많은 처리 시간이 필요하다. cProfile으로 스크립트를 프로파일 링했으며 프로세서 시간의 80 %가 NumPy dot 함수이고 나머지는 역함수 numpy.linalg.solve입니다. numpy의 현재 버전은 이 전체 처리 시간의 80 %를 차지하는 함수로 나타나기 때문에 blas을 사용합니다.파이썬에서 행렬 곱셈을 어떻게 가속화할까요?

내 신경망의 핵심이며이 부분을 많이 실행해야하므로 경미한 속도 향상으로 수많은 반복 매개 변수 최적화에 많은 시간을 절약 할 수있었습니다.

더 많은 정밀도 : 행렬 곱셈은 최소 100 * 100에서 최대 500 * 500까지의 모양을 갖는 행렬에 있습니다. 나는 12 개의 코어를 가진 컴퓨터를 가지고 있으며 병렬로 다른 신경망 매개 변수 최적화를 실행하기 위해 지금까지 사용했지만, 아마도 행렬 곱셈을 병렬로 수행 할 수 있을까?

감사합니다.

답변 : 내가 몇 일 테스트 및 설치 제거 라이브러리 ... 여기에 내가 테스트 한 일의 결과는 소비

: 우분투 (12.04)의 내 버전에 기본적으로 및 NumPy와의 respository 설치된 버전의 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 라이브러리가있는 하나의 프로세서보다 두 배 빠릅니다. 그러나 처리 능력이 낭비되기 때문에 멀티 프로세싱 모듈을 사용하여 스크립트/행렬 곱셈을 병렬로 실행하는 것이 훨씬 효율적입니다.

답변

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 (무료 - 어 -에서 - 연설). Enthought Python Distribution도 있습니다. MKL에 사전 연결되어 있으며 학계에서는 맥주로 남아 있습니다. 이렇게하면 매트릭스 곱셈을 자동으로 병렬 처리 할 수 ​​있으며, 대부분의 Linux 배포판에서 BLAS/ATLAS를 설치하는 것보다 훨씬 빠릅니다.

그렇지 않으면 내가 할 수있는 유일한 방법은 많은 곱셈/해를 계산할 필요가없는 수학적 트릭 일 것입니다.정확히 무엇을하고 있는지 알지 못하면 거기에 제안을하기가 어렵습니다.

저는 매트릭스가 밀도가 높다고 가정합니다. 보통 신경망에 있기 때문에 그렇습니다. 비정상적으로 수행하는 경우 scipy.sparse도 도움이 될 수 있습니다.

+0

Openblas는 일을 상당히 빠르게 할 수있는 좋은 옵션입니다. 예를 들어, 대부분의 리눅스 시스템에서 꽤 쉽게 사용할 수 있어야합니다. – 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 등)를 사용할 수도 있습니다.

마지막 수단으로 새 하드웨어를 구입할 수도 있습니다. 단일 코드 행을 변경하지 않고 소프트웨어를 잠재적으로 더 빠르게 만들 수 있습니다.

+0

감사합니다. 어떤 버전의 Blas가 설치되어 있는지 확인하고 OpenMP로 컴파일하려고합니다. 얼마나 복잡합니까? – PierreE

+0

@pierotiste : * nix 기반 시스템에서는 그리 어렵지 않습니다. Numpy를 다시 컴파일하고 새 라이브러리 및/또는 플래그를 연결해야합니다. 자세한 내용은 블로그 또는 Numpy 설명서를 온라인으로 확인하십시오. 선택한 라이브러리에 따라 필요한 단계가 변경 될 수 있습니다. – Soravux

관련 문제