국비지원교육/Python

pytorch 설치, numpy와 tensorflow와 비교 with google colab

HanJW96 2024. 5. 28. 11:53
  • pytorch  설치 (구글코랩 기본세팅)

위 런타임 누르고 런타임 유형변경 -> GPU로 변경 

셀 이라고 한다. 코드 입력하는 셀을 코드셀 이라고 함.

 

위나 아래쪽으로 코드셀 또는 텍스트셀을 추가할 수 있다.

이건 텍스트셀 . 나중에 .py로 변경하고 파이참으로 열면 ''' ''' 주석

즉, 여러줄 주석으로 표시되는 부분을 이걸로 만들 수 있다.

간단한 글자조정 가능.

# 붙이면 제목글자가 된다.

오른쪽에 미리보기 표시됨

!pip3 install torch
!pip3 install torchvision

 

실행 눌러서 파이토치 설치

  • Framework Comparison (패키지 비교)

Numpy vs Tensorflow vs Pytorch

 

output = x * y + z

 

보통 AI의 연산들이 행렬끼리 곱하고 더하는 연산이 많기 때문에 

행렬만들고 계산하는걸 세개의 패키지로 실험

 

 

1. Numpy

import numpy as np
from datetime import datetime

start = datetime.now()

np.random.seed(0) # 랜덤값 발생 고정시킴

N, D = 3, 4

x = np.random.randn(N, D)  # 3행 4열 배열에 0 ~ 1 사이의 랜덤값 채움
y = np.random.randn(N, D)  # 3행 4열 배열에 0 ~ 1 사이의 랜덤값 채움
z = np.random.randn(N, D)  # 3행 4열 배열에 0 ~ 1 사이의 랜덤값 채움

a = x * y
b = a + z
c = np.sum(b)

grad_c = 1.0
grad_b = grad_c * np.ones((N,D))
grad_a = grad_b.copy()
grad_z = grad_b.copy()
grad_y = grad_a * y
grad_x = grad_a *x

print(grad_x)
print(grad_y)
print(grad_z)

print('연산 처리 시간 : ', datetime.now()- start)

 

numpy 연산 처리 시간 : 0.0016초

 

2. Tensorflow

 

먼저 테스트에서 사용할 tensorflow.placeholder함수는 없어졌기 때문에

import tensorflow.compat.v1 as tf 
tf.disable_v2_behavior()

v1로 낮추는 작업을 해야함

 

#import tensorflow as tf
import numpy as np #원래는 셀마다 임포트할 필요가 없음
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from datetime import datetime

start = datetime.now()

# 실행 동작을 미리 정의해 놓음
with tf.device('/gpu:0'):   # 실행시 gpu 0 사용을 지정함
  x = tf.placeholder(tf.float32)   # 나중에 값을 넣을 공간을 만듦
  y = tf.placeholder(tf.float32)
  z = tf.placeholder(tf.float32)

  a = x * y
  b = a + z
  c = tf.reduce_sum(b)

grad_x, grad_y, grad_z = tf.gradients(c, [x,y,z])

# 준비된 공간에 값을 채우는 설정
with tf.Session() as sess:
  values = {
      x: np.random.randn(N, D),
      y: np.random.randn(N, D),
      z: np.random.randn(N, D)
  }
  out = sess.run([c, grad_x, grad_y, grad_y], feed_dict=values)
  c_val, grad_x_val, grad_y_val, grad_z_val = out

print(grad_x_val)
print(grad_y_val)
print(grad_z_val)

print('연산 처리 시간 : ', datetime.now()- start)

Tensorflow 연산 처리 시간 : 0.0456초

 

? Tensorflow 공간확보 때문에 조금 느릴 수도

 

3. pytorch

import torch
from torch.autograd import Variable
from datetime import datetime

start = datetime.now()

# 자동 미분 계산 클래스 : autograd.Variable
x = Variable(torch.randn(N,D).cuda(), requires_grad=True)
y = Variable(torch.randn(N,D).cuda(), requires_grad=True)
z = Variable(torch.randn(N,D).cuda(), requires_grad=True)

a = x * y
b = a + z
c = torch.sum(b)

# gradient(경사도) 자동 계산 수행
# 기울기(gradient)가 1.0 이라고 가정하고 최종 값인 c 에서 
# backward를 통해서 역전파를 해 줍니다.
#c.backward(gradient=torch.cuda.FloatTensor([1.0])) # GPU 버전
c.backward(gradient=torch.tensor(1, dtype=torch.float)) # CPU 버전

print(x.grad)
print(y.grad)
print(z.grad)

print('연산 처리 시간 : ', datetime.now()- start)

 

pytorch 연산 처리 시간 : 0.0078초

 

tensor 보다 코드가 간결하다. 

기울기 관련 지원해주는 코드가 많음