2021.08.20 - [Week 3] Day 4. -

2021.08.20 - [Week 3] Day 4. -

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

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

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

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

공부한 내용

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

• 학습 분산 방법

- 모델 병렬화 : 모델 나누기 (i.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

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

from http://bagineer.tistory.com/38 by ccl(A) rewrite - 2021-08-21 23:00:19