AI VIDEO BRIEFING

PyTorch Dataset·DataLoader 최적화 — CMU 딥러닝 수업이 짚은 데이터 병목 진단과 여덟 가지 처방

학습이 느린 진짜 원인은 GPU가 아니라 데이터 파이프라인인 경우가 많다. 카네기멜런대 딥러닝 수업 실습에서 짚은 Dataset과 DataLoader의 역할 분담, 병목을 재는 방법, 속도를 끌어올리는 여덟 가지 기법을 정리했다.

GPU가 노는 진짜 이유는 데이터였다: CMU 딥러닝 수업이 알려주는 Dataset 최적화 영상 대표 이미지

핵심 메시지

  • 학습 한 스텝에 걸리는 시간은 GPU 연산 시간과 데이터 공급 시간 중 더 느린 쪽에 묶이므로, 최적화를 시작하기 전에 둘 중 어느 쪽이 병목인지부터 가려야 한다.
  • Dataset은 데이터를 소유하고 한 샘플을 어떻게 읽을지 정의하는 객체이고, DataLoader는 어떤 순서로 얼마나 묶어서 돌지를 담당하는 객체라 역할이 분리되어 있다.
  • 비싼 작업은 한 번만 실행되는 초기화 메서드에 두어야 한다. 샘플 하나를 꺼내는 메서드는 데이터 수만큼 호출되므로 그 안의 파일 열기나 복사가 그대로 학습 시간에 곱해진다.
  • 음성 데이터처럼 프레임 하나만으로는 판별이 어려운 경우 앞뒤를 붙인 문맥 창을 쓰는데, 이를 미리 만들어 두면 메모리가 폭발하므로 접근 시점에 원본 배열의 뷰로 계산해야 한다.
  • 발표자는 '2분의 측정이 몇 시간의 추측을 이긴다'는 원칙을 반복하며, 초당 처리 샘플 수를 재고 GPU 사용률을 확인한 뒤에 손대라고 강조했다.

쉽게 이해하기

카네기멜런대 딥러닝 입문 수업의 조교 펠릭스 힐거트가 진행한 이 실습 세션은 모델 구조가 아니라 데이터 파이프라인을 다룬다. 발표자는 학습 파이프라인 그림에서 데이터 처리 단계를 가리키며, 학습이 느릴 때 원인은 대개 이곳에 있고 손을 잘 보면 30분 걸리던 한 에폭이 3분으로 줄면서도 결과는 같을 수 있다고 말한다.

먼저 정리한 것은 두 객체의 계약이다. Dataset은 데이터를 들고 있으면서 '한 샘플을 어떻게 읽을 것인가'에 답하고, DataLoader는 '다음에 무엇을 볼 것인가'에 답하며 인덱스를 뽑아 워커에 넘기고 배치와 섞기를 처리한다. 여러 샘플을 하나의 텐서로 합치는 병합 함수, 워커 프로세스로 데이터 준비와 연산을 겹치게 하는 설정, 메모리 고정 옵션까지가 이 경로에 함께 놓인다. 여기서 핵심 규칙은 비용이 큰 일은 초기화 메서드로 올리라는 것이다. 샘플이 5만 개면 샘플 접근 메서드도 5만 번 호출되기 때문이다.

이어서 과제 데이터를 구체적으로 뜯어본다. 음성 특징 파일은 길이가 발화마다 다른 시간 축과 28개 특징 차원을 갖고, 대응하는 전사 파일은 시작·종료 토큰이 붙어 시간 축보다 두 개 길다. 한 프레임 28개 값만으로는 어떤 음소인지 알 수 없으니 앞뒤 프레임을 붙인 문맥 창을 만들고, 그만큼 첫 번째 선형 계층의 입력 차원도 문맥 크기에 따라 달라진다. 경계에서는 앞뒤가 없으므로 0으로 채운다.

문제는 크기다. 발표자는 프레임이 수천만 개인 상태에서 문맥 창을 실제 배열로 모두 만들어 두면 100기가바이트 단위가 된다는 계산을 보여 주며, 창은 반드시 원본 배열을 들여다보는 뷰로 접근 시점에 계산해야 한다고 못 박는다. 처음 과제를 할 때 흔히 쓰는 나이브한 구현은 샘플을 꺼낼 때마다 파일을 새로 열고, 매번 패딩 배열을 새로 만들고, 텐서로 바꾸면서 복사와 타입 승격까지 일으키는데 이 셋이 겹치면 학습이 데이터에 묶인다.

처방은 여덟 가지로 제시된다. 데이터를 초기화 시점에 메모리로 올려 두기, 발화 단위 배열을 하나로 펴고 누적 합으로 인덱스를 계산하기, 패딩을 한 번만 해 두고 이후에는 뷰를 돌려주기, 자료형을 필요한 크기로 맞추기, 전처리 결과를 캐싱하기, 여러 샘플을 한꺼번에 가져오기, 병합 함수를 반복문 대신 벡터 연산으로 쓰기, 워커 수를 조정하기다. 발표자는 이 모두를 반드시 다 적용할 필요는 없으며, 초당 처리 샘플 수를 재서 기준선과 비교한 뒤 필요한 것만 고르라고 안내한다.

주요 인사이트

  • GPU 사용률이 50%를 밑돈다면 연산이 아니라 공급이 문제일 가능성이 크다. 다만 클라우드 노트북 환경에서는 이 수치가 흔들리기 때문에, 여러 번 측정한 뒤 중앙값을 보라는 조언이 함께 붙었다.
  • 데이터를 통째로 메모리에 올리는 기법은 가장 손쉬운 개선이지만 만능은 아니다. 메모리가 작은 환경에서는 초기화 단계에서 실패하고, 성공하더라도 데이터를 올리는 데 수 분이 걸린다는 대가가 따른다.
  • 시각화와 정합성 검사를 건너뛰면 나중에 비싼 값을 치른다. 발표자는 모델이 40%대 정확도에 머무는데 원인을 못 찾는 상황을 예로 들며, 학습을 시작하기 전에 데이터를 눈으로 확인하라고 강조했다.
  • 성능 문제를 다루는 태도 자체가 이 수업의 메시지다. 무엇을 고칠지 찍어서 바꾸는 대신 먼저 측정하라는 원칙은, 신경망 학습에서 무작정 특징을 고르는 대신 제거 실험으로 기여도를 확인하는 방식과 같은 맥락에 있다.
  • 문맥 창 크기를 바꾸면 모델의 첫 선형 계층 입력 차원도 함께 바뀐다. 데이터 쪽 하이퍼파라미터가 모델 정의에 직접 영향을 준다는 점은 실험을 돌릴 때 자주 놓치는 연결 고리다.

자주 묻는 질문

Dataset과 DataLoader를 굳이 두 객체로 나눈 이유는 무엇인가요?

Dataset은 데이터를 소유하면서 한 샘플을 어떻게 읽는지를 추상화하고, DataLoader는 어떤 순서로 몇 개씩 묶어 돌지를 추상화합니다. 이렇게 나누면 전체를 한꺼번에 올리지 않고 배치 단위로 지연 로딩할 수 있고, 워커 프로세스로 데이터 준비와 연산을 겹치게 할 수 있다는 장점이 생깁니다.

샘플을 꺼내는 메서드에서 파일을 여는 것이 왜 문제가 되나요?

이 메서드는 샘플 하나마다 호출되기 때문에 프레임이 수천만 개면 그만큼 시스템 호출이 발생합니다. 여기에 매 접근마다 패딩 배열을 새로 만들고 텐서로 변환하면서 복사와 자료형 승격까지 일어나면, 파이프라인이 GPU보다 느려져 학습 전체가 데이터에 묶이게 됩니다.

문맥 창을 미리 만들어 두면 안 되는 이유가 무엇인가요?

프레임마다 앞뒤를 붙인 배열을 실제로 생성하면 원본보다 훨씬 큰 메모리를 차지합니다. 발표자는 프레임이 수천만 개이고 문맥이 수십 개일 때 100기가바이트 단위가 된다는 계산을 제시하면서, 창은 원본 배열을 가리키는 뷰로 접근하는 순간에 계산해야 한다고 설명했습니다.

원문과 출처

이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.

YouTube 원본 영상 보기 ↗

관련 AI 소식