파이썬으로 쉽게 GPU 계산을 할 수 있는 Cupy 소개

Cupy 정보



파이썬으로 행렬 계산을 하는 경우는 통상 CPU로 계산하는 Numpy를 사용합니다만, 행렬수가 많은 경우는 GPU로 계산을 할 수 있는 Cupy가 편리합니다.
GPU는 코어수가 압도적이 많기 때문에 경우에 따라서는 수배~수백배로 계산할 수 있는 일이 있습니다.
참고 : Cupy와 Numpy의 성능을 비교해 보았습니다.

Cupy는 원래 Deeplearning 프레임 워크의 Chainer의 일부였지만 Chainer의 v2보다 Cupy가 분리되었습니다.
간단한 코드로 간편하게 GPU 행렬 계산을 할 수 있으므로, 물리 시뮬레이션 등에도 사용해 보면 좋을지도 모릅니다.

환경



현재 linux 쪽이 간단하게 인스톨 할 수 있다고 생각합니다만, Windows에서도 움직이지 않는 것은 아닙니다.
(공식적으로는 지원되지 않고, 아무것도 움직이지 않을 때는 움직이지 않습니다..)
※2018/4/27 추기:향후 cupy v5에서는 windows가 서포트되고 있을지도 모릅니다.
htps //w w. s에서 멋지다. 네 t / p 후 / py-v4-an dv5-roa dma p

※2018/5/25 추기:cupy v5.0.0b1보다 windows에 있어서의 wheel로의 인스톨이 시험적으로 시작되었습니다.
cuda의 버전에 따라 다음과 같이 설치를 시도 할 수 있습니다.
pip install cupy-cuda80
pip install cupy-cuda90
pip install cupy-cuda91

우선, 이번 테스트 환경은 이하에서 실시했습니다.
  • Windows 10 Professional
  • CPU:Core i5-6600(3.9GHz, 4코어)
  • GPU:GeForce GTX 1070(1.8GHz, 1920 코어)
  • Visual C++ Build Tools
  • CUDA Toolkit 8.0 (8.0.44)
  • cuDNN 6.0
  • Anaconda3 5.1 (Python 3.6)
  • Cupy 4.0.0

  • 쉬운 사용법



    사용법은 간단하고, 아래와 같이 numpy와 같이 cupy를 사용하는 것만으로 행렬의 더하기나 곱등 여러가지 할 수 있습니다.
    다만, numpy로 사용되는 일부의 함수는 cupy로 사용할 수 없는 것도 있으므로 cupy 공식 문서 를 참조해 주세요.

    아래 소스는 이쪽

    배열 생성


    import cupy as cp
    A = cp.arange(9).reshape(3, 3).astype('f') #cupy上で3*3の行列を生成
    B = cp.arange(9).reshape(3, 3).astype('f') #cupy上で3*3の行列を生成
    print('A = \n', A)
    print('B = \n', B)
    
    -----------
    A = 
     [[0. 1. 2.]
     [3. 4. 5.]
     [6. 7. 8.]]
    
    B = 
     [[0. 1. 2.]
     [3. 4. 5.]
     [6. 7. 8.]]
    

    행렬의 합, 곱


    C = A + B #行列の和
    print('和:A + B = \n', C)
    
    D = cp.dot(A, B) #行列の積
    print('積:A・B = \n', D)
    
    -----------
    和:A + B = 
     [[ 0.  2.  4.]
     [ 6.  8. 10.]
     [12. 14. 16.]]
    
    積:A・B = 
     [[ 15.  18.  21.]
     [ 42.  54.  66.]
     [ 69.  90. 111.]]
    

    numpy의 배열 ⇔ cupy의 배열 변환



    cupy로 정의한 배열은 GPU에 있으므로 그대로 다른 라이브러리에서 사용할 수 없는 경우가 많습니다.
    또한 반대로 numpy 배열을 cupy 배열로 변환하여 GPU에서 계산하고 싶은 경우도 있습니다.

    numpy 배열과 cupy 배열의 변환은 "cupy"의 함수
    · cupy ⇒ numpy 배열로 변환 : cupy.asnumpy
    · numpy ⇒ cupy 배열로 변환 : cupy.asarray
    사용할 수 있습니다.
    E = cp.arange(9).reshape(3, 3).astype('f') #cupyで生成するとcupy配列
    print('「E」のクラスは', type(E)) 
    
    E_np = cp.asnumpy(E) #cupy ⇒ numpy配列へ変換
    print('「E_np」のクラスは', type(E_np))
    
    E_cp = cp.asarray(E_np) #numpy ⇒ cupy配列へ変換
    print('「E_cp」のクラスは', type(E_cp))
    
    -----------
    「E」のクラスは <class 'cupy.core.core.ndarray'>
    「E_np」のクラスは <class 'numpy.ndarray'>
    「E_cp」のクラスは <class 'cupy.core.core.ndarray'>
    
    

    2차원 푸리에 변환



    Cupy v4보다 2차원 푸리에 변환도 사용할 수 있게 되었습니다.

    numpy에서 2차원 FFT 참고:
    Python으로 이미지 처리(2차원 FFT 및 파워 스펙트럼)

    아래 소스와 결과는 이쪽

    아래 그림과 같은 【원화상 ⇒ 푸리에 변환 ⇒ 푸리에 역변환】



    이런 식으로 쉽게 할 수 있습니다.
    cp_fimg = cp.fft.fftshift(cp.fft.fft2(cp_img))#フーリエ変換+シフト
    cp_ffimg = cp.fft.ifft2(cp.fft.ifftshift(cp_fimg))#シフト+フーリエ逆変換
    #(一部略)
    

    4096*4096pix의 흑백 이미지를 10회 계산한 시간은
    - numpy: 30.4s
    - cupy: 34.1 ms
    그리고 매우 빨랐습니다.

    좋은 웹페이지 즐겨찾기