Gradient Accumulation
제한된 GPU 메모리에서 더 큰 유효 배치 크기를 구현할 수 있는 그래디언트 누적(gradient accumulation)의 원리와, PyTorch 및 Ultralytics YOLO 학습에 대한 실용적인 가이드를 확인해 보세요.
그래디언트 누적은 단일 모델 가중치 업데이트를 수행하기 전에 마이크로배치라고 하는 여러 작은 배치에서 그래디언트를 합산하는 학습 기법입니다. 사용 가능한 GPU 메모리가 전체 배치를 한 번에 수용할 수 없을 때 더 큰 배치 크기로 학습하는 것을 근사합니다. 이를 통해 모델 구조를 변경하거나 입력 해상도를 낮추지 않고도 메모리 집약적인 경사 하강법을 실현할 수 있습니다.
그래디언트 누적의 작동 방식#
일반적인 학습 과정에서 각 배치는 세 가지 주요 단계를 따릅니다. 손실을 계산하고, 역전파를 사용하여 그래디언트를 계산한 다음, 옵티마이저가 모델 가중치를 업데이트하도록 합니다. 그 후 다음 배치 전에 그래디언트가 지워집니다.
그래디언트 누적은 옵티마이저 업데이트를 지연시킵니다. 각 마이크로배치는 순방향 및 역방향 패스를 수행하지만, 해당 그래디언트는 메모리에 남아 후속 마이크로배치의 그래디언트에 더해집니다. 이 동작은 각 매개변수의 그래디언트 필드에 값을 누적하는 PyTorch 역전파 연산으로부터 자연스럽게 파생됩니다.
설정된 누적 스텝 수가 지난 후:
- 옵티마이저가 모델 가중치를 업데이트합니다.
- Optimizer.zero_grad와 같은 연산을 사용하여 그래디언트가 재설정됩니다.
- 새로운 누적 윈도우가 시작됩니다.
유효 배치 크기는 다음과 같습니다:
microbatch size x accumulation steps x number of training devices
예를 들어, 8스텝 동안 누적된 4개 이미지의 마이크로배치는 단일 GPU에서 32개 이미지의 배치와 대략적으로 유사하게 작동합니다. 4개의 GPU를 사용하는 경우 전역 유효 배치 크기는 128이 됩니다.
메모리, 속도 및 학습에 미치는 영향#
그래디언트 누적은 한 번에 하나의 마이크로배치만 네트워크를 통과하기 때문에 활성화 값에 필요한 피크 메모리를 줄여줍니다. 모델 파라미터, 그래디언트 또는 옵티마이저 상태가 사용하는 메모리를 실질적으로 줄여주지는 않습니다.
또한 일반적으로 학습 속도를 높이지는 않습니다. 8개의 마이크로배치를 처리하려면 여전히 8번의 순방향 및 역방향 패스가 필요하며, 더 작은 배치는 GPU를 덜 효율적으로 사용할 수 있습니다. 주된 이점은 제한된 메모리에 원하는 유효 배치를 맞추는 것입니다. 부수적인 이점은 분산 학습에서 발생할 수 있으며, 여기서는 DistributedDataParallel no_sync와 같은 기능을 사용하여 누적 윈도우가 끝날 때까지 그래디언트 동기화를 피할 수 있습니다.
수동 구현에서는 결과 그래디언트가 합계가 아닌 평균을 나타내도록 각 마이크로배치 손실을 누적 스텝 수로 나누는 것이 일반적입니다. 고수준 트레이너는 정규화를 자동으로 처리할 수 있으므로 추가적인 스케일링을 적용하면 잘못된 업데이트가 발생할 수 있습니다.
누적을 통해 실제 대형 배치를 근사할 수 있지만 결과가 항상 동일한 것은 아닙니다. 배치 정규화 통계는 개별 마이크로배치에서 계산되며, 확률적 연산과 부동 소수점 순서로 인해 차이가 발생할 수도 있습니다. 따라서 학습률은 자동 스케일링에 의존하기보다 검증이 필요할 수 있습니다.
관련 기법 및 주요 차이점#
그래디언트 누적은 다른 메모리 또는 안정성 기법과 종종 혼동됩니다:
- 그래디언트 체크포인팅은 역방향 패스 중에 선택된 순방향 패스 연산을 다시 계산하여 활성화 메모리를 줄입니다. PyTorch 활성화 체크포인팅 문서에서는 이 연산 대 메모리 트레이드오프를 설명합니다. 반면 누적은 큰 배치를 더 작은 마이크로배치로 나눕니다.
- **혼합 정밀도**는 더 낮은 정밀도의 데이터 형식으로 선택된 연산을 저장하거나 계산합니다. 메모리를 줄이고 처리량을 향상시킬 수 있는 반면, 누적은 옵티마이저가 업데이트하는 빈도를 변경합니다. 올바른 자동 혼합 정밀도 누적 워크플로를 따르면 두 기법을 결합할 수 있습니다.
- 그래디언트 클리핑은 비정상적으로 큰 업데이트로 인한 불안정성을 줄이기 위해 그래디언트 크기를 제한합니다. 더 큰 유효 배치를 생성하지는 않습니다. 누적과 결합할 경우, clip_grad_norm과 같은 연산을 사용하여 전체 그래디언트가 누적된 후에 클리핑이 수행되는 것이 일반적입니다.
실제 애플리케이션 사례#
고해상도 의료용 이미지 세분화에서는 12GB GPU에 한 번에 두 개의 큰 스캔만 들어갈 수 있습니다. 8개의 마이크로배치에 걸쳐 그래디언트를 누적하면 작은 해부학적 구조를 식별하는 데 필요한 해상도를 유지하면서 16의 유효 배치를 생성할 수 있습니다. 트레이드오프는 옵티마이저 업데이트 사이의 간격이 길어진다는 점입니다.
항공 객체 검출의 경우 엔지니어링 팀이 디바이스당 6개의 이미지와 4개의 누적 스텝을 사용하여 4개의 GPU에서 학습을 진행할 수 있습니다. 전역 유효 배치는 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 레퍼런스에 문서화되어 있습니다. 실제로 안정적으로 수용할 수 있는 가장 큰 마이크로배치를 선택하고, 의도한 유효 배치를 계산하며, 누적 스텝, 학습률 또는 디바이스 수를 변경할 때 검증 결과를 비교하세요.






