AI VIDEO BRIEFING
파이토치 DataLoader 사용법 정리: 배치·셔플·drop_last·샘플러·collate_fn·num_workers 핵심
카네기멜런대 딥러닝 수업의 파이토치 데이터로더 실습을 정리했다. 배치와 셔플이 필요한 이유부터 drop_last, 지연 로딩, 커스텀 샘플러와 collate 함수, num_workers와 핀 메모리 설정까지 실무 기준으로 짚는다.

핵심 메시지
쉽게 이해하기
카네기멜런대 딥러닝 수업의 실습 회차는 파이토치의 데이터로더 클래스를 다룬다. 앞선 회차에서 다룬 데이터셋 클래스가 '한 건을 어떻게 읽고 전체가 몇 건인지'를 정의한다면, 데이터로더는 그 데이터셋을 감싸 섞고 배치로 묶고 병렬로 실어 나르는 역할을 맡는다. 실제 작업 흐름은 커스텀 데이터셋 클래스를 만들고 학습용과 테스트용으로 두 번 인스턴스화한 뒤, 각각을 데이터로더에 넘기는 형태가 된다.
배칭과 셔플이 필요한 이유는 서로 다르다. 배칭은 데이터를 덩어리로 처리해 메모리 사용을 일정하게 유지하고 하드웨어가 병렬 처리할 수 있게 하며, 배치 하나가 기울기 갱신 한 번에 대응한다. 셔플은 에폭마다 순서를 다시 섞어, 같은 클래스가 몰려 있는 구간이 통째로 한 배치가 되는 상황과 순서에 특화된 학습을 막는다. 그래서 학습 로더는 셔플을 켜지만, 학습이 일어나지 않아 순서가 무의미한 테스트 로더는 끈다.
실습에서는 다섯 건짜리 더미 데이터셋에 배치 크기 2를 적용해 배치가 두 개만 나오는 장면을 보여준다. 남은 한 건으로 세 번째 배치가 만들어지면 단일 샘플 배치가 기울기 계산을 불안정하게 만들 수 있어 drop_last를 켜 버렸기 때문이다. 이어 에폭과 배치, 배치 크기, 반복 횟수 같은 용어를 정리한다. 예제 100건에 배치 크기 20이면 한 에폭이 다섯 번의 반복이 된다. 큰 데이터를 다룰 때는 생성자에서 전부 읽지 않고 해당 항목이 요청될 때 파일을 여는 지연 로딩 방식을 쓴다.
샘플러는 이미 조용히 쓰고 있던 부품이다. 셔플을 끄면 순차 샘플러, 켜면 랜덤 샘플러가 붙는다. 여기에 배치 샘플러를 얹어 인덱스를 배치 단위로 묶을 수 있고, 반복자와 길이 메서드를 구현한 커스텀 샘플러를 만들면 불균형 데이터에서 클래스 균형 배치나 가중·층화 샘플링을 강제할 수 있다. 실습의 균형 샘플러 예제는 배치마다 두 클래스가 같은 개수로 들어가도록 인덱스를 뽑는다. 반면 collate 함수는 뽑힌 샘플 목록을 어떻게 하나의 배치로 합칠지를 정한다. 기본값은 텐서로 쌓는 것이고, 직접 만들면 배치 통계로 정규화하거나 길이가 다른 시퀀스를 패딩으로 맞출 수 있어 자연어·음성 처리에서 특히 자주 쓰인다.
마지막은 속도 설정이다. num_workers가 0이면 메인 프로세스가 데이터를 읽는 동안 GPU가 놀지만, 0보다 크면 워커들이 다음 배치를 미리 만들어 두어 GPU가 기다리지 않는다. 디스크에서 이미지를 읽고 증강까지 적용하는 무거운 항목일수록 차이가 커진다. pin_memory를 켜면 텐서가 페이지 잠금 호스트 메모리에 준비돼 CPU와 GPU 사이 복사가 빨라지므로 GPU 학습에서는 권장된다. 적정 워커 수는 기계에 따라 달라, 코어 수 근처에서 시작해 속도 향상이 멈추거나 경고가 뜰 때까지 늘려보는 방식이 제시된다.
주요 인사이트
- 데이터셋과 데이터로더의 분리는 단순한 코드 정리가 아니라 역할 분담이다. 무엇을 어떻게 읽을지는 데이터셋이, 얼마나·어떤 순서로·몇 개의 프로세스로 나를지는 데이터로더가 결정한다.
- drop_last는 데이터를 버리는 옵션처럼 보이지만 실제 목적은 학습 안정성이다. 샘플 하나로 계산한 기울기가 학습을 흔들 수 있기 때문에 자투리 배치를 포기하는 편이 낫다.
- 학습 로더와 테스트 로더의 셔플 설정이 다른 이유는 성능이 아니라 의미에 있다. 테스트에서는 기울기 갱신이 없어 순서가 결과에 영향을 주지 않는다.
- 데이터 로딩이 병목이면 GPU를 아무리 좋은 것으로 바꿔도 소용이 없다. 워커 프리페치와 핀 메모리는 모델을 건드리지 않고 학습 속도를 올릴 수 있는 몇 안 되는 지점이다.
- 증강은 무조건 많이 넣는다고 좋아지지 않는다. 일부 변환은 라벨의 의미를 뒤집을 수 있어, 데이터에 안전한 변환인지 먼저 따져야 한다.
자주 묻는 질문
테스트 데이터로더는 왜 셔플을 끄나요?
테스트 단계에서는 학습이 일어나지 않아 기울기 갱신이 없기 때문에 데이터 순서가 결과에 영향을 주지 않습니다. 반대로 학습 로더는 클래스 쏠림과 순서 특화 학습을 막기 위해 셔플을 켭니다.
drop_last는 언제 켜야 하나요?
마지막 배치에 샘플이 하나만 남는 것처럼 배치 크기가 지나치게 작아질 때 켭니다. 단일 샘플로 계산한 기울기가 학습을 불안정하게 만들 수 있어, 그 자투리 배치를 버리는 편이 안전합니다.
num_workers는 몇으로 두는 것이 좋나요?
정해진 값은 없고 사용하는 기계에 따라 다릅니다. 코어 수와 비슷한 값에서 시작해 속도 향상이 더 보이지 않거나 경고가 나타날 때까지 늘려가며 맞추는 방식이 권장됩니다.
collate 함수는 어떤 경우에 직접 만들어야 하나요?
기본 collate는 샘플들을 그대로 텐서로 쌓기만 합니다. 배치 단위 통계로 정규화하거나 길이가 서로 다른 시퀀스를 패딩으로 맞춰야 할 때 직접 정의하며, 자연어와 음성 처리에서 특히 자주 쓰입니다. 이 함수는 워커 프로세스 안에서 실행되어 병렬 처리됩니다.
원문과 출처
이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.
YouTube 원본 영상 보기 ↗