파이썬으로 쉽게 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
우선, 이번 테스트 환경은 이하에서 실시했습니다.
현재 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
우선, 이번 테스트 환경은 이하에서 실시했습니다.
쉬운 사용법
사용법은 간단하고, 아래와 같이 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
그리고 매우 빨랐습니다.
Reference
이 문제에 관하여(파이썬으로 쉽게 GPU 계산을 할 수 있는 Cupy 소개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/samacoba/items/d18e6cf09f544477aff4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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.]]
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'>
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
그리고 매우 빨랐습니다.
Reference
이 문제에 관하여(파이썬으로 쉽게 GPU 계산을 할 수 있는 Cupy 소개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/samacoba/items/d18e6cf09f544477aff4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)