본문 바로가기

pytorch

파이토치를 사용한 신경망 훈련

  • 파이토치를 사용한 훈련 속도 상승 방법
  • 파이토치의 Dataset 과 DataLoader 를 사용하여 입력 파이프라인과 효율적인 모델 훈련 구축
  • 파이토치를 사용한 최적화 머신 러닝 코드 작성
  • torch.nn 모듈을 사용한 딥러닝 아키텍처 구성
  • 여러 가지 활성화 함수 선택

파이토치와 훈련 성능

계산 비용이 높은 연산을 수행할 때 마주치게 되는 하드웨어 성능 이슈 

성능 문제

사이킷런의 많은 함수는 여러 프로세스로 연산을 분산할 수 있었다. 그러나 기본적으로 파이썬은 GIL Global Interpreter Lock 때문에 하나의 코어만 활용할 수 있다.

 

간단한 다층 퍼셉트론에서도 은닉층이 많은 유닛을 가지고 있고, 이는 모델이 복잡해질수록 파라미터의 개수가 급격히 늘어나게 된다. 이런 작업은 단일 프로세스로는 빠르게 수행하기 어렵다. 

 

이 문제에 대한 해결책은 GPU 를 사용하는 것이다. 

그렇다면 머신 러닝 작업에 GPU 를 사용하기 어려운 이유가 있을까? 특정 GPU 에 맞는 코드를 작성하는 일은 파이썬 인터프리터에서 코드를 실행하는 것처럼 간단하지 않다. 

CUDA 나 OpenCL 처럼 특정 GPU 를 사용할 수 있도록 도와주는 패키지가 존재, 하지만 이 환경에서 코드를 작성하는 것은 머신 러닝 알고리즘을 구현하고 실행하기 편리한 환경이 아님,

 

때문에 파이토치가 개발되었다.

 

파이토치란?

파이토치는 간편한 딥러닝 API 를 포함하여 머신 러닝 알고리즘을 구현하고 실행하기 위한 확작성이 좋은 멀티플랫폿 프로그래밍 인터페이스이다.

머신 러닝 모델 훈련의 성능을 향상시키기 위해 파이토치는 GPU, XLA 장치에서 실행할 수 있다. 

파이토치는 토치 라이브러리를 기반으로 개발, 주요 초점은 파이썬 인터페이스이다.

 

일련의 노드로 구성된 계산 그래프 중심으로 만들어졌다. 각 노드는 0개 이상의 입력 또는 출력을 가질 수 있는 연산을 나타낸다. 

연산을 평가하고 계산의 실행, 구체적인 값을 즉시 반환하는 명령형 프로그래밍 환경을 제공한다. 따라서 파이토치의 계산 그래프는 사전에 구성 후 실행하는 것이 아닌 암묵적으로 정의된다.

 

파이토치에서 텐서 만들기

import torch
import numpy as np

np.set_printoptions(precision=3)

a = [1, 2, 3]
b = np.array([4, 5, 6], dtype=np.int32)

t_a = torch.tensor(a)
t_b = torch.from_numpy(b)

print(t_a)
print(t_b)

>>>
tensor([1, 2, 3])
tensor([4, 5, 6], dtype=torch.int32)

 

상수 값을 가진 텐서를 다음과 같이 만들 수도 있다.

텐서의 데이터 타입과 크기 조작

어떤 연산은 특정 차원의 입력 텐서를 필요로 한다.

 

텐서에 수학 연산 적용

 

파이토치 입력 파이프라인 구축

 

텐서에서 파이토치 DataLoader 만들기

배치 크기 3의 배치 생성

drop_last 매개변수는 텐서의 원소 개수를 원하는 배치 크기로 나눌 수 없는 경우에 유용,

 

DataLoader 를 통해 데이터셋을 사용자 정의 배치로 구성할 수 있다.

 

두 개의 텐서를 하나의 데이터셋으로 연결

데이터는 두 개 이상의 텐서로 구성,  텐서를 연결하여 두 텐서의 원소를 튜플로 추출할 수 있다.