굉장히 하루를 알차게 보낸 느낌이다.
허투루 보낸 시간이 거의 없었던 것 같다.
멘토님과 같이 논문 리뷰를 했는데 재미있었다.
안그래도 바쁘실텐데 늦은 시간까지 오랫동안 같이 봐주셔서 정말 감사하다.
공부한 내용
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
• 이미지 분류 대회 진행 아이디어
'BoostCamp' 카테고리의 다른 글
2021.08.24 - [Week 4] Day 2. 대회 진행 중 (0) | 2021.08.25 |
---|---|
2021.08.23 - [Week 4] Day 1. 대회 시작 (0) | 2021.08.23 |
2021.08.19 - [Week 3] Day 3. 긴 밤 지새우고 (0) | 2021.08.20 |
2021.08.18 - [Week 3] Day 2. (0) | 2021.08.19 |
2021.08.17 - [Week 3] Day 1. 거북이 (0) | 2021.08.18 |