[부스트캠프] 3주차 학습정리

AirPlaneMode·2021년 8월 20일
0

부스트캠프 AI Tech

목록 보기
2/2

1. 학습정리

Pytorch vs TensorFlow

  • Pytorch는 역전파(backward propagation)을 실시할 때, 실행 시점에 그래프를 그림 (DCG; Dynamic Computation Graph)
    • 어느 지점에서 오류가 발생했는지, 실행 중간에 Debugging을 할 수 있는 장점이 있음.
  • TensorFlow는 그래프를 먼저 그린 정의한 다음, 역전파를 실시함 (Defind and Run)

I. pytorch basic

pytorch에서는 tensor라는 자료구조를 사용하는데, 이는 Numpy와 거의 동일한 역할을 수행한다.

  • 단, GPU를 사용할 수 있다는 점에서 근본적인 차이가 존재함
    • torch.cuda.{type}Tensor
  • tensor.numpy()를 통해 tensor를 numpy로 전환해 줄 수 있음.
  • 행렬곱을 할 때는 .dot 대신, .mm을 사용
    • 단, vector간 연산은 .dot을 이용함.

.view vs .reshape

  • .view는 연속성(contiguity)를 보장함.
    • .view로 생성된 뷰는 기존 텐서와 데이터를 공유
  • .reshape는 연속성을 보장하지 않음.
    • .reshape로 생성된 텐서는 기존 텐서와 데이터를 공유할 수도 있지만, 공유하지 않을 수도 있음

.view를 사용하는 것이 메모리 측면에서 효율적일 수도 있음

torch.nn.Functional [공식 문서 링크]

딥러닝 모델을 만들 때 유용한 함수들을 제공

  • Convolution functions, Pooling functions
  • Non-linear activation functions
  • Linear functions
  • Dropout functions
  • Sparse functions
  • Distance functions
  • Loss functions
  • Vision functions
  • DataParallel functions (multi-GPU, distributed)

AutoGrad

requires_grad = True로 설정하면, backward함수를 통해 자동미분을 실행할 수 있음.

  • Tensor의 requires_grad default 값은 False지만, nn.Parameter로 넘겨줄 때의 default 값은 True

Torch.nn.Module

Layer의 Base class로, input, output, forward, backward 등을 정의

checkpoint

학습의 중간결과(epoch, loss, metric)를 저장하여 이전 학습 결과물을 불러오기 위한 장치

torch.save({
'epoch': e,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'loss': epoch_loss,
},
f"saved/checkpoint_model_{e}_{epoch_loss/len(dataloader)}_{epoch_acc/len(dataloader)}.pt")
  • torch.save()를 이용하여 key, value의 형태로 저장.
checkpoint = torch.load(PATH)
model.load_state_dict(checkpoint['model_state_dict'])
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']
loss = checkpoint['loss']
  • 값을 불러올 때는 {인스턴스명}[key]의 형태로 불러옴.

II. Monitoring Tools

Tensorboard
TensorFlow 전용 시각화 툴이었지만, pytorch와 연계하여 사용 가능

import os
log_dir = "logs" # Tensorboard 기록을 위한 폴더
os.makedir(log_dir, exist_ok = True)

from torch.utils.tensorboard import SummaryWriter # 정보를 기록하기 위한 객체

writer = SummaryWriter(log_dir) # 인스턴스 생성

for epoch in n_epohcs:
	writer.add_scalar('Loss/train', train_loss, n_iter) # loss 카테고리 안의 train에 train_loss 값을 저장하는데, x축은 n_iter임.
writer.flush() # 값을 data에 기록

load_ext tensorboard # Jupyter 상에서 Tensorboard 실행
%tensorboard --logdir {logs_dir}
  • add_scalar : metric등 상수값의 연속을 epoch 단위(or 시간)로 표시
  • add_graph : computational graph 표시
  • add_histogram : weight 값의 분포를 표현
  • ad_image : 예측값과 실제값을 비교표시
  • add_mesh : 3d 형태의 데이터를 표현

III. Multi GPU

Node
컴퓨터의 개수
ex. Single Node Single GPU – 컴퓨터 1대 GPU 1개

다중 GPU 학습 방법

  1. 모델 나누기(Model Parallel)
  • (eg.Alexnet), 그러나 병목현상과 파이프라인 등의 어려움으로 인해 쉽지 않음.
  1. 데이터 나누기 (Data Parallel)
  • 데이터를 나눠 GPU에 할당하여, 결과의 평균을 취함 (Mini batch와 유사)

  • Dataparallel
    단순 분배 및 평균 (GPU 불균형, GPU 병목현상으로 인한 Batch사이즈 감소)

  • DistributedDataParellel
    각 CPU마다 Process를 생성하여 개별 GPU에 할당

Hyperparameter Tuning

  • Grid Search
    hyperparameter를 일정한 간격(grid)으로 변화시켜 찾는 방법

  • Random search
    무작위로 찾는 방법

Random search로 범위를 찾은 다음에, 축소된 범위 내에서 Grid search로 찾는 방법이 기본적이지만, 최근엔 베이지안 기반 기법들이 주도하고 있음

Ray

  • multi-node multi processing 지원 모듈 for 병렬처리)
    현재 분산병렬 ML/DL 모듈의 표준

IV. Trouble Shooting

OOM (Out of Memory)

  • GPUUtill로 GPU의 상태를 확인
    • iter이 커짐에 따라 메모리 사용량이 누적되면 안된다.
  • empty_cache() 사용되지 않은 GPU위의 cache를 정리하여 메모리를 확보. (del로는 안됨)
    • 학습 loop가 실행되기 전에 한다면 이전 학습의 메모리를 사용할 수 있음
  • loop안에 tensor로 축적되는 변수를 확인
    • 1d tensor는 python 기본 객체로 변환하여 처리할 것 (.item)
    • 필요가 없는 변수는 적절하게 삭제할 것
  • batch size를 줄여서 실행
  • inference 시점엔 torch.no_grad를 사용. (backward pass로 메모리가 쌓이지 X)

2. 과제

hook
텐서나 모듈 내의 연산 전후 작업을 제어하는 역할을 수행

  • Gradient를 확인해서 vanishing gradient나 exploding gradient problem이 발생할 때 경고를 주는 등의 사용이 가능

apply
모듈 내의 모든 submodule에 대해 동일한 연산을 수행

  • weight initialization에 활용가능

3. 피어세션

dropout
epoch이 반복될 때마다, 뉴런을 선택적으로 연결하여 학습을 시키는 방법

  • epoch마다 연결되는 뉴런이 다르기 때문에 여러 개의 network를 이용하는 bagging과 같은 효과를 기대할 수 있음.
  • 뉴런 간의 상호의존성(co-adaptation)을 줄일 수 있음
  • Test나 validation에는 dropout을 사용하지 않고fully connect하여 사용.

4. 회고

시간이 많이 부족하다는 느낌을 받았다. 강의를 들으면서 모든 내용을 이해하려 하기 보다는, 특정 keyword를 중심으로 이해하려고 노력하며, 궁금한 부분이 생기면 수강에 지장이 가지 않도록 core time 이후에 개인적으로 알아보도록 해야겠다.

0개의 댓글