Multi-GPU 학습과 PyTorch Troubleshooting에 대하여 (Boostcamp AI Tech 강의)

유상준·2022년 9월 30일
0

8강 - Multi-GPU 학습

  • 예전에야 적은 리소스, 적은 데이터로 학습하는 모델을 개발하려 했지만, 요즘은 리소스의 제약 없이(Multi-GPU학습과 같은) 많은 데이터와 싸움하려고 한다.
  • GPU를 얼마나 확보했는가가 오늘날의 딥러닝 연구에서 중요한 쟁점이다.
  • 우리 환경에서는 각자 GPU 1장씩.. 개념적으로 어떻게 Multi-GPU 학습이 이루어지는지 알아보자

Multi-GPU 학습 방법

  • 다중 GPU에 학습을 분산하는 방법에는 두가지 방법이 있다.
    1. 모델을 나누기 (Alexnet : 생각보다 예전부터 썼음)
      • 모델의 병목화, 파이프라인의 어려움으로 인해 모델 병렬화는 고난이도 과제이다.
    2. 데이터를 나누기

9강 - Hyperparameter Tuning

어떻게 하면 하이퍼 파라미터를 잘 조정해서 성능을 올릴 수 있을까? (ex, learning_rate…)
최근에는 도움을 주는 도구들이 많이 나와서 편리하게 할 수 있다.

  • 성능을 높이는 방법
    1. 모델을 바꾼다 (더 좋은 모델, deep한 모델 등..)
    2. 데이터를 바꾼다 (데이터의 품질을 높이거나, 양을 늘리거나)
    3. Hyperparameter Tuning (생각보다는 다이나믹한 효과가 있지 않음)

위 방법중에서는 2번의 방법이 가장 중요하고 효과가 좋다! 데이터는 다다익선
3번의 방법은 정말 마지막 쥐어짜기 할 때 도전하는 방법 (예전보다 중요성이 많이 낮아지긴 했다)

  • 주요 방법 (grid search vs random)
  1. gird search : 0.1, 0.01, 0.001 .. 등과 같이 일정한 범위를 두고 성능이 가장 좋은것을 선택
    (보통 log 단위 형태로 증가 감소 시킴, 0.01 vs 0.02 이런식으로는 하지 않는다)
  2. Random layout : 값들을 무작위로 선정해서 그 중 성능이 잘 나온 것들을 선택 (일정한 범위를 두지 않고)
  3. BOHB(2018) 논문을 기반으로 베이지안 기반 기법들이 주도하고 있는 형태

Ray

multi-node multi processing 지원 모듈 (여러 컴퓨터에서 병렬 처리 할 수 있게끔)
ML/DL의 병렬 처리를 위해 개발된 모듈 (현재 분산 병렬 ML/DL 모듈의 표준)
Hyperparameter Search를 위한 다양한 모듈 제공

ASHAScheduler : loss가 잘 안나오는 아이들은 더이상 학습을 진전시키지 않으면서 cut해가는 형태로 리소스를 아낀다

Hyperparameter Tuning은 시간대비 성능이 잘 나오지 않기 때문에, 가벼운 모델들이 더 나은 성능을 보이도록 하기 위한 목적으로 사용하거나 모델과 데이터를 잘 선정하여 어느 정도 성능이 나왔을 때 마지막 단계에서 시도해 보는 것이 좋다. 중점은 얼마나 좋은 데이터를 많이 모으느냐!!


10강 - PyTorch Troubleshooting

FAQ 비슷한 느낌의 강의, 앞으로 일어날 문제들을 스스로 해결할 수 있어야 한다!

OOM(Out Of Memory )

  • 왜, 어디서 발생했는지 알기 어려움
  • Error backtracking이 이상한데로 가버림
  • 메모리의 이전상황의 파악이 어려움..(iteration을 돌면서 특정상황에 발생해버리기 때문에, 정확한 상황을 알지 못하여 대응하기 어렵다)

해결 방법

  1. Batch size를 줄인다
    • 학습시 OOM이 발생했다면, batch size를 1로 해서 실험해보기

1. GPU clean 시켜준다

  • torch.cuda.empty_cache()
  • 사용되지 않는 CPU상의 cache를 정리하여 가용 메모리를 확보
  • del과는 구분이 필요하며(del은 메모리와의 관계를 끊는 것), reset 대신 쓰기 좋은 함수
  • 학습전에 사용하면, 이전 학습에 이용했던 cache를 한 번 비워주므로 유용하게 이용 가능

2. GPUUtil을 사용한다

  • nvidia-smi 처럼 GPU의 상태를 보여주는 모듈
  • Colab은 환경에서 GPU 상태를 보여주기 편하다
  • iteration마다 메모리가 늘어나는지 확인할 수 있다 (메모리가 잘못 쌓이고 있는지 확인 가능)
        

3. training loop에 사용되는 tensor변수 확인

  • tensor로 처리된 변수는 GPU상의 메모리를 사용하게 된다
  • 해당 변수가 loop안에서 연산이 되면, GPU에 computational graph를 생성한다 (메모리 잠식)
  • 1-d tensor의 경우에는, python 기본객체로 변환하여 처리하는것이 효율적이다
    • 변수뒤에 .item을 붙여주거나, float(변수)등으로 처리

4. 필요가 없어진 변수는 적절한 삭제 (del 명령어)

  • python은 loop이 끝나도 메모리를 차지하게끔 설계

5. torch.no_grad() 사용하기

  • Inference 시점에서 사용하면, backward pass로 인해 쌓이는 메모리에서 자유롭다
    (test data set의 결과값 예측에서는 backward 과정이 필요 없기 때문에)

기타 trouble..

  1. colab에서 너무 큰 사이즈의 모델은 실행하지 말 것 (특히 LSTM)
  2. CNN에서의 대부분 에러는 사이즈가 안맞아서 발생한다.
    (torchsummary 등을 적절하게 이용해서 사이즈를 맞춰보자)
  3. tensor의 float precision을 16bit로 줄여보자

느낀점

  • Hyperparameter Tuning
    타 강의와 교육과정에서도 들었듯이, 요즘은 굉장히 다양한 좋은 모델들이 많이 배포되어있고 그 모델을 끌어와서 학습하는것이 가능해졌기 때문에 좋은 모델을 선정하여 성능을 높이거나 양질의 데이터를 확보하는것이 중요하다는것을 다시금 알게 되었다. 이전에 했던 머신러닝 프로젝트들의 경우 하이퍼파라미터를 튜닝하는 과정에 시간을 많이 들이기도 하였는데, 그것보다는 데이터를 더 잘 정제하고 관리하는데에 시간을 쓰는것이 효율적이었을 수도 있겠다는 생각을 하게 되었다.

게시글에 쓰인 자료는 Boostcamp AI Tech의 교육 자료를 참고하였습니다.

profile
데이터 사이언티스트 지망생

0개의 댓글