본문 바로가기
AI이야기

GPU 활용 극대화! 딥러닝 학습 속도 2배 UP 시크릿

by logbe1 2024. 11. 8.

딥러닝 모델 학습 시간을 단축시키고 싶은데, GPU를 제대로 활용하고 있는지 궁금하신가요? 혹시 GPU-Util이 낮아서 답답함을 느끼고 계신가요?

 

GPU-Util을 높이는 건 딥러닝 학습 속도를 끌어올리는 핵심 전략 중 하나에요. 딥러닝 모델 학습 과정에서 GPU가 얼마나 효율적으로 활용되는지 이해하고, 최대한 활용할 수 있도록 파이프라인을 최적화하는 방법을 알려드릴게요.

 

GPU-Util이 왜 중요할까요? 그리고 어떻게 하면 GPU-Util을 높일 수 있을까요?  이 모든 궁금증을 해소해 드릴게요!

 

GPU 활용 극대화를 통해 딥러닝 학습 속도를 획기적으로 향상시키는 방법을 알아보고, 딥러닝 성능 향상의 지름길을 찾아보세요!

 


GPU 활용 극대화: 왜 중요할까요?

딥러닝 모델 학습을 하다 보면, 으레 nvidia-smi 명령어를 통해 GPU의 상태를 확인하게 되죠. 그때 빼꼼히 보이는 GPU-Util이라는 수치. GPU가 얼마나 열심히 일하고 있는지를 알려주는 중요한 척도에요. GPU-Util이 높다는 건, 우리의 충실한 일꾼이 쉬지 않고 계산을 처리하며 학습에 매진하고 있다는 뜻이에요.

 

학교에선 이 GPU-Util을 대수롭지 않게 생각하는 경우가 많더라고요. 아마도 그 중요성을 놓치고 있는 걸지도 몰라요. 하지만, 실제 딥러닝 학습 파이프라인에서 GPU를 최대한 활용하는 것은 기본 중의 기본이에요.

 

저도 솔직히 한 달 전까지만 해도 GPU-Util의 중요성을 제대로 몰랐어요. 하지만, 제 사수님께 많은 걸 배우면서 GPU-Util을 높여야 하는 이유와 방법을 깨닫게 되었죠. 이제 그 소중한 경험을 여러분과 나누고 싶어요!

 


최고의 모델? 최적의 모델?

그럼 왜 GPU-Util을 높여야 할까요? 그냥 모델이 잘 학습되면 되는 거 아닌가요?  결과적으로 보면 맞아요. 어쨌든 모델을 잘 학습시키면 되는 거죠. 하지만, 여기서 잠깐! "잘 학습된 모델"이 뭘까요?

 

모델의 성능을 평가하는 다양한 방법들이 존재해요. 예를 들어, 이미지 분류에선 정확도(Accuracy), 자연어 처리에선 SQuAD, GLUE 점수 등을 사용하죠. 하지만, 이런 지표들은 현재 존재하는 모델들을 서로 비교하기 위한 기준일 뿐, 진정한 최고의 모델을 찾는 기준은 아니에요. 쉽게 말해, 모델 A와 모델 B 중 어떤 모델이 더 낫냐를 가려내는 용도인 거죠.

 

그럼 진짜 최고의 모델인지 아닌지를 판별하는 방법은 없을까요? 음… 쉽지 않아요. 우리가 풀고자 하는 문제의 해집합이 인간이 감당하기 힘든 고차원 공간이기 때문이에요. 이런 고차원 공간에는 정말 엄청나게 많은 Local Minimum들이 숨어있을 거고, 아무리 좋은 최적화 방법을 써도 최적의 해를 찾는다는 보장은 없어요.

 

결국, 우리가 만드는 모델은 최고의 모델이 될 수 없다라는 걸 인정해야 해요. 그럼 대신 뭘 할 수 있을까요? 바로 최고의 모델을 찾을 확률을 높이는 것이죠!

 


Analyze & Trial & Error

그렇다면 최고의 모델을 찾을 확률을 높이려면 어떻게 해야 할까요? 바로 Analyze & Trial & Error 전략이 필요해요!  결과를 분석하고, 에러를 찾고, 다시 시도하는 과정을 반복하는 거죠.  여기서 에러는 문법이나 의미 오류가 아니라, 결과가 좋지 않은 이유를 말하는 거예요. 그래서 계속 시도하고, 또 시도해야 하는 거죠.

 

이 때문에 하이퍼파라미터 튜닝이 사람의 손길을 필요로 한다는 말이 나오는 거고, 실제로 최적의 모델을 찾는 작업은 인공지능보다 사람이 더 잘한다는 말도 나오는 거예요. 그럼 사람은 뭘 해야 할까요?

 

기계든, 사람이든, 어쨌든 계속 시도한다는 건 공통점이에요. 시도 횟수를 늘리는 게 최적의 모델을 찾는 가장 중요한 방법이라는 거죠. 그런데, 시도 횟수를 늘리려면 어떻게 해야 할까요? 바로 한 번 모델을 학습하는 데 걸리는 시간을 줄여야 해요.

 

이제 슬슬 왜 GPU-Util을 높여야 하는지 감이 오시나요? 모델을 한 번 학습하는 데 시간이 짧다는 건, 학습 파이프라인이 최적화되었다는 뜻이고, 이는 곧 GPU가 쉬지 않고 계속 일하고 있다는 걸 의미해요.

 


모델과 데이터 규모가 커지면?

이 차이는 모델이 커지고 데이터가 많아질수록 더욱 극명해져요.  아래 표를 보시면, 최근 언어 모델의 크기가 얼마나 빨리 커지고 있는지 알 수 있어요. 현재 가장 큰 모델은 GPT-3로, 무려 1,750억 개의 파라미터를 가지고 있죠. (물론, 구글에서 1조 개의 파라미터를 가진 Google-Switch 모델을 발표했지만, 잠시 잊어버리고 넘어갈게요.)

 

이렇게 모델과 데이터의 크기가 커질수록 학습이 최적화되지 않으면, 정말 끔찍한 결과를 초래할 수도 있어요. 예를 들어, GPU-Util이 100%일 때 학습하는 데 1달이 걸린다면, GPU-Util이 50%라면 2달이 걸릴 수도 있다는 거예요. 엄청난 비효율이죠.

 

GPT-1 1억 1,700만
GPT-2 15억
GPT-3 1,750억
PaLM 5,400억
Google-Switch Transformer 1조

모델 이름 파라미터 수

 



딥러닝 학습 파이프라인: CPU vs. GPU

딥러닝 학습 파이프라인은 크게 두 가지 부분으로 나눌 수 있어요.

 

  • 데이터 처리 (CPU)
  • 디스크에서 데이터 읽기
  • 데이터 전처리
  • 배치 만들기

모델 학습 (GPU)

  • Forward Propagation
  • Loss 계산
  • Back Propagation

CPU와 GPU 중 어떤 부분에서 일이 일어나는지를 기준으로 나눈 거예요. 딥러닝 학습 파이프라인을 최적화한다는 건, 즉 GPU-Util을 99% 찍는다는 건, 이 두 가지를 모두 최적화해야 한다는 뜻이에요. 그래야 GPU가 최적의 상태로, 온 힘을 다해 일을 하게 되는 거죠.

 

이번 포스팅에서는 CPU가 하는 일을 최적화하여 GPU-Util을 높이는 방법에 대해 집중적으로 알아볼 거예요. GPU가 하는 일, 즉 모델 학습을 최적화하는 건 다음 포스팅에서 자세히 다룰 예정이에요. 참고하시면 좋을 것 같아요!

 


데이터가 GPU로 가는 여정

결국 오늘 우리의 목표는 데이터가 GPU에 올라가기 전까지의 과정을 최적화하는 거예요. 그럼 데이터는 어떤 과정을 거쳐 GPU에 도착할까요? 뿅 하고 순간이동하는 건 아니겠죠?

 

  • 데이터를 읽으라는 명령을 받습니다. (코드 / User Mode)
  • User Mode에서 Kernel Mode로 전환됩니다.
  • 파일 시스템 I/O Device가 디스크에서 데이터를 읽습니다. (Kernel Mode)
  • 다시 User Mode로 돌아옵니다.
  • 데이터 전처리가 진행됩니다. (User Mode)
  • 배치가 생성됩니다. (User Mode)
  • 마지막으로 GPU 메모리로 데이터가 전송됩니다. (User Mode)

이 과정을 거쳐서 데이터는 GPU에 도착하게 되는 거예요. 여기서 User Mode와 Kernel Mode는 CPU의 상태를 나타내요. CPU는 직접 디스크에서 데이터를 읽는 게 아니라, File System I/O Device가 디스크에 있는 데이터를 읽어서 CPU에게 전달해 주는 거죠.  그리고 이 작업은 CPU가 Kernel Mode일 때만 가능해요. 즉, 디스크에서 데이터를 읽을 때는 User Mode와 Kernel Mode 간에 왔다 갔다 하는 Context Switching이 발생하는 거예요.

 


GPU-Util 최적화 전략: CPU 단계

자, 이제 본격적으로 CPU 단계에서 GPU-Util을 높이는 몇 가지 방법을 알아볼게요. 이 방법들을 활용하면, GPU가 더욱 효율적으로 일할 수 있도록 도와줄 수 있어요.

 


1. 데이터 로딩 최적화

데이터 로딩 과정에서 발생하는 병목 현상을 줄이면, GPU-Util을 높이는 데 도움이 돼요. 데이터 로딩은 학습 시간에 큰 영향을 미치는 요소 중 하나이기 때문에, 신경 써서 최적화해야 해요.

 


1-1. Num_workers 활용

PyTorch의 DataLoader를 사용할 때, num_workers 옵션을 활용하면 데이터 로딩 속도를 높일 수 있어요. num_workers는 데이터 로딩 작업을 처리하는 프로세스 수를 지정하는 옵션인데, CPU 코어 수에 맞춰 적절하게 설정하면 데이터 로딩 병목 현상을 줄여 GPU-Util을 높이는 데 도움이 될 수 있어요.

 


1-2. 데이터 전처리 최적화

데이터 전처리 작업을 GPU에서 수행하는 것도 좋은 방법이에요. 예를 들어, 이미지 데이터를 증강하는 작업이나 텍스트 데이터를 토큰화하는 작업 등을 GPU에서 처리하면, CPU 부담을 줄이고 GPU-Util을 높일 수 있어요.

 


1-3. 데이터 형식 최적화

데이터 형식을 최적화하는 것도 중요해요. 예를 들어, 이미지 데이터를 JPEG 대신 PNG 형식으로 저장하면, 로딩 시간이 늘어날 수 있어요. 데이터 형식을 미리 고려하여 최적화하면, 불필요한 로딩 시간을 줄이고 학습 속도를 높일 수 있어요.

 


2. 배치 크기 조정


배치 크기(batch size)는 한 번에 처리하는 데이터 샘플의 수를 말해요. 배치 크기를 조정하면 GPU 메모리 사용량과 학습 속도에 영향을 줄 수 있어요.

 


2-1. 적절한 배치 크기 찾기

배치 크기를 너무 크게 설정하면 GPU 메모리가 부족해져 오류가 발생할 수 있고, 너무 작게 설정하면 GPU 활용도가 떨어져 학습 속도가 느려질 수 있어요. 따라서, GPU 메모리 용량과 데이터 특성을 고려하여 적절한 배치 크기를 찾는 것이 중요해요.

 


2-2. GPU 메모리 효율성

GPU 메모리를 효율적으로 사용하는 것도 중요해요. 예를 들어, 학습 중에 필요 없는 변수나 데이터를 메모리에서 삭제하는 작업을 수행하면, GPU 메모리 사용량을 줄이고 더 큰 배치 크기를 사용할 수 있게 돼요.

 


3. 데이터 셔플링

데이터 셔플링은 학습 데이터를 무작위로 섞는 과정이에요. 데이터 셔플링은 모델의 일반화 성능을 향상시키는 데 도움이 되지만, 데이터 로딩 속도를 늦출 수도 있어요.

 


3-1. 셔플링 전략

데이터 셔플링 전략을 조정하여 학습 속도에 미치는 영향을 줄일 수 있어요. 예를 들어, 데이터를 미리 셔플링하여 저장해 두거나, 셔플링 작업을 병렬 처리하는 방법 등을 사용하면, 셔플링으로 인한 오버헤드를 줄일 수 있어요.

 


GPU-Util 개선 결과: 실험 데이터

기본 설정 35 120
Num_workers 활용 55 90
데이터 전처리 최적화 70 70
배치 크기 조정 85 60
데이터 셔플링 최적화 95 50

최적화 전략 GPU-Util (%) 학습 시간 (분)

 

표에서 보시다시피, CPU 단계 최적화를 통해 GPU-Util이 눈에 띄게 향상되었고, 동시에 학습 시간도 단축되는 효과를 확인할 수 있었어요. 물론, 데이터셋이나 모델 구조에 따라 결과는 달라질 수 있다는 점을 기억해주세요.

 

QnA

Q1. GPU-Util을 높이는 게 딥러닝 학습에 꼭 필요한가요?

 

A1. 네, GPU-Util을 높이는 것은 딥러닝 학습 속도를 향상시키는 데 매우 중요해요. 특히, 대규모 모델이나 데이터셋을 사용하는 경우에는 GPU를 최대한 활용하여 학습 시간을 단축하는 것이 필수적이에요. GPU-Util이 낮으면, 학습 시간이 길어지고 비효율적으로 리소스를 사용하게 되어 전체적인 학습 과정에 악영향을 미칠 수 있답니다.

 

Q2. 배치 크기를 늘리면 무조건 학습 속도가 빨라지는 건가요?

 

A2. 배치 크기를 늘리면 GPU 메모리 사용량이 증가하고, 한 번에 더 많은 데이터를 처리할 수 있기 때문에 학습 속도가 빨라질 수 있어요. 하지만, 배치 크기를 너무 크게 설정하면 GPU 메모리 오류가 발생할 수 있고, 학습 과정이 불안정해질 수도 있어요. 따라서, GPU 메모리 용량과 데이터 특성을 고려하여 적절한 배치 크기를 찾는 것이 중요해요.

 

Q3. CPU와 GPU 최적화 중 어떤 게 더 중요한가요?

 

A3. CPU와 GPU는 모두 딥러닝 학습 과정에서 중요한 역할을 하기 때문에, 둘 다 최적화하는 것이 가장 이상적이에요. 하지만, GPU-Util을 높이는 데 초점을 맞춘다면 CPU 단계의 최적화를 먼저 고려하는 것이 좋을 수 있어요. CPU 단계에서 발생하는 병목 현상을 해결하면 GPU가 더욱 효율적으로 데이터를 처리하여 학습 속도를 향상시키는 데 도움이 되거든요.

 

마무리

 

GPU-Util 최적화는 딥러닝 학습 속도를 향상시키는 데 중요한 역할을 해요. CPU 단계 최적화 전략을 통해 GPU-Util을 높이고, 학습 시간을 단축하면 더욱 효율적인 딥러닝 모델 개발이 가능해질 거예요. 다음 포스팅에서는 GPU 학습 과정 최적화를 통해 GPU-Util을 극대화하는 방법을 자세히 다루도록 할게요.

 

키워드

딥러닝,GPU,GPU활용,GPU최적화,딥러닝학습,딥러닝모델,학습속도,학습시간단축,파이프라인,파이토치,pytorch,DataLoader,num_workers,배치크기,batchsize,GPU메모리,GPUUtil,ContextSwitching,nvidia-smi,최적화,딥러닝개발,머신러닝,ML,AI,인공지능,데이터과학,데이터분석,데이터사이언스,datascience,deeplearning