이번 포스팅에서는 PyTorch tensor 와 NumPy ndarrays 의 행렬 곱셈(matrix multiplication) 성능을 비교해보겠습니다. GPU 는 Google Colab 을 사용해서 성능을 테스트했습니다. 

 

(1) PyTorch tensor & GPU 로 행렬 곱셈 (matrix multiplication) 

(2) PyTorch tensor & CPU 로 행렬 곱셈

(3) NumPy ndarrays & CPU 로 행렬 곱셈

 

 

PyTorch tensors & GPU vs. PyTorch tensors & CPU vs. NumPy ndarrays & CPU

 

 

 

m * n 행렬 A 와 n * p 행렬 B 가 있다고 했을 때, 행렬 곱셈(matrix multiplication) C = AB 는 아래와 같이 정의할 수 있습니다.  행렬 곱셈 연산은 A 의 i번째 행과 B의 j번째 열의 성분들을 각각 곱한 후 더한 것이며, 서로 독립적으로 병렬 연산 (calculation in parallel) 이 가능합니다. GPU 는 수 천 개의 cores 를 가지고 있으므로 단지 수 개의 cores를 가지는 CPU 보다 병렬로 행렬 곱셈을 매우 빠르게 수행할 수 있습니다. 

 

행렬 곱셈 (matrix multiplication)

 

 

 

(1) PyTorch tensor & GPU 로 행렬 곱셈 (matrix multiplication)

 

PyTorch를 불러오고, torch.manual_seed() 로 초기값을 설정해서 매번 동일한 난수가 발생하게 설정을 해준 다음, torch.rand() 함수로 난수를 생성해서 torch 객체를 만들어보겠습니다. 

 

import torch
print(torch.__version__)
#1.13.1+cu116

## generate the torch objects with random numbers
torch.manual_seed(1004)
x = torch.rand(1, 25600)
y = torch.rand(25600, 100)

 

 

다음으로, torch tensor 객체를 저장할 디바이스를 정의하겠습니다. 아래 코드는 GPU 를 사용할 수 있으면 (torch.cuda.is_available() == True) 'cuda' 로 디바이스를 정의하고, 그렇지 않으면 'cpu'로 디바이스를 정의합니다. 

 

## define the device
device = 'cuda' if torch.cuda.is_available() else 'cpu'

 

 

이제 x, y의 두 개 tensor 객체를 위에서 정의한 디바이스에 등록(register)해서 정보를 저장하겠습니다. 

 

## register and save the tensor objects with the device
x, y = x.to(device), y.to(device)

 

 

마지막으로, PyTorch tensor 객체인 행렬 x와 y 의 행렬 곱셉(matrix multiplication, z = (x@y))을 GPU 를 사용해서 해보겠습니다. 이때 실행 성능을 확인하기 위해 %timeit 으로 실행 시간을 측정해보겠습니다. 

 

행렬 곱셉에 25.4 µs ± 26.9 µs per loop 의 시간이 걸렸네요.  

 

## (1) run matrix multiplication of the Torch objects on GPU
%timeit z = (x@y)

# The slowest run took 6.94 times longer than the fastest. 
# This could mean that an intermediate result is being cached.
# 25.4 µs ± 26.9 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

 

 

 

(2) PyTorch tensor & CPU 로 행렬 곱셈 (matrix multiplication)

 

이번에는 PyTorch tensor 에 대해 CPU 를 사용(x.cpu(), y.cpu())해서 행렬 곱셉을 해보겠습니다. 

PyTorch tensor에 대해 CPU 로는 932 µs ± 292 µs per loop 의 시간이 소요되었으며, 이는 위의 PyTorch tensor & GPU 대비 약 37배 더 시간이 소요되었습니다. 

 

## (2) run matrix multiplication of the same tensors on CPU
x, y = x.cpu(), y.cpu()

%timeit z = (x@y)

# 932 µs ± 292 µs per loop 
# (mean ± std. dev. of 7 runs, 1000 loops each)

 

 

 

(3) NumPy ndarrays & CPU 로 행렬 곱셈

 

마지막으로 NumPy의 ndarrays 로 위의 PyTorch로 했던 행렬 곱셉을 똑같이 실행해서, 소요시간을 측정(%timeit)해 보겠습니다.

 

NumPy의 ndarrays 로 행렬 곱셉은 1.17 ms ± 46.4 µs per loop 이 걸려서, 위의 PyTorch tensor & GPU 는 NumPy ndarrays 보다 46배 빠르고, 위의 PyTorch tensor & CPU 는 NumPy ndarrays 보다 1.25 배 빠르걸로 나왔습니다

역시 GPU 가 행렬 곱셉 성능에 지대한 영향을 끼치고 있음을 확인할 수 있습니다! 

 

## (3) run matrix multiplication on NumPy arrays
import numpy as np

x = np.random.random((1, 25600))
y = np.random.random((25600, 100))

%timeit z = np.matmul(x, y)

# 1.17 ms ± 46.4 µs per loop 
# (mean ± std. dev. of 7 runs, 1000 loops each)

 

 

PyTorch tensor & GPU 의 강력한 성능을 이용해서 멋진 딥러닝 모델 학습하세요. 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요!  :-)

 

728x90
반응형
Posted by Rfriend
,