무슨 생각을 해 그냥 하는거지

[학습정리] 2021-08-20 본문

Naver AI Tech 2기/Today I Learned

[학습정리] 2021-08-20

빛나는콩 2021. 8. 20. 22:32

※ 정보전달이 목적인 포스트가 아니라 개인 학습 기록 및 정리가 목적인 포스트입니다 ※

해당 포스트는 네이버 커넥트 재단의 부스트캠프 마스터님이신 최성철 교수님의 강의를 바탕으로 작성되었습니다.

 

1. 강의 복습 내용

[Multi-GPU 학습]

기본 개념 - Node

  • Node는 system 혹은 컴퓨터라고 생각하면 된다.
  • 만약 한 개의 컴퓨터에 있는 여러 개의 GPU를 사용한다면 Single Node Multi GPU라고 한다.

 

Multi-GPU에 학습을 분산하는 방법 1. Model Parallel (모델 나누기)

  • AlexNet을 생각하면 된다. 예전에는 GPU memory가 정말 작아서 여러 GPU를 사용한 것이지만 요즘에는 모델이 너무 커져서 multi-GPU의 필요성이 더욱 커지고 있다.

  • 위의 그림은 두 개의 GPU를 사용하고 있지만, 사실 GPU가 노는 구간이 생기기 때문에 좋은 병렬화가 아니다. 두 개의 GPU가 쉬는 구간 없이 동시에 작업을 해야 좋은 병렬화라고 할 수 있다. 아래 그림에서 subscript의 두 번째 숫자는 batch 번호를 의미한다.
  • .to('cuda:0') .to('cuda:1') → 이런 식으로 각각의 모델을 다른 GPU에 할당할 수 있다. 

 

Multi-GPU에 학습을 분산하는 방법 2. Data Parallel (데이터 나누기)

  • 데이터를 나눠서 각각 다른 GPU에 할당했다가, 결과를 평균을 취하는 방법

  • 위 그림에서 backward의 첫 번째를 보면 하나의 GPU가 다른 GPU에서 만들어진 결과로 모든 loss를 계산하는 것을 볼 수 있다. 이렇게 단순히 데이터를 분배한 후 평균을 취하면, GPU 사용이 불균형하게 이뤄진다는 단점이 있다.
  • PyTorch는 Data parallel 방식 두 가지가 있는데, 하나는 위의 case인 DataParallel이며 다른 하나는 DistributedDataParallel이다.
  • DistributedDataParallel은 각 CPU(GPU말고 CPU도 있으니까)마다 process를 생성하여 개별 GPU에 할당하는 방식이다.
### DataParallel ###
paralllel_model = torch.nn.DataParallel(model)

### DistributedDataParallel Needs Sampler ###
train_sampler = torch.utils.data.distributed.DistributedSampler(train_data)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=BATCH_SIZE, shuffle=True,
					pin_memory=True, num_workers=3, sampler=train_sampler)

DataParallel은 코드가 굉장히 간단한데 비해 (모델에만 정의해주면 됨)

DistributedDataParallel은 sampler도 필요하고.. 멀티프로세싱 통신 규약 정의도 해줘야 하고..

 

[Hyperparameter Tuning]

성능을 끌어올리는 방법 세 가지.

  1. 모델을 바꾼다.
  2. 새로운 데이터를 추가하거나 기존 데이터를 수정한다.
  3. Hyperparameter Tuning

이 중에서 가장 효과적인 방법은 2번이다. 실제로 졸업 프로젝트할 때 데이터를 조금 더 추가했더니 성능이 월등하게 향상되는 것을 확인할 수 있었다. 역시 딥러닝은 데이터 싸움이다..

모델은 일반적으로 보통 처음 시작할 때 성능이 제일 좋을 것 같은 것을 쓴다. 어떤 task에 대해 성능이 좋은 모델은 자명하니까.. 그래서 사실 모델을 바꾼다고 해도 거기서 거기다.

Hyperparameter Tuning은 가장 마지막에 해볼 법한 방법이다. 성능을 최대한 끌어올린 뒤에, 마지막 0.001이 아쉬워서 하는 것...

 

Hyperparameter Tuning의 방법

  1. Random: 어떤 규칙없이 무작위로 선택해보는 방법이다.
  2. Grid Layout: 하나를 고정시키고 순서대로(grid를 그리며..) 바꿔보는 방법이다. 아래 그림에서 가로가 learning rate고 세로가 batch size일 때, 왼쪽부터 learning rate 0.1, 0.01, 0.001이라 하고 위에서부터 batch size 32, 64, 128이라고 하자. 왼쪽 맨위 점(learning rate 0.1, batch size 32)에서부터 한 칸씩 옆으로 이동하면서 값을 바꾸보는 것이다.
  3. 베이지안 최적화
  4. Ray

 

 


2. 과제 수행 과정 / 결과물 정리

[선택과제 Transfer Learning + Parameter Tuning]

- xavier uniform으로 파라미터 초기화하기

torch.nn.init.xavier_uniform_(model.layer.weight)

layer 예시) conv1

 

 


3. 피어세션 정리

  • 다른 캠퍼님께서 오늘자 강의 요약 발표를 해주셨다.
  • 팀 회고지를 함께 작성했다.

 


4. 학습 회고

  • 이번주는 과제를 해결하는 데 급급해 부족한 부분을 채울 시간이 없었던 것 같다. 과제를 하기 위한 공부를 하는 게 나 스스로 느껴져서 괴로웠다. 그럼에도 불구하고 과제는 곱씹어 생각할 수록 좋은 과제였다. 부스트캠프에서 제공하는 과제들을 퀘스트처럼 해결하면서 성장할 거라고 믿어야지.
  • PyTorch에 대해 속속들이 알아갈 수 있었던 주였다. (이렇게 PyTorch documentation을 source까지 뒤지면서 열심히 보는 건 처음인 것 같다. 물론 아직 한참 멀었지만)
  • 다음주는 드디어 고대하던 P stage! 팀원분들께 민폐만 안됐으면 좋겠다.

 

tmi) 까먹을까봐 드디어 도메인 결정 폼을 제출했다..🙌 Custom dataset 과제를 하면서 ag_news 데이터셋을 만드는 부분이 생소하게 느껴져서 '나 NLP 할 수 있을까..?'란 생각이 들었는데 이제 돌이킬 수 없다. 부딪쳐보는거지 뭐~

 

 

'Naver AI Tech 2기 > Today I Learned' 카테고리의 다른 글

[학습정리] 2021-08-24  (0) 2021.08.24
[학습정리] 2021-08-23  (0) 2021.08.24
[학습정리] 2021-08-19  (0) 2021.08.20
[학습정리] 2021-08-18  (0) 2021.08.20
[학습정리] 2021-08-17  (0) 2021.08.17