Skip to main content

모델 학습을 위한 GPU 사용량 모니터링과 개선

놀랍게도 사용자 중 거의 3분의 1이 평균 GPU 활용도가 15% 미만입니다 이 기사는 AI 번역본입니다. 오역이 의심되면 댓글로 알려주세요
Created on September 15|Last edited on September 15
Weights & Biases를 운영하면서 가장 흥미로운 점 중 하나는 실제 환경에서 모델이 계산 자원을 어떻게 사용하는지 연구할 수 있다는 것입니다. 우리는 GPU와 메모리 모니터링을 단순화하고 있기 때문에, 사용자들이 계산 자원을 얼마나 잘 활용하는지 살펴보고 도움을 드리고자 했습니다.


GPU에서 학습하는 사용자들의 모든 러닝을 대상으로 평균 GPU 활용도를 살펴봤습니다. 사용자 중 거의 3분의 1이 평균 GPU 활용도가 15% 미만이었습니다. 평균 GPU 메모리 사용량도 비슷한 양상을 보였습니다. 우리 사용자들은 대체로 숙련된 딥러닝 실무자이고 GPU는 비용이 큰 자원임에도, 평균 활용도가 이렇게 낮다는 점은 다소 의외였습니다.
거의 모든 사람이 적용할 수 있는, GPU 활용도를 쉽게 높이는 구체적인 제안 몇 가지입니다:


1. 전체 학습 러닝 동안 GPU 활용도를 꾸준히 측정하세요

측정하지 않으면 GPU 활용도를 개선할 수 없습니다. nvidia-smi 같은 유용한 도구로 스냅샷을 확인하는 것은 어렵지 않지만, 문제를 찾는 가장 간단한 방법은 시간에 따른 활용도를 추적하는 것입니다. 누구나 백그라운드에서 시스템 모니터링을 활성화해, 코드에 두 줄만 추가하면 시간 경과에 따른 GPU, CPU, 메모리 활용도 등을 추적할 수 있습니다.
import wandb
wandb.init()
wandb.init() 함수는 시스템 지표를 수집하고 이를 wandb 서버로 전송하는 경량 하위 프로세스를 생성합니다. 그런 다음 서버에서 이 지표를 확인하고, 다음과 같은 그래프를 통해 여러 러닝 간에 비교할 수 있습니다.


단일 측정만으로는 GPU 활용도가 시간에 따라 달라질 수 있다는 위험이 있습니다. 우리 사용자 보리스가 RNN을 학습하는 사례에서 흔히 보이는 패턴인데, 학습 중반에 GPU 활용도가 80%에서 약 25%로 급락합니다.


그의 전체 통계와 학습 로그는 다음에서 확인할 수 있습니다 https://app.wandb.ai/borisd13/char-RNN/runs/cw9gnx9z/system
여러 GPU를 사용할 때 흔히 보이는 유사한 경우는 학습 중반에 일부 GPU가 더 이상 작업을 처리하지 않는 상황입니다. 이 예시에서는 두 GPU가 처음에는 모두 연산을 수행했지만, 몇 분이 지나자 모든 부하가 단일 GPU로 몰렸습니다. 의도한 동작일 수도 있지만, 대개는 코드에 숨어 있는 잡기 어려운 버그의 신호입니다.

또 다른 흔한 문제는 GPU를 오래 사용하지 않는 구간이 길게 지속된다는 점입니다. 이는 종종 학습 중 테스트나 검증 단계와 맞물리거나, 데이터 전처리 병목 때문에 발생합니다. 다음은 전형적인 그래프 예시로, 8개의 GPU로 학습할 때 일정 간격마다 모든 GPU가 꺼진 듯이 대기 상태로 들어가는 모습을 보여줍니다.




2. GPU가 병목인지 확인하세요

우리가 자주 보는 전형적인 상황입니다. 여기서는 시스템 메모리 사용량이 상당히 높고, 시간이 지날수록 점진적으로 증가하는 모습입니다. 메모리 사용량이 올라갈수록 GPU 활용도는 내려갑니다. 또한 데이터셋이 로컬에 없을 때 네트워크가 병목이 되는 경우도 자주 발생합니다.



3. 배치 크기를 늘려 보세요

모든 경우에 통하는 것은 아니지만, GPU 활용도를 높일 수 있는 간단한 방법 중 하나는 배치 크기를 늘리는 것입니다. 배치에 대한 그래디언트는 일반적으로 GPU에서 병렬로 계산되므로, 전체 배치와 신경망의 여러 복사본을 GPU 메모리에 담을 만큼 메모리가 충분하다면 배치 크기를 키우면 계산 속도가 빨라집니다.
배치 크기만 늘리고 다른 설정은 그대로 두면, 배치 크기를 늘리면 계산은 빨라지지만 모델 성능은 떨어진다고 결론 내릴 수 있습니다. 다음은 CIFAR를 배치 크기 32, 64, 128로 학습한 결과입니다.

실제로, 많은 논문 그리고 하나의 인기 게시물 Stack Overflow에서 대규모 배치 크기에 대한 경고가 있습니다. 하지만 더 큰 배치 크기를 무리 없�� 적용하는 간단한 방법이 있습니다. 배치 크기를 늘릴 때 학습률도 함께 올리세요. 직관적으로도 타당합니다. 배치 크기는 한 번의 업데이트 전에 학습 알고리즘이 보는 예시 수이고, 학습률은 대략 그 한 번의 업데이트 크기입니다. 따라서 모델이 더 많은 예시를 본다면 더 큰 보폭으로 이동해도 안정적일 가능성이 큽니다. 이는 다음 논문에서도 권장됩니다. 합성곱 신경망을 병렬화하는 의외의 한 가지 요령 그리고 나중에 정확하고 대규모 미니배치 SGD: 1시간 만에 ImageNet 학습하기 저자들은 성능 저하가 나타나기 전까지 배치 크기를 8000까지 늘리는 데 성공했습니다.
저도 제 모델에서 배치 크기와 함께 학습률을 높여 보았고, 같은 결론에 도달했습니다. 학습률을 4배로 올리고 배치 크기도 4배로 늘리면, 제 모델은 더 빠르게 학습이 진행되고 각 스텝에서의 학습 속도도 빨라집니다.


Facebook 논문에서는 매우 큰 배치 크기에서도 모델이 잘 작동하도록 여러 정교한 기법을 사용했으며, 배치당 최대 8000개 샘플까지 늘려도 동일한 성능을 유지하면서 훨씬 더 높은 속도를 달성했습니다.

이처럼 거대한 배치 크기는 분산 학습에서는 타당하며, 낮은 학습률로 시작해 점차 올리는 논문의 스킴은 그 맥락에서 매우 유용해 보입니다. 만약 하나의 GPU로 학습 중이고 GPU 활용도가 최대치에 못 미친다면, 간단히 이렇게 해 보세요: 배치 크기를 두 배로 늘리고 학습률도 두 배로 올리세요.
제 실험 실행에서 더 많은 데이터를 자세히 살펴보려면 배치 크기 보고서.


결론

GPU는 점점 더 빨라지고 있지만, 학습 코드가 이를 제대로 활용하지 못하면 의미가 없습니다. 다행히도 대부분의 머신러닝 모델을 학습하는 사람들에게는 효율을 크게 높일 수 있는 간단한 개선 방법이 아직 많이 남아 있습니다.
또 다른, 아마도 더 큰 자원 낭비가 있습니다. 사용되지 않은 채로 방치된 GPU입니다. 우리는 이를 직접 측정하지 않지만, 함께 일하는 많은 기업들로부터 경험적으로 자주 듣습니다. GPU에 작업을 효율적으로 대기열에 쌓는 것은 어렵습니다. 일반적인 워크플로에서는 연구자가 많은 실험을 설정하고, 완료될 때까지 기다린 다음, GPU가 유휴 상태로 있는 동안 결과를 해석하는 데 상당한 시간을 씁니다. 이는 wandb의 범위를 벗어나지만, 다음과 같은 도구들은 Paperspace 및 Amazon의 SageMaker 필요할 때마다 리소스를 손쉽게 생성하고 해제할 수 있게 해 줍니다.
편집과 피드백을 제공해 준 Sam Pottinger, Carey Phelps, James Cham, Yanda Erlich, Stephanie Sher께 감사드립니다.












이 글은 AI로 번역된 기사입니다. 오역이 의심되는 부분이 있으면 댓글로 알려 주세요. 원문 보고서는 아래 링크에서 확인하실 수 있습니다: 원문 보고서 보기