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 조합이 안정적임.