네이버 부스트캠프/LEVEL-1

[부스트캠프][WK03 / Day11] PyTorch 기본

1. 강의 내용

Introduction to PyTorch (최성철 교수님)

파이토치는 Dynamic Computation Graph로 자동미분 시 실행시점에서 그래프를 정의하고 텐서플로는 Define and run이라는 기법을 사용합니다.

Dynamic Computation Graph는 연산의 과정을 그래프로 표현하며 다음과 같이 볼 수 있습니다. 실행하며 그래프를 생성하는 방식이라는 뜻으로 Define by run 이라고도 합니다.

Define and run은 그래프를 정의하는 코드를 먼저 작성하고 실행시점에 데이터를 그래프에 넣어(feed)줍니다.

Dynamic Computation Graph는 Define and run 방식에 비해 실행 중간중간 값을 확인하기 쉬워 디버깅에 용이합니다. TF는 production과 scalability에 장점을 가집니다.

Pytorch는 Numpy 구조를 가지는 Tensor 객체로 array를 표현합니다. 자동미분(Autograd)을 지원하여 Deep Learning 연산을 지원하며 다양한 형태의 Deep Learning을 지원하는 함수와 모델(Dataset, Multi-GPU, ...)을 지원하는 특징이 있습니다.


PyTorch Basics (최성철 교수님)

1) Tensor

다차원 Arrays 를 표현하는 Pytorch 클래스로 사실살 numpy의 ndarray와 동일합니다.(TensorFlow의 Tensor와도 동일) 또한 Tensor를 생성하는 함수도 거의 동일합니다.

# numpy - ndarray
import numpy as np
n_array = np.arange(10).reshape(2,5)
print(n_array)
print("ndim :", n_array.ndim, "shape :", n_array.shape)
"""
[[0 1 2 3 4],
[5 6 7 8 9]]
ndim : 2 shape :(2,5)
"""

# pytorch - tensor
import torch
t_array = torch.FloatTensor(n_array)
print(t_array)
print("ndim :", t_array.ndim, "shape :", t_array.shape)
"""
tensor([[0., 1., 2., 3., 4.],
[5., 6., 7., 8., 9.]])
ndim : 2 shape :torch.Size([2,5])
"""

Tensor 생성은 list나 ndarray를 사용 가능합니다.

import torch

# data to tensor
data = [[3, 5],[10, 5]]
x_data = torch.tensor(data)
x_data

# ndarray to tensor
nd_array_ex = np.array(data)
tensor_array = torch.from_numpy(nd_array_ex)
tensor_array

기본적으로 tensor가 가질수 있는 data 타입은 numpy와 동일합니다. 또한 numpy의 대부분의 사용법이 pytorch에 적용됩니다.

data = [[3, 5, 20],[10, 5, 50], [1, 5, 10]]
x_data = torch.tensor(data)
x_data[1:]
# tensor([[10, 5, 50],
# [ 1, 5, 10]])

x_data[:2, 1:]
# tensor([[ 5, 20],
# [ 5, 50]])

x_data.flatten()
# tensor([ 3, 5, 20, 10, 5, 50, 1, 5, 10])

torch.ones_like(x_data)
# tensor([[1, 1, 1],
# [1, 1, 1],
# [1, 1, 1]])

x_data.numpy()
# array([[ 3, 5, 20],
# [10, 5, 50],
# [ 1, 5, 10]], dtype=int64)

x_data.shape
# torch.Size([3, 3])

x_data.dtype
# torch.int64

numpy와의 차이라고 할 수 있는 부분은 pytorch의 tensor는 GPU에 올려서 사용가능하다는 것 입니다.

x_data.device
# device(type='cpu')

if torch.cuda.is_available():
    x_data_cuda = x_data.to('cuda')
x_data_cuda.device
# device(type='cuda', index=0)

Tensor handling 기법

  • view: reshape과 동일하게 tensor의 shape을 변환. reshape와는 다르게 contiguity를 보장합니다. 보장이 깨지는 순간엔 copy를 합니다.
  • squeeze: 차원의 개수가 1인 차원을 삭제 (압축)
  • unsqueeze: 차원의 개수가 1인 차원을 추가
# view
tensor_ex = torch.rand(size=(2, 3, 2))
tensor_ex
'''
tensor([[[0.7466, 0.5440],
        [0.7145, 0.2119],
        [0.8279, 0.0697]],

        [[0.8323, 0.2671],
        [0.2484, 0.8983],
        [0.3228, 0.2254]]])
'''

tensor_ex.view([-1, 6])
'''
tensor([[0.7466, 0.5440, 0.7145, 0.2119, 0.8279, 0.0697],
        [0.8323, 0.2671, 0.2484, 0.8983, 0.3228, 0.2254]])
'''

tensor_ex.reshape([-1,6])
'''
tensor([[0.7466, 0.5440, 0.7145, 0.2119, 0.8279, 0.0697],
        [0.8323, 0.2671, 0.2484, 0.8983, 0.3228, 0.2254]])
'''

# squeeze, unsqueeze
tensor_ex = torch.rand(size=(2, 1, 2))
tensor_ex.squeeze()
'''
tensor([[0.8510, 0.8263],
        [0.7602, 0.1309]])
'''

tensor_ex = torch.rand(size=(2, 2))
tensor_ex.unsqueeze(0).shape
# torch.Size([1, 2, 2])

tensor_ex.unsqueeze(1).shape
# torch.Size([2, 1, 2])

tensor_ex.unsqueeze(2).shape
# torch.Size([2, 2, 1])

Tensor operations
numpy의 operations와 거의 동일하지만 행렬곱셈 연산은 함수는 dot이 아닌 mm을 사용합니다. matmul도 사용 가능한데 matmul은 broadcasting이 가능합니다. 또한 nn.functional 모듈을 통해 softmax, argmax , one_hot 등 다양한 수식 변환을 지원합니다.

2) AutoGrad

PyTorch의 핵심은 자동 미분의 지원으로 backward 함수가 사용 가능합니다.

w = torch.tensor(2.0, requires_grad=True)
y = w**2
z = 10*y + 2
z.backward()
w.grad
# tensor(40.)

a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)
Q = 3*a**3 - b**2
external_grad = torch.tensor([1., 1.])
Q.backward(gradient=external_grad)

a.grad
# tensor([36., 81.])

b.grad
# tensor([-12., -8.])

PyTorch 프로젝트 구조 이해하기

개발 초기 단계에서는 대화식 개발 과정(jupyter)이 학습과정과 디버깅 등 지속적인 확인을 하는데 유리하지만, 배포 및 공유 단계에서는 실행순서가 꼬이는 등 notebook 공유의 어려움이 있습니다. 이렇게 개발 용이성 확보와 유지보수의 향상이 필요해 여러 프로젝트 템플릿이 나왔습니다.

다음 구조와 같은 템플릿을 실습해 보았습니다.


2. 과제 수행 과정 / 결과물 정리

Custom 모델 제작을 위한 Documentation 활용과제.
PyTorch 라이브러리의 Documentation을 활용하여 여러 기능을 구현하였습니다.
분량이 상당해 전부 끝내지 못했고 hook을 활용하는 것에 어려움을 겪었습니다. Optional 과제를 추가적으로 풀이해야 합니다.


3. 피어세션 정리

https://hackmd.io/mKN-SaT_Tzi5VGysQ1pvDQ?view


4. 학습 회고

PyTorch를 나름 사용해봤다고 생각했지만 기본부터 세세한 내용을 담은 과제를 수행하며 제대로 아는 것이 없다는 사실을 깨닫고 처음부터 다시 공부해야겠다는 생각이 듭니다...