DeepLearning

[DeepLearning] 메모리 효율적인 딥러닝

dong_seok 2025. 4. 8. 18:40
728x90

딥러닝 모델, 특히 대규모 언어 모델(LLM)이 발전함에 따라 모델 크기와 필요한 계산 자원도 크게 증가했습니다. 하지만 모델 성능이 향상됨에 따라 모델의 크기와 요구되는 계산 자원 또한 기하급수적으로 증가하고 있습니다. 수십억에서 수백억 개의 파라미터를 가진 모델을 학습하고 추론하려면, 단순히 고성능 하드웨어만으로는 한계가 있습니다. 메모리 효율성과 연산 최적화 없이는 현실적인 운영이 어려워지기 때문이죠. 이번 글에서는 대규모 딥러닝 모델을 효율적으로 다루기 위한 핵심 기술들을 정리해보겠습니다. 특히 메모리 관점에서 모델을 어떻게 경량화하고 최적화할 수 있는지를 중심으로 다뤄보겠습니다.

1. 데이터 타입에 따른 메모리 사용량

딥러닝 모델은 본질적으로 수많은 파라미터(가중치)를 포함한 거대한 행렬 연산의 집합입니다. 이 파라미터들을 어떤 데이터 타입으로 저장하느냐에 따라 모델의 용량과 성능이 크게 달라집니다.

과거에는 32비트 부동소수점(FP32)이 표준이었지만, 최근에는 메모리와 연산 효율을 고려해 FP16이나 BF16과 같은 16비트 형식이 널리 사용됩니다.

 

데이터 타입 정밀도 특징
FP32 높음 높은 정밀도와 안정성, 큰 메모리 사용량
FP16 낮음 낮은 정밀도, 메모리 사용량 감소, 오버플로우 위험
BF16 중간 FP16보다 넓은 표현 범위, 학습 안정성이 높음

 

모델 용량 = 파라미터 수 × 파라미터당 비트 수

 

예를 들어:

  • 10억 개 파라미터 모델(fp16): 20억B -> 2GB
  • 70억 개 파라미터 모델(fp16): 140억B -> 14GB

 

2. 양자화: 모델 압축의 핵심 기술

양자화는 더 나아가 모델의 정밀도를 줄이는 대신 크기를 획기적으로 줄이는 방법입니다. 32비트나 16비트가 아닌, 8비트 또는 4비트로 파라미터를 표현함으로써 모델의 메모리 사용량을 1/2에서 최대 1/8까지 절감할 수 있습니다.

 

주요 양자화 방법

1) 절대 최댓값 기준 양자화 (Absmax Quantization)

  • 전체 데이터의 절대값 최대치를 기준으로 스케일링
  • 단순하지만 이상치에 민감

2) 블록 단위 양자화 (Block-wise Quantization)

  • K개의 데이터를 하나의 블록으로 묶어 양자화
  • 이상치의 영향을 제한된 범위로 격리 가능

3) 퀀타일(Quantile) 양자화

  • 데이터를 정렬해 균등 분포되도록 스케일링
  • 메모리와 계산량이 증가하지만 정밀도 손실을 최소화 가능

 

3. GPU 메모리 사용 구조 이해

딥러닝 학습 과정에서 GPU 메모리에는 다음과 같은 항목이 저장됩니다.

  • 모델 파라미터
  • 그레이디언트
  • 옵티마이저 상태
  • 순전파 상태
이 중 순전파 상태는 역전파 시 다시 사용되기 때문에 전체 메모리에서 상당한 부분을 차지하게 됩니다. 특히 모델이 깊거나 배치 크기가 클수록 메모리 부담은 더욱 커집니다. 딥러닝 학습 과정을 간단히 요약하면, 먼저 순전파를 수행하고 그때 계산한 손실로부터 역전파를 수행하고 마지막으로 옵티마이저를 통해 모델을 업데이트합니다. 역전파는 순전파의 결과를 바탕으로 수행하는데, 이때 역전파를 수행하기 위해 저장하고 있는 값들이 순전파 상태값입니다. 그레이디언트는 역전파 결과 생성됩니다.
 

4. 메모리 효율적인 학습 기법

1) 그레이디언트 누적(Gradient Accumulation)

  • 여러 배치의 그레이디언트를 누적한 후 모델을 한번에 업데이트하는 방식입니다.
  • 장점: 적은 메모리로 큰 배치 효과
  • 단점: 학습 시간이 길어질 수 있음

2) 그레이디언트 체크포인팅(Gradient Checkpointing)

  • 순전파 시 모든 중간 값을 저장하지 않고 일부만 저장한 뒤, 역전파 시 필요할 때 재계산하는 방식입니다.
  • 장점: 메모리 사용량 대폭 감소
  • 단점: 일부 계산 재수행으로 학습 시간 증가

 

5. 분산 학습 기법

분산학습이란 대규모 모델 학습을 위해 여러 GPU를 활용하는 방법으로 모델 학습 속도를 높이고 1개의 GPU로 학습이 어려운 모델을 다루는 것을 목표로 하고 있습니다.

 

1) 데이터 병렬화(Data Parallelism)

동일한 모델을 여러 GPU에 복제하고 각각 다른, 데이터를 처리하는 방식입니다.

 

2) 모델 병렬화 (Model Parallelism)

모델 자체를 분할하여 각 GPU가 서로 다른 파트를 처리합니다. 다시 세분화하면:

  • 파이프라인 병렬화 (Pipeline Parallelism)
    → 모델의 층(layer)을 수직(상하)으로 나누어 각 GPU에 순차적으로 배치
  • 텐서 병렬화 (Tensor Parallelism)
    → 한 층의 연산 자체를 좌우로 나눠 여러 GPU에 병렬 분산시킴

3) ZeRO(Zero Redundancy Optimizer)

데이터 병렬화를 사용하는 경우 동일한 모델을 여러 GPU에 올리기 때문에 중복으로 모델을 저장하면서 메모리 낭비가 발생합니다. 이런 비효율을 해결하기 위해 ZeRO가 개발됐습니다. 하나의 모델을 하나의 GPU에 올리지 않고 마치 모델 병렬화처럼 모델을 나눠 여러 GPU에 올리고 각 GPU에서는 자신의 모델 부분의 연산만 수행하고 그 상태를 저장하면 메모리를 효율적으로 사용하면서 속도도 빠르게 유지할 수 있다는 것이 ZeRO의 컨셉입니다. Accelerate의 DeepSpeed 사용 가이드를 통해 쉽게 적용할 수 있습니다.

 

대규모 언어 모델의 시대에는 단순히 GPU 성능만 믿고 학습을 진행할 수 없습니다. 한정된 자원 안에서 효율적인 학습과 추론을 수행하려면 데이터 타입 최적화, 양자화, 메모리 절감 기법, 분산 학습 전략 등이 필수적입니다. 적절한 최적화 기법을 조합하면 수천만 원대의 대형 GPU 서버 없이도, 상대적으로 저렴한 환경에서 대형 모델을 실험하고 운영할 수 있습니다.

 

참고자료

LLM을 활용한 실전 AI 애플리케이션 개발 - 허정준

728x90