DataLoader 의 pin_memory 옵션

AFL·2025년 9월 5일

DataLoader 의 옵션 중 하나인 pin_memory에 대해 알아보았다.

  • pin_memory=True : 이 메모리를 일정량 확보해둔다는 뜻 → CPU에서 GPU 데이터 전송속도 향상, 빨라짐.
    • 데이터를 GPU로 전송할 때 pinned memory에서 데이터를 가져오는 것
    • GPU를 사용해서 모델 훈련시킬 때, 데이터가 많을 때 사용하면 좋음
  • 주의사항
    • 메모리 사용량: Pinned memory는 일반 CPU 메모리보다 비용이 더 많이 든다. 따라서 많은 양의 pinned memory를 사용하면 시스템의 전체 성능에 영향을 줄 수 있음.
    • GPU 사용 환경에서의 유용성: pin_memory는 주로 GPU 사용 환경에서 효과적이다. 데이터를 GPU로 전송할 때 non_blocking=True 옵션과 함께 사용하면, 데이터 전송이 주 연산을 방해하지 않고 백그라운드에서 진행될 수 있음.
    • 데이터양이 작으면 해당 효과 작음
from torch.utils.data import DataLoader
dl = DataLoader(dataset, pin_memory=True)
# ...
inputs = inputs.to(device, non_blocking=True)
  • 실제 사용할 때는?
    • 배치 단위(Batch size) 기준
      • 일반적으로 한 배치 단위의 데이터 정도를 pinned memory로 올리면 충분.
      • 예: batch_size=64라면, 64개 샘플 정도를 pinned memory에 올림. → DataLoader가 내부적으로 배치를 준비할 때 자동으로 pinned memory를 사용함.
    • RAM 대비 비율
      • 보통 전체 시스템 RAM의 10~30% 정도를 pinned memory로 쓰면 안정적.
      • 너무 많이 잡으면 OS가 다른 작업에 쓸 메모리가 부족해져 성능 저하 가능.
    • GPU 메모리와 병행 고려
      • GPU가 이미 메모리를 많이 쓰고 있다면, pinned memory를 과도하게 쓰지 말 것.
      • 배치 단위가 크면 pin_memory=True + 작은 num_workers 조합이 안정적임.
profile
공부해서 남주자

0개의 댓글