TL;DR
ResNet-18을 단일 NVIDIA T4에서 학습할 때 PyTorch DataLoader의 기본 num_workers=0이 입력 병목을 만들어 GPU 이용률이 약 51%로 고착되었고 세 옵션(num_workers, pin_memory, persistent_workers)만으로 2000스텝 벽시계 시간이 633초에서 358초로 43% 단축되어 입력 바운드에서 컴퓨트 바운드로 전환되었다. 이 사례는 num_workers 같은 설정이 CPU 코어 수, 스토리지 성능, 데이터 변환 비용, 배치 크기 등 환경 요소에 따라 달라지는 동적 목표임을 보여주며 단일 정답이 없다는 점을 실측으로 입증했다. 결과적으로 프레임워크의 모호한 힌트나 타인 값의 복사는 오히려 성능 저하를 초래할 수 있으며 정량적 진단 도구(예: TraceML)를 통해 자원 이용률과 벽시계 시간을 측정하는 것이 문제 발견과 개선 증명에 결정적이었다.
실용적 조언
- 학습 중 GPU 이용률과 전체 벽시계 시간을 측정해 입력 바운드 여부를 확인하라; 낮은 GPU 이용률과 긴 벽시계 시간은 데이터 로딩 병목을 시사한다.
- DataLoader에서 num_workers를 0에서 환경에 맞는 값으로 단계적으로 증가시키고 pin_memory와 persistent_workers를 활성화해 호스트→디바이스 전송과 워커 오버헤드를 줄여라.
- 환경(코어 수, 스토리지 성능, 데이터 변환 비용)에 따라 적정 num_workers가 달라지므로 블로그의 고정값을 그대로 복사하지 말고 직접 측정 결과로 튜닝하라.
섹션별 상세
train_loader = DataLoader(dataset, batch_size=..., num_workers=0, pin_memory=False, persistent_workers=False)
# 변경 후
train_loader = DataLoader(dataset, batch_size=..., num_workers=8, pin_memory=True, persistent_workers=True)원문에서 세 줄 설정 변경(num_workers, pin_memory, persistent_workers)을 예시로 든 간단한 DataLoader 설정 변경 예시이다.
용어 해설
- PyTorch 데이터로더(PyTorch DataLoader)
- — PyTorch의 DataLoader는 데이터셋에서 배치를 생성하기 위해 샘플을 읽고 전처리하는 파이프라인 역할을 한다. 내부적으로 샘플 인덱스를 기반으로 데이터를 로드하고 선택된 수의 워커 프로세스로 병렬화하여 I/O와 변환 비용을 분산한다. DataLoader 설정(num_workers, pin_memory, persistent_workers)은 입력 파이프라인의 처리량과 GPU 활용률에 직접적인 영향을 준다.
- 워커 수(num_workers)(num_workers)
- — num_workers는 DataLoader가 배치 생성에 사용하는 서브프로세스 수를 지정하는 파라미터로 입력 읽기와 변환을 병렬화한다. num_workers가 0이면 메인 프로세스에서 모든 I/O와 전처리가 수행되어 GPU가 데이터 준비를 기다리는 병목이 발생할 수 있다. 적정값은 CPU 코어 수, 스토리지 성능, 데이터 변환 비용, 배치 크기 등 환경에 따라 달라져 직접 측정으로 튜닝해야 한다.
- 고정 메모리(pin_memory)(pin_memory)
- — pin_memory는 DataLoader가 반환하는 텐서를 페이지 잠금된(host-pinned) 메모리에 올려서 GPU로의 비동기 전송을 가속하는 설정이다. pin_memory=true일 때 CUDA가 호스트->디바이스 전송을 효율적으로 수행하여 전송 대기 시간을 줄일 수 있다. 이 설정은 CPU에서 GPU로 데이터 이동이 병목일 때 전체 학습 지연을 낮추는 데 중요하다.
- 지속 워커(persistent_workers)(persistent_workers)
- — persistent_workers는 에폭 간에 DataLoader의 워커 프로세스를 재사용하여 워커 생성 오버헤드를 제거하는 옵션이다. 워커가 반복해서 생성·종료되는 비용이 큰 워크로드에서 startup 비용을 줄여 입력 처리량을 높인다. 특히 다중 에폭 반복 학습에서 작은 배치 또는 많은 변환을 사용할 때 전체 벽시계 시간을 개선할 수 있다.
언급된 도구
학습 중 자원 이용률과 파이프라인 병목을 시계열로 수집·시각화하여 진단을 지원하는 오픈소스 도구
데이터 배치 생성과 전처리를 담당하는 PyTorch의 입력 파이프라인 컴포넌트
사례 실험에서 사용된 클라우드 인스턴스와 GPU 하드웨어
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.