Gradient Accumulation
그래디언트 누적이 제한된 GPU 메모리에서 더 큰 유효 배치 크기를 가능하게 하는 방법을 알아보고, 실용적인 PyTorch 및 Ultralytics YOLO 학습 지침을 확인해 보세요.
그래디언트 누적은 여러 개의 소규모 배치(마이크로배치라고 함)에서 계산한 그래디언트를 하나의 모델 가중치 업데이트를 수행하기 전에 합산하는 학습 기법입니다. 사용 가능한 GPU 메모리에 전체 배치를 한 번에 담을 수 없을 때 더 큰 배치 크기로 학습하는 효과를 근사합니다. 이를 통해 모델 아키텍처를 변경하거나 입력 해상도를 낮추지 않고도 메모리를 많이 사용하는 경사 하강법을 실용적으로 사용할 수 있습니다.
그래디언트 누적의 작동 방식#
일반적인 학습에서 각 배치는 세 가지 주요 단계를 거칩니다. 손실을 계산하고, 역전파를 사용해 그래디언트를 계산한 다음, 옵티마이저가 모델 가중치를 업데이트하도록 합니다. 이후 다음 배치로 넘어가기 전에 그래디언트를 초기화합니다.
그래디언트 누적은 옵티마이저 업데이트를 지연합니다. 각 마이크로배치는 순전파와 역전파를 수행하지만, 해당 그래디언트는 메모리에 유지되며 이후 마이크로배치의 그래디언트에 더해집니다. 이러한 동작은 각 파라미터의 그래디언트 필드에 값을 누적하는 PyTorch backward 연산에서 자연스럽게 비롯됩니다.
구성된 누적 단계 수에 도달하면 다음 작업을 수행합니다.
- 옵티마이저가 모델 가중치를 업데이트합니다.
- Optimizer.zero_grad와 같은 연산을 사용해 그래디언트를 초기화합니다.
- 새로운 누적 윈도우가 시작됩니다.
유효 배치 크기는 다음과 같습니다.
microbatch size x accumulation steps x number of training devices
예를 들어 4개의 이미지로 구성된 마이크로배치에서 8단계 동안 그래디언트를 누적하면 GPU 하나에서 이미지 32개로 구성된 배치와 대략 동일하게 동작합니다. GPU가 4개라면 전역 유효 배치 크기는 128이 됩니다.
메모리, 속도 및 학습에 미치는 영향#
그래디언트 누적은 한 번에 하나의 마이크로배치만 네트워크를 통과하므로 활성화 값에 필요한 최대 메모리를 줄입니다. 그러나 모델 파라미터, 그래디언트 또는 옵티마이저 상태가 사용하는 메모리는 크게 줄이지 않습니다.
또한 일반적으로 학습 속도를 높이지도 않습니다. 8개의 마이크로배치를 처리하려면 여전히 8번의 순전파와 역전파가 필요하며, 더 작은 배치는 GPU를 덜 효율적으로 사용할 수 있습니다. 주요 이점은 제한된 메모리 안에 원하는 유효 배치를 맞출 수 있다는 점입니다. 분산 학습에서는 DistributedDataParallel no_sync와 같은 기능을 사용해 누적 윈도우가 끝날 때까지 그래디언트 동기화를 수행하지 않을 수 있으므로 부가적인 이점이 발생할 수 있습니다.
수동 구현에서는 일반적으로 각 마이크로배치의 손실을 누적 단계 수로 나눕니다. 이렇게 하면 결과 그래디언트가 합계가 아닌 평균을 나타냅니다. 고수준 트레이너는 정규화를 자동으로 처리할 수 있으므로 추가로 스케일링하면 잘못된 업데이트가 발생할 수 있습니다.
누적을 사용하면 실제 대규모 배치를 근사할 수 있지만 결과가 항상 동일한 것은 아닙니다. 배치 정규화 통계는 개별 마이크로배치에서 계산되며, 확률적 연산과 부동소수점 연산 순서도 차이를 유발할 수 있습니다. 따라서 학습률은 자동으로 스케일링하기보다 검증해야 할 수 있습니다.
관련 기법 및 주요 차이점#
그래디언트 누적은 다른 메모리 절감 또는 안정화 기법과 혼동되는 경우가 많습니다.
- 그래디언트 체크포인팅은 역전파 중 선택한 순전파 연산을 다시 계산하여 활성화 메모리를 줄입니다. PyTorch 활성화 체크포인팅 문서에서는 이러한 연산량과 메모리 간의 절충을 설명합니다. 반면 누적은 대규모 배치를 더 작은 마이크로배치로 나눕니다.
- **혼합 정밀도**는 선택한 연산을 더 낮은 정밀도의 데이터 형식으로 저장하거나 계산합니다. 메모리를 줄이고 처리량을 향상할 수 있는 반면, 누적은 옵티마이저가 업데이트되는 빈도를 변경합니다. 올바른 자동 혼합 정밀도 누적 워크플로를 따르면 두 기법을 함께 사용할 수 있습니다.
- 그래디언트 클리핑은 비정상적으로 큰 업데이트로 인한 불안정성을 줄이기 위해 그래디언트 크기를 제한합니다. 그래디언트 클리핑이 더 큰 유효 배치를 생성하는 것은 아닙니다. 누적과 함께 사용할 때는 일반적으로 clip_grad_norm과 같은 연산을 사용해 그래디언트를 모두 누적한 후 클리핑해야 합니다.
실제 적용 사례#
고해상도 의료 이미지 세그멘테이션에서는 12GB GPU에 대형 스캔 이미지 2개만 한 번에 들어갈 수 있습니다. 8개의 마이크로배치에 걸쳐 그래디언트를 누적하면 작은 해부학적 구조를 식별하는 데 필요한 해상도를 유지하면서 유효 배치 16을 생성할 수 있습니다. 그 대신 옵티마이저 업데이트 사이의 간격이 길어집니다.
항공 영상 객체 감지의 경우 엔지니어링 팀이 4개의 GPU에서 디바이스당 이미지 6개와 누적 단계 4개를 사용해 학습할 수 있습니다. 유효 전역 배치는 이미지 96개입니다. 이를 통해 각 디바이스를 메모리 제한 내에서 유지하면서 작은 차량이나 건물이 많이 포함된 장면에 대한 업데이트를 안정화할 수 있습니다. 팀은 Ultralytics Platform 클라우드 학습을 통해 클라우드 실험, 데이터 세트 및 학습 실행을 관리할 수 있습니다.
Ultralytics YOLO의 그래디언트 누적#
Ultralytics 모델 학습 워크플로는 물리적 batch 설정과 명목 nbs 설정을 바탕으로 누적 동작을 결정합니다. batch=4 및 nbs=64를 사용하면 트레이너는 여러 마이크로배치에 걸쳐 옵티마이저 업데이트를 지연하여 명목 배치 64를 목표로 합니다.
from ultralytics import YOLO
# Load a pretrained YOLO26 detection model
model = YOLO("yolo26n.pt")
# Use a small physical batch and a larger nominal batch
results = model.train(
data="coco8.yaml",
epochs=10,
batch=4,
nbs=64,
)고수준 트레이너는 역전파, 누적, 옵티마이저 단계 및 그래디언트 초기화를 관리합니다. 이 동작은 Ultralytics BaseTrainer 레퍼런스에 문서화되어 있습니다. 실제로는 안정적으로 처리할 수 있는 가장 큰 마이크로배치를 선택하고, 의도한 유효 배치를 계산한 다음, 누적 단계 수, 학습률 또는 디바이스 수를 변경할 때 검증 결과를 비교합니다.









