ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 부스트캠프 ai tech 2기 3주차 학습 정리 노트
    Boostcamp AI Tech 2기 2021. 8. 20. 23:04

    강의 복습

    2강 PyTorch Basics

    Tensor : 다차원 Arrays 를 표현하는 PyTorch 클래스. 사실상 numpy의 ndarray와 동일하다. 그러므로 TensorFlow의 Tensor와도 동일하며, Tensor를 생성하는 함수도 거의 동일하다.

    Tensor handling : 

     - view : reshape과 동일하게 tensor의 shape을 변환한다. view와 reshape은 contiguity 보장의 차이가 있다.(view가 보장)

     - squeeze : 차원의 개수가 1인 차원을 삭제 (압축)

     - unsqueeze : 차원의 개수가 1인 차원을 추가

    Tensor operations : 기본적인 tensor의 operations는 numpy와 동일하다. 행렬곱셈 연산은 함수는 dot이 아닌 mm 사용한다.(dot은 내적, mm은 행렬곱) matmul은 mm과 유사하나 broadcasting을 지원해 차원이 맞지 않더라도 행렬곱을 가능하게 한다. nn.functional 모듈을 통해 보다 다양한 수식 변환을 지원한다.

    AutoGrad : PyTorch의 핵심은 backward 함수를 사용하는 자동 미분의 지원이다.

    4강 AutoGrad & Optimizer

    torch.nn.Module

     - 딥러닝을 구성하는 Layer의 base class

     - Input, Output, Forward, Backward 정의

     - 학습의 대상이 되는 parameter(tensor) 정의

    nn.Parameter :

     - Tensor 객체의 상속 객체

     - nn.Module 내에 attribute가 될 때는 required_grad=True 로 지정되어 학습 대상이 되는 Tensor

     - 우리가 직접 지정할 일은 잘 없으며 대부분의 layer에는 weights 값들이 지정되어 있음

    Backward :

     - Layer에 있는 Parameter들의 미분을 수행

     - Forward의 결과값(model의 output=예측치)과 실제값간의 차이(loss)에 대해 미분을 수행

     - 해당 값으로 Parameter 업데이트

    Backward from the scratch :

     - 실제 backward는 Module 단계에서 직접 지정가능

     - Module에서 backward 와 optimize 오버라이딩

     - 사용자가 직접 미분 수식을 써야하는 부담 → 쓸일은 없으나 순서는 이해할 필요는 있음

    5강 PyTorch datasets & dataloaders

    Dataset 클래스 :

     - 데이터 입력 형태를 정의하는 클래스

     - 데이터를 입력하는 방식의 표준화

     - Image, Text, Audio 등에 따른 다른 입력정의

    DataLoader 클래스 :

     - Data의 Batch를 생성해주는 클래스

     - 학습직전(GPU feed전) 데이터의 변환을 책임

     - Tensor로 변환 + Batch 처리가 메인 업무

     - 병렬적인 데이터 전처리 코드의 고민 필요

    6강 모델 불러오기

    model.save()

     - 학습의 결과를 저장하기 위한 함수

     - 모델 형태(architecture)와 파라메터를 저장

     - 모델 학습 중간 과정의 저장을 통해 최선의 결과모델을 선택

     - 만들어진 모델을 외부 연구자와 공유하여 학습 재연성 향상

    checkpoints :

     - 학습의 중간 결과를 저장하여 최선의 결과를 선택

     - earlystopping 기법 사용시 이전 학습의 결과물을 저장

     - loss와 metric 값을 지속적으로 확인 저장

     - 일반적으로 epoch, loss, metric을 함께 저장하여 확인

     - colab에서 지속적인 학습을 위해 필요

    Transfer learning :

     - 다른 데이터셋으로 만든 모델을 현재 데이터에 적용

     - 일반적으로 대용량 데이터셋으로 만들어진 모델의 성능 ↑

     - 현재의 DL에서는 가장 일반적인 학습 기법

     - backbone architecture가 잘 학습된 모델에서 일부분만 변경하여 학습을 수행함

    7강 Monitoring tools for PyTorch

    Tensorboard :

     - TensorFlow의 프로젝트로 만들어진 시각화 도구

     - 학습 그래프, metric, 학습 결과의 시각화 지원

     - PyTorch도 연결 가능 → DL 시각화 핵심 도구

    weight & biases :

     - 머신러닝 실험을 원활히 지원하기 위한 상용도구

     - 협업, code versioning, 실험 결과 기록 등 제공

     - MLOps의 대표적인 툴로 저변 확대 중

    8강 Multi-GPU 학습

    Model parallel :

     - 모델을 나누는 것은 생각보다 예전부터 썼음 (alexnet)

     - 모델의 병목, 파이프라인의 어려움 등으로 인해 모델 병렬화는 고난이도 과제

    Data parallel :

     -  데이터를 나눠 GPU에 할당후 결과의 평균을 취하는 방법

     -  minibatch 수식과 유사한데 한번에 여러 GPU에서 수행

    -  DataParallel : 단순히 데이터를 분배한후 평균을 취함 GPU 사용 불균형 문제 발생, Batch 사이즈 감소 (GPU가 병목), GIL

    -  DistributedDataParallel :  CPU마다 process 생성하여 개별 GPU에 할당 기본적으로 DataParallel로 하나 개별적으로 연산의 평균을 냄

    9강 Hyperparameter Tuning

    Hyperparameter Tuning :

     - 모델 스스로 학습하지 않는 값은 사람이 지정 (learning rate, 모델의 크기, optimizer )

     - 하이퍼 파라메터에 의해서 값이 크게 좌우 될 때도 있음 (요즘은 그닥?)

     - 마지막 0.01을 쥐어짜야 할 때 도전해볼만!

    Ray :

     -  multi-node multi processing 지원 모듈

     -  ML/DL의 병렬 처리를 위해 개발된 모듈

     -  기본적으로 현재의 분산병렬 ML/DL 모듈의 표준

     -  Hyperparameter Search를 위한 다양한 모듈 제공

    10강 Pytorch Troubleshooting

    GPUUtill :

     -  nvidia-smi 처럼 GPU의 상태를 보여주는 모듈

     -  Colab은 환경에서 GPU 상태 보여주기 편함

     -  iter마다 메모리가 늘어나는지 확인!!

    torch.cuda.empty_cache() :

     -  사용되지 않은 GPUcache를 정리

     -  가용 메모리를 확보

     -  del 과는 구분이 필요

     -  reset 대신 쓰기 좋은 함수

    그 외 :

    trainning loop에 tensor로 축적 되는 변수는 확인할 것 : 1-d tensor의 경우 python 기본 객체로 변환하여 처리할 것

    del 명령어를 적절히 사용하기 : python의 메모리 배치 특성상 loop 이 끝나도 메모리를 차지함

    가능 batch 사이즈 실험해보기 : 학습시 OOM 이 발생했다면 batch 사이즈를 1로 해서 실험해보기

    torch.no_grad() 사용하기

    과제 수행 과정 및 결과

    이번주 필수과제는 매우 어려웠다. 지금까지의 필수과제 중 가장 어려웠다. 역시 파이토치는 쉽지 않다는 생각이 들었으나, 과제를 꾸역꾸역 도전하며 파이토치를 조금은 배운 것 같다는 생각이 들었다. 역시 언어 공부는 문제를 해결하는 과정에서 부딪혀보는 것이 가장 효과적임을 실감했다. 선택과제는 마지막날까지 필수과제에 허덕이다 보지 못했기에 주말에 봐야겠다.

     

    피어 세션

    금주의 피어세션에서는 pull request를 하는 방법을 배울 수 있었다. 내가 잘 못 따라갔는데 조원분들이 친절히 알려주셔서 첫 풀리퀘를 올릴 수 있었다. 항상 도움을 많이 주시는 우리 조원분들께 감사할 따름이고, 나도 우리 조에 도움이 되도록 더욱 노력해야겠다 다짐했다. 그 외에도 매일 돌아가며 당일 학습 내용을 가볍게 설명하기 시작했고, 트랜스포머 논문을 다같이 읽어보기로 했으며 알고리즘 스터디는 진행하다가 중단한 상태이다. 함께 발전하는 즐거움을 깨달아가 즐거운 요즘이다.

    학습 회고

    과제는 어려웠지만 어찌저찌 대부분 해결했고, 강의는 비교적 술술 들을 수 있었다. 그러나 아직은 배운 것들이 머릿속에서 아름답게 정렬돼 필요한 것을 적재적소에 뽑아쓸 수 있는 상태가 아니다. 주말 동안 간단한 파이토치 작업을 해보며 배운 것들을 활용하고 정리해봐야겠다.

    어느덧 첫 p-stage를 앞둔 상태가 되었는데, 그동안 공부하며 나는 정말 많은 것을 모르고 있고, 배우고 익혀야할 내용이 방대함을 느꼈다. 부캠을 시작하기 전은 어디로 가야할지 몰라 오히려 겁이 없었다면, 가야할 험난한 길이 차차 보이기 시작한 요즘은 되려 겁을 먹는 것 같은 기분도 든다. 하지만 넓은 세상을 마주하는 것은 필수적이고 이르면 이를수록 좋을 것이기 때문에 앞으로 큰 도화지를 꼼꼼히 채우는 이 과정을 즐겨야할 것이다. 내일을 위한 오늘을 살고 있는 것 같아 행복하다.

    댓글

Designed by Tistory.