dukim's blog

[WK03-Day011][21.08.17.Tue] PyTorch Basics 본문

Boostcamp AI Tech 2th

[WK03-Day011][21.08.17.Tue] PyTorch Basics

eliza.dukim 2021. 8. 18. 13:43

Intro

  • PyTorch Basics라서 에이 뭐 쉽겠네하고 방심했는데, 압도적인 과제량과 퀄리티에 다시 한 번 정신차리게 된 하루.
  • 복습 내용은 다 적기 보다는 어떤 개념이 언제 필요하다 정도만 정리했습니다.

강의 복습 내용

PyTorch Basics

view vs. reshape

  • 결론부터 말하면 view를 쓰면 변환 이전과 이후 tensor가 동일한 메모리 주소를 참조, 하지만 reshape은 다른 메모리 주소에 새로 쓴다. 잘 모르겠으면 view를 쓰자.
  • 관련 용어
    • contiguous tensor : 메모리에 배열의 값이 연속적으로 저장된 텐서, 텐서를 최초로 만들면 일렬로 펼친 배열로 메모리에 연속적으로 저장됨.
    • stride: shape의 각 차원에서 인덱스를 1 증가시킬 때 일렬로 펼쳐진 배열에서 건너 뛰어야할 원소의 개수
  • 텐서의 모양을 변경하는 함수 중에는 메모리에 새로 쓰지 않고, 각 차원에 대한 stride만 변경해서 바뀐 모양을 처리하는 함수 또는 메서드들이 있다(변환 전후의 텐서모두 같은 메모리 주소를 참조함)
    • view, transpose, narrow, expand
  • 위 함수들로 변환해 얻은 텐서는 바뀐 모양이 원래 메모리 상에서 저장되어있어야할 순서(즉, 처음부터 그 모양대로 만들었을 때 메모리에 저장된 순서)와 실제 저장된 순서가 다르다. 이러한 텐서를 non-contiguous tensor라 한다.
  • non-contiguous tensor는 텐서를 펼칠 때(.view(-1)) 에러가 발생한다. 이와 관련된 내용은 titania7777님의 post 'contiguous란'을 참고
  • 이 경우엔 contiguous(non-contiguous tensor를 contiguous tensor로 만들어주는 메서드)를 사용하여 해결
  • 추가 참고 : https://f-future.tistory.com/entry/Pytorch-Contiguous

dot vs. mm vs. matmul

  • dot : 스칼라, 벡터의 내적, 행렬 연산 미지원
  • mm : 행렬곱, 스칼라, 벡터 연산 미지원
  • matmul : mm과의 차이점은 broadcasting 지원여부. matmul은 boradcasting을 지원함
      # mm은 broadcsting 다음 연산에서 에러발생
      a = torch.rand(5,2, 3)
      b = torch.rand(5)
      a.mm(b)
      # matmul은 boradcasting을 지원하므로 0, 1 차원에 대해 broadcasting 적용되 계산됨
      a = torch.rand(5, 2, 3)
      b = torch.rand(3) # broadcasting -> [3, 1]
      a.matmul(b). # [5, 2, 3] @ [3, 1] -> [5, 2]

unsqueeze vs. squeeze

  • 불필요한 차원 제거 / 차원 추가

cartesian_prod

  • 두 배열을 입력 받아 각 배열의 원소를 하나씩 선택할 떄 가능한 모든 경우의 수가 담긴 배열을 리턴
      import itertools
      a, b = [1, 2, 3], [4, 5]
      list(itertools.product(a, b))
      # >>> [(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)]
      import torch
      tensor_a = torch.tensor(a)
      tensor_b = torch.tensor(b)
      torch.cartesian_prod(tensor_a, tensor_b)
      '''
      tensor([[1, 4],
              [1, 5],
              [2, 4],
              [2, 5],
              [3, 4],
              [3, 5]])
      '''

PyTorch 프로젝트 구조 이해하기

  • (프로젝트 템플릿 모범 사례(victoresque/pytorch-template))[https://github.com/victoresque/pytorch-template]
  • 이 파트는 내용 정리로는 설명하기 어렵고, 아직 다 살펴보지 못 했다.
  • 이번주 내내 pytroch 간단한 tutorial 코드를 이 template 형식으로 작성하는 작업 진행하면서 배울 예정

과제 수행 과정 / 결과물

Custom Model 개발하기

PyTorch OOP 구조

  • nn.Module class : 여러 기능들을 담아두는 container 역할, 보다 구체적으로는
    • basic building block : nn.Module에 여러 기능을 담아둔 경우
    • Deep Learning Model : basic building block을 모아 구성한 모델

Container

  • Module을 묶어서 관리할 때 쓰는 자료형
  • torch.nn.Sequential: Module들을 하나로 묶어 순차적으로 실행시킬 때
  • torch.nn.ModuleList: 리스트 형태로 단순히 담아두기만 할 때
  • torch.nn.ModuleDict: dict처럼 key, value pair로 담아둘 때

Parameter vs. Tensor vs. Buffer

  • Parameter: 모듈 안에서 모델의 weight로써 gradient를 계산하는 텐서(requires_grad=True)로 등록됨
  • Tensor: pytorch의 데이터 자료형, gradient를 계산하지 않음
  • Buffer: gradient를 계산하지는 않지만 모델과 함꼐 저장되어야하는 tensor(e.g. Batch Normalization에서 mean), 생성자(__init__)에서 self.register_buffer([buffer 이름], [tensor])로 등록

named_childeren vs. named_modules vs. named_buffers

  • 모델의 메서드로 내부의 module(named_buffers의 경우엔 buffer)의 (이름, 객체) 목록을 iterator 객체로 반환
  • named_children: 한 단계 아래읜 sub module까지만 표시
  • named_modules: 자신에게 속하는 모든 sub module들을 표시
  • named_buffers: 자신에게 속하는 모든 buffer들을 표시

get_submodule vs. get_parameter vs.get_buffer

  • 모델의 메서드로, 각 객체의 이름(위에서 알 수 있음)을 입력 받아 해당 객체를 반환

hook

  • 개념: 패키지화된 코드에서 다른 개발자가 custom 코드를 중간에 실행시킬 수 있게 만들어놓은 인터페이스
  • 적용 상황:
    • 프로그램 실행 로직 분석시
    • 프로그램에 기능 추가시

PyTorch의 hook

  • 등록하는 곳에 따라 크게 2가지: Tensor, Module
  • Tensor
    • 확인: _backward_hooks attribute
    • 등록: register_hook([hook function])
    • 상황: 모델 파라미터의 gradient에 직접 접근할 때, (e.g. `model.[layer].[nn.Parameter].register_hook() 형태로 모델의 parameter의 gradient에 접근 가능)
    • hook function 형태:
        def tensor_hook(grad):
            pass
  • Module
    • 확인: __dict__로 한 번에 확인
    • 상황: Module(의 forward 연산)을 기준으로, input, output gradient를 가져올 떄
    • 등록: 실행시점에 따라 hook이 3가지가 있음
      • register_forward_pre_hook:
        • hook function 형태:
            def pre_hook(module, input):
                pass
      • register_forward_hook
        • hook function 형태:
            def hook(module, input, output):
                pass
      • register_full_backward_hook
        • hook function 형태:
          def module_hook(module, grad_input, grad_output):
              pass
  • 활용
    • gradient값의 변화를 시각화
    • gradient값이 특정 임계값을 넘으면 gradient exploding 경고 알림
    • 특정 tensor의 gradient값이 너무 커지거나 작아지는 현상이 관측되면
      해당 tensor 한정으로 gradient clipping 등

apply

  • 상황: 하나의 모델 내의 하위 module 들에 일괄적으로 custom function을 적용할 때(e.g. .cpu(), weight initialization)
  • 작동방식: Postorder Traversal 방식으로 하위 module을 순회하며 custom function 적용
  • 조각 코드: apply custom function 예시
    • 특정 class name을 가지는 Module에 대해서만 weight initialization
        def weight_initialization(module):
            module_name = module.__class__.__name__
            if module_name.find('Function') != -1:
                print(module_name)
                module.W.data.fill_(1.0)
        # apply는 적용된 module return함
        initialized_module = model.apply(weight_initialization)

기타 유용한 정보들

  • 모델 검색 소스
  • 라이선스 문제, 인용 문제(이 부분은 시간날 때, 필요할 때 다시 볼 것)

피어세션

발표

최한준: 알고리즘 정리

  • 최단경로 알고리즘
    1. Dijkstra Algorithm
      • 목적 : 한개의 정점에서 다른 모든 정점으로의 거리를 알고 싶을 때 사용
    2. Bellman-Ford
      • Dijkstra 와의 차이점 : 음수 가중치에대해서도 가능
      • 주의할 점 : 음수 사이클이 없으면 다익스트라 ( 시간 복잡도 )
    3. Floyd-Warshall
      • 목적 : 모든 정점에 대해서 모든 경우의 수를 고려하여 최단경로를 갱신 ( 시작 ,중간, 끝 노드를 가질 때)
      • Dijkstra 와의 차이점 : 시작 정점이 정해져 있지 않다.

        한진: P Stage 향후 계획

  • 전체적인 구조:
    Data Exploration -> Data Preprocess -> Model Selection -> HyperParameter Optimization -> Ray tune -> Search Space
  • Model 로 다른 조와 정확도 차이점 내기 힘들다. 따라서 Data preprocess,Search Space 에 집중하여 정확도를 높여보자

기타 자유 주제

  • 알고리즘이 필요할까?

    • 딥러닝 자체엔 필요 없지만 문제해결능력의 객관적인지표
    • 개발을 할 때 알고리즘 가끔 필요
    • 코드 작성능력 ( 깔끔 )
  • 프로젝트 향후 계획

    • 사람이 많아 세부사항을 생각하여 나누자 (기간 , Task 크기)
    • Image classification Tutorial -> template화 해서 내용 복습하면서 플젝 대비 준비 운동하자
  • 앞으로의 발표

    • P Stage에서 쓰이는 기술을 요약하여 발표 ( Tutorial )
  • 모델 어떤 것을 사용 ?

    • CLIP , SOTA중 구현되지 않은 논문 구현..? ( 조금 어려움 ), 그런 모델 말고 사용하기 쉬운 모델에서 파라미터를 조정하여 진행하자

학습 회고

  • 분량이 상당해서 내용을 미처 다 소화하지 못 했다.

오늘 남은 학습 내용

  • 시각화: 3-1 text. 실습
  • PyTorch: 3강 프로젝트 구조 이해: 직접 작성하면서 내용 파악하기
  • 필수과제: gather, scatter, linalg.qr, 등 일부 함수의 작동원리, 3D gather, scatter 처리(이거 나중에 NLP 모델 구현시 꼭 필요한 내용)
Comments