BoostCamp

2021.08.20 - [Week 3] Day 4. -

배기니어 2021. 8. 21. 22:27

굉장히 하루를 알차게 보낸 느낌이다.

허투루 보낸 시간이 거의 없었던 것 같다.

멘토님과 같이 논문 리뷰를 했는데 재미있었다.

안그래도 바쁘실텐데 늦은 시간까지 오랫동안 같이 봐주셔서 정말 감사하다.

 


공부한 내용

1. Multi-GPU 학습

 1.1. 개념

  • Single vs. Multi : GPU의 수

  • Node : 시스템 혹은 컴퓨터

  • Single Node Single GPU : 하나의 노드(컴퓨터)에 하나의 GPU

  • Single Node Multi GPU : 하나의 노드에 여러 개의 GPU

  • Multi Node Multi GPU : 여러 개의 노드마다 여러 개의 GPU

 

 1.2. Model parallel

  • 학습 분산 방법

   - 모델 병렬화 : 모델 나누기 (e.g. AlexNet)

   - 데이터 병렬화 : 데이터 나누기

  • 병렬화는 각각 시간에 맞게 처리해서 유휴시간을 없애야 한다.

  • PyTorch에서 사용법

 

 1.3. Data parallel

  • 데이터를 나눈 후 각 결과에 평균을 취해 반영하는 방법

  • 작업 순서

   1) data를 나눈다.

   2) gpu마다 모델을 복사한다.

   3) forward

   4) 연산 결과를 한 곳에 모아 loss 한 번에 계산

   5) gradient 계산

   6) backward는 반대 순서로

  • PyTorch에서 사용법

   - DataParallel

    · 단순히 데이터 분배 후 평균취하는 방식

    · coordinator 역할을 하는 gpu는 메모리 초과

    · coordinator : 다른 gpu가 해야할 일을 처리하고 나누는 역할

   - DistributedDataParallel

    · Distributed : 각 gpu의 연산 결과를 모으는 작업이 필요 없다.

    · gpu마다 하나의 cpu 할당

    · 각 gpu에서 forward, backward 개별적으로 연산 후 결과에 평균을 취하는 방법

   - Pin memory : 메모리에 데이터 바로 올릴 수 있도록 데이터를 저장

   - batch_size = int(batch_size / n_gpus) : 데이터 자르는 기준은 gpu의 수

 

2. Hyperparameter Tuning

 2.1. 성능 향상 방법

  • 모델 바꾸기 : 성능 좋은 모델은 이미 알려져 있어서 미미한 효과

  • 데이터 바꾸기 : 가장 좋은 효과

  • Hyperparameter tuning : 가장 안좋은 효과, 가장 나중에 시도하는 방법

 

 2.2. Hyperparameter

  • 사람이 정하는 학습하지 않는 값

  • Recipe처럼 모델마다 정해진 값이 좋은 성능 발휘

 

 2.3. Hyperparameter Tuning

  • Grid Layout

   - 값을 정할 때, 일정한 범위를 정해서 나누는 방법

   - 차례대로 학습 후 성능 좋은 Hyperparameter 선택

   - 지수 단위로 변한는 값들은 log 취해서 조정

  • Random Layout

   - random하게 값들을 찾아 학습 후 성능 좋은 것 선택

  • BOHB (Bayesian Optimization Hyper Band)

 

 2.4. Ray

  • Hyperparameter tuning 위한 도구

  • ML/DL의 병렬 처리 지원

  • PyTorch에서 사용법

   - config : 학습 공간 지정

   - scheduler : 학습 scheduling algorithm 지정, 의미없는 결과에 대한 hyperparameter는 삭제

   - reporter : 결과 출력 양식 지정

 

3. PyTorch Troubleshooting

 3.1. OOM (Out Of Memory)

  • 해결 어려운 이유

   - Why? Where?

   - iteration을 돌면서 메모리의 이전 상황을 파악하기 어려워진다.

   - 간편한 해결방법 : Batch size 줄이고 GPU 메모리를 지운 후 다시 실행

   - batch size 조정해서 실행 : 줄여도 계속 문제가 된다면 batch size를 1로 조정해서 실행

 

 3.2. GPU 상태 파악

  • GPUUtil

   - GPU마다 점유율, 메모리 사용률 확인 

   - torch.cuda.empty_cache()

    · garbage collector 기능을 강제로 하는 역할

    · gpu상 사용되지 않는 메모리, 변수 정리해서 메모리 확보

    · backward 실행마다 미분 가능한 tensor가 buffer에 쌓여서 메모리 부족해지는 문제 해결

  • Training loop

   - Training loop에서 backward 수행 시 축적되는 tensor 확인

   - 1D tensor는 python 기본 객체로 변환 (tensor.item() or float(tensor))

 

3.3. del

  • del

   - gpu에서 메모리 해제

   - 메모리 확보 시점은 garbage collection하는 시점

   - 필요없는 변수는 삭제

 

 3.4. torch.no_grad()

  • Inference(test) 시점에서 사용

  • backward 일어나지 않아 추가 메모리 사용하지 않음

 

 3.5. 그 외 error

  • LSTM : backward propagation이 길게 일어나 메모리 많이 사용

  • CNN에서 마지막 layer parameter 수 맞추기

 

4. 스페셜 피어 세션

 • 자기소개

 • 강의, 과제 난이도

  - 이번 주는 어려웠던 편

  - 처음부터 어려웠던 분들도 (본인 포함)

 • 공부 내용 정리 방법 공유

  - 블로그, notion, notebook 등

 • 피어 세션 활동 내용 공유

  - 강의, 과제 내용 질문

  - 남는 시간 자습

  - 논문 리뷰

  - 공부한 내용 발표

 • 멘토링 활동 내용 공유

  - 강의, 과제 내용 질문

  - 진로, 취업 문제 상담

  - 도메인 선택 질문

 • 스터디 활동 : 팀 회의실에서 자습

 • 논문 리뷰 방법 : 2명씩 선택과제 관련 논문 읽고 발표

 • Ice Breaking

  - 주말에 뭐하시는지?

  - 취업 or 대학원?

  - 롤링 페이퍼

 

5. 피어 세션

 • 과제 질문

  - 필수과제 AG News 데이터셋 전처리 후 X에 저장하는게 맞는지?

  - Titanic Dataset Feature, classes 생성 방법

  - Titanic classes가 ["PassengerId", "Survived"]가 맞는지

  - 필수과제 답안과 비교

  - tensor dtype 정의 가능

 • 팀 회고록 정리

 • 스페셜 피어 세션 얘기

 • MLOps 스터디 얘기

 • 선택과제 tqdm 구현

 • Hyper Clova 얘기

 

6. 오피스 아워

 6.1. 필수과제 1번

  • PyTorch 사용법을 익히기 위한 과제

  • Release Status : beta 버전의 함수 사용하면 다음 버전에서 호환성 문제 발생할 수 있다.

  • Documentation : Documentation에 익숙해져야 한다.

  • 사칙연산 : torch의 어떤 함수를 이용하는지 정확히 파악

  • ModuleList vs. List : 리스트 사용해도 되지만 무엇을 하는지 정확히 알 때 사용, ModuleList 사용 권장

  • gather

   - 대각 요소 추출

   - 인덱스와 차원의 개념

   - 인덱스 정의 방법

  • Module 분석

   - 기존 모델 분석하기 위해 공부

   - 모델 구조 모르는 경우, 특정 weight만 변경하고 싶은 경우 등 대비

  • hook

   - 모델 특정 부분에서 발생하는 일 파악

   - 디버깅에 사용하면 편리

  • apply

   - 가중치 초기화에서 많이 사용

   - 함수 내부에서 특정 함수 적용 가능

 

6.2. 필수과제 2번

  • Custom Dataset과 Custom DataLoader 만들기 위한 과제

  • random SEED 고정

  • __getitem__

   - 시계열 데이터는 sliding 필요 -> 인덱스 중요

   - return시 tensor로 wrapping해서 return 권장 -> 학습시 tensor로 변환해서 학습하는 번거로움 해결

  • sampler : colab이 제공하는 process 수가 많지 않아 num_workers 높이면 문제 발생, 시간 늘어남

  • collate_fn

   - NLP같은 경우 data의 sequence가 달라 문제 발생

   - 문제 해결에 zero padding 같은 방법 적용하기 위해 사용

  • toPILImage

   - tensor는 PIL로 변환해야 image로 변환 가능

   - toPILImage로 한 번에 변환 가능

  • torchtext

   - y, X 순으로 feeding

   - tokenizer 통해 전처리

   - AG_NEWS같은 data는 preprocessing 후 Dataset, DataLoader 만들면 작업 시간 단축 가능

  • Titanic Dataset의 class : ["Dead", "Survived"]

  • Dataset의 class 정의는 hard-coding하는 것이 좋다.

 

 6.3. 선택과제

  • Model과 Dataset 모두 공부하기 위한 과제

  • U stage에서 P stage의 징검다리

  • Transfer learning : 다른 분야에서 target task로 정보 전이

  • 성능 향상 방법

   1) Dataset 확인

   2) Test data augmentation

   3) ...

  • Ray는 병렬처리 환경이 있는 linux에서 돌리는 것이 좋다.

  • config_space : 가설

  • ImageNet (Pretrained Model) : 통제변인

 

 6.4. QnA

  • PyTorch 사용법

   - 부덕이와 함께하는 dictionary 참고

   - github PyTorch에서 코드 확인

   - documentation 잘 보기

   - documentation이 친절하지 않은 경우 본인이 직접 공부하고 글 작성

  • Domain 선택

   - CV는 business적으로 좋은 분야

   - NLP는 연구하기 좋은 분야

   - 초기에는 흥미가 있는 분야 선택 후 나중에 제약이 생기면 도메인 변경

 

7. 논문 리뷰 (GAN)

 • 멘토님과 논문 리뷰 연습

 • 모르는 키워드는 구글링하면서 읽어나가기

  - tip : 엑셀에 keyword, reference site 매핑

 • 연구할 때는 abstract, conclusion(result) 보고 논문 판단

 • 중요하지 않은 부분은 스킵 후 읽으면서 나중에 막히면 찾아보기

 • back propagation은 loop가 없는 network에서 쓸 수 있다.

 • input noise variable p_z(z) : input

 • 수식 이해하기

  - Value function에서 log가 붙은 이유, expectation 사용 이유

  - z와 x의 관계

  - tip : wolframalpha.com

 • GAN 학습 순서 : D k회 학습 -> G 학습

 • 증명 과정 이해하기

 • GAN 평가 metric : TFD

 • 향후 과제 : conditional generative model == InfoGAN

 • 이미지 분류 대회 진행 아이디어