Efficient MultiModal Data Pipeline
Quick Summary
멀티모달 학습의 GPU 유휴 시간과 과도한 패딩을 줄이기 위해, 데이터셋 분석부터 토큰·이미지 제약을 함께 고려하는 균형 잡힌 배낭식 배치 구성까지 단계적으로 개선한 사례다.
🖼️ 인포그래픽
🖼️ 4컷 인포그래픽
💡 한 줄 요약
멀티모달 학습의 GPU 유휴 시간과 과도한 패딩을 줄이기 위해, 데이터셋 분석부터 토큰·이미지 제약을 함께 고려하는 균형 잡힌 배낭식 배치 구성까지 단계적으로 개선한 사례다.
📌 핵심 요약
- nanoVLM 학습 속도 저하의 주원인은 모델이나 GPU가 아니라 데이터 공급 지연과 배치의 약 60%를 차지한 불필요한 패딩이었다.
- 고정 최대 길이를 적용해 긴 샘플을 제거하는 방식은 낭비를 일부 줄였지만, 실제 길이와 무관하게 동일한 크기로 패딩하고 샘플 수도 감소시키는 한계가 있었다.
- 배치를 최대 토큰 용량을 가진 배낭으로 보고 시퀀스를 조합하면, 순차적 탐욕법보다 First Fit Decreasing 기반 빈 패킹이 남는 공간을 더 촘촘하게 채울 수 있었다.
- 실제 멀티모달 파이프라인에서는 토큰 수뿐 아니라 이미지 수까지 제약으로 사용하고, 작업자별 샤딩과 생산자-소비자 큐를 결합해 동적으로 배치를 생성했다.
- 최종 ConstantLengthDataset은 과도한 샘플을 걸러낸 뒤 토큰과 이미지 수를 균형 있게 묶고 필요한 만큼만 패딩해, 기존 방식보다 유용한 데이터가 조밀한 배치를 만들었다.
🧩 주요 포인트
- nanoVLM 학습 속도 저하의 주원인은 모델이나 GPU가 아니라 데이터 공급 지연과 배치의 약 60%를 차지한 불필요한 패딩이었다.
- 고정 최대 길이를 적용해 긴 샘플을 제거하는 방식은 낭비를 일부 줄였지만, 실제 길이와 무관하게 동일한 크기로 패딩하고 샘플 수도 감소시키는 한계가 있었다.
- 배치를 최대 토큰 용량을 가진 배낭으로 보고 시퀀스를 조합하면, 순차적 탐욕법보다 First Fit Decreasing 기반 빈 패킹이 남는 공간을 더 촘촘하게 채울 수 있었다.
- 실제 멀티모달 파이프라인에서는 토큰 수뿐 아니라 이미지 수까지 제약으로 사용하고, 작업자별 샤딩과 생산자-소비자 큐를 결합해 동적으로 배치를 생성했다.
- 최종 ConstantLengthDataset은 과도한 샘플을 걸러낸 뒤 토큰과 이미지 수를 균형 있게 묶고 필요한 만큼만 패딩해, 기존 방식보다 유용한 데이터가 조밀한 배치를 만들었다.
🧠 상세 정리
1. 문제의 출발점: 일하지 못하는 GPU와 패딩 낭비
글은 데이터와 모델, 충분한 GPU를 준비했는데도 학습이 예상보다 느리고 GPU 사용률이 낮은 상황에서 출발한다. nanoVLM 프로젝트를 조사한 결과, 병목은 모델 구조나 하드웨어 성능이 아니라 데이터를 비효율적으로 준비하고 공급하는 파이프라인에 있었다. 모델은 다음 데이터가 도착할 때까지 기다렸고, 배치 내부에는 학습에 기여하지 않는 패딩 토큰이 대량으로 포함되어 GPU 연산과 비용을 낭비하고 있었다. 저자들은 이 문제를 한 번에 해결책으로 덮지 않고, 데이터 확인에서 시작해 단순 패딩과 길이 제한을 거친 뒤 배낭식 패킹으로 발전시키는 다섯 단계의 실험으로 설명한다.
2. 준비와 데이터셋 시각화
저자들은 nanoVLM 전체 코드와 데이터 준비 로직이 뒤섞여 이해하기 어려워지는 것을 피하려고, 파이프라인만 다루는 별도 mmdp 저장소를 제공한다. 저장소에는 최종 데이터 준비 작업뿐 아니라 각 개선 단계를 실행하고 비교할 수 있는 스크립트가 들어 있어 다른 데이터 파이프라인의 출발점으로도 활용할 수 있도록 구성되었다. 첫 단계에서는 이미지, 텍스트 프롬프트, 응답으로 이루어진 멀티모달 샘플을 무작위로 확인해 실제 입력의 형태와 편차를 파악한다. 저자들은 최적화에 앞서 훈련 데이터를 반복적으로 살펴보는 일이 중요하다고 강조하며, 제공된 스크립트를 여러 번 실행하거나 노트북으로 옮겨 다양한 샘플을 관찰하라고 권한다.
3. 단순 패딩이 만든 약 60%의 빈 연산
첫 학습 방식은 모든 샘플을 토큰화하고, 각 배치에서 가장 긴 시퀀스를 찾은 다음, 나머지 시퀀스를 그 길이에 맞춰 패딩하는 일반적인 접근이었다. 구현하기 쉽고 학습 입력의 텐서 크기를 맞출 수 있다는 장점은 있지만, 길이가 크게 다른 샘플이 같은 배치에 들어오면 짧은 샘플 뒤에 많은 빈 토큰이 붙는다. 실제 시각화에서는 회색으로 표시된 패딩 영역이 배치의 약 60%를 차지했으며, GPU가 그만큼 학습 정보가 없는 위치를 처리하고 있었다. 이 결과는 모델에 전달되는 배치의 외형적 크기와 실제로 유용한 토큰의 양이 크게 다를 수 있으며, 단순한 배치 구성 자체가 GPU 활용률과 비용을 악화시킬 수 있음을 보여준다.
4. 고정 길이 제한의 개선 효과와 한계
다음 단계에서는 전역 최대 길이를 정하고 그 기준을 넘는 샘플을 제거하는 제한 패딩 방식을 적용한다. 지나치게 긴 하나의 샘플 때문에 배치 전체가 큰 길이로 확장되는 상황을 막을 수 있어 단순 패딩보다는 낭비가 줄어들었다. 그러나 남은 샘플의 실제 길이가 서로 달라도 모두 동일한 고정 길이에 맞춰 패딩해야 했기 때문에 빈 영역은 여전히 상당 부분 남았다. 또한 필터링으로 인해 예시 배치에서 샘플 하나가 빠졌듯이, 길이 제한은 계산량을 통제하는 대신 사용할 수 있는 샘플 수를 감소시킬 수 있었다. 저자들은 이 방식을 이전 단계보다 낫지만 근본적인 해결은 아니라고 평가하고, 배치 자체를 고정된 샘플 묶음이 아닌 용량 제한 아래 조합하는 문제로 다시 정의한다.
5. 배치를 배낭 문제로 재정의하기
네 번째 단계에서는 배치를 최대 토큰 용량인 max_length를 가진 배낭으로, 각 토큰화된 프롬프트·응답 시퀀스를 토큰 수만큼의 무게를 가진 물건으로 간주한다. 목표는 총 토큰 수가 한도를 넘지 않는 범위에서 가능한 한 많은 시퀀스를 함께 넣어 남는 공간과 패딩을 최소화하는 것이다. 저자들은 이미지와 텍스트의 복잡성을 곧바로 다루지 않고, 시퀀스 길이를 나타내는 1부터 25까지의 정수 목록으로 먼저 알고리즘을 시험한다. 동적 배치를 생성하기 위해 일반적인 인덱스 접근형 데이터셋 대신 PyTorch의 IterableDataset을 상속하며, 단일 작업자에게는 전체 범위를 주고 여러 작업자에게는 계산된 구간별로 데이터를 나눠 처리하도록 샤딩한다.
6. 생산자-소비자 구조와 두 가지 패킹 전략
패킹 과정에서 정렬이나 셔플이 데이터 공급을 막지 않도록, 저자들은 파이썬 큐를 이용한 생산자-소비자 구조를 적용한다. 생산자 스레드는 입력을 패킹해 큐에 넣고 주 스레드는 준비된 묶음을 필요할 때 꺼내므로, 패킹과 소비 작업이 겹쳐 실행되며 데이터 흐름을 유지할 수 있다. 단순 탐욕 전략은 입력 순서대로 항목을 더하다가 최대 길이를 넘으면 현재 묶음을 내보내고 새 묶음을 시작해 빠르게 동작하지만, 뒤쪽 배치가 성기게 남는 문제가 나타났다. 반면 First Fit Decreasing 방식의 빈 패킹은 버퍼의 항목을 긴 순서로 정렬한 뒤 들어갈 공간이 있는 첫 묶음에 배치하고, 맞는 곳이 없을 때만 새 묶음을 만든다. 정수 예제에서 이 방식은 서로 다른 길이를 더 촘촘하게 조합해 탐욕법보다 남는 공간이 적은 배치를 만들었다.
7. 멀티모달 데이터에 적용한 균형 배낭 패킹
다섯 번째 단계에서는 정수 길이 대신 이미지, 프롬프트, 응답으로 구성된 실제 샘플을 패킹하며, 토큰 한도와 이미지 예산을 동시에 만족시켜야 한다. 이미지 예산은 특정 GPU가 다른 GPU보다 훨씬 많은 이미지를 처리하는 불균형을 피하기 위한 제약으로 사용된다. ConstantLengthDataset은 샘플을 읽고 토큰이나 이미지가 지나치게 많은 항목을 제거한 뒤, 토큰 수와 이미지 수를 함께 고려하는 탐욕식 배낭 전략으로 샘플을 묶는다. 이후 한 그룹의 토큰과 이미지를 연결하고 정렬해 input_ids, labels, attention_mask, images를 포함한 사전 형태로 출력하며, 마지막에는 고정 길이에 맞추되 이전 방식보다 훨씬 적은 패딩만 추가한다. 그 결과 배낭 방식의 샘플 분포가 제한 패딩보다 고르게 나타났고, 필터링 때문에 배치의 샘플 수가 눈에 띄게 줄어드는 문제도 피할 수 있었다.
8. 결론과 후속 균형화 제안
저자들은 학습이 느린 이유를 추적한 작업이 멀티모달 데이터 처리 방식 전체를 다시 설계하는 결과로 이어졌다고 정리한다. 핵심 교훈은 가장 긴 시퀀스에 맞춘 패딩이 유효한 첫 구현이지만 낭비가 크며, 배치를 패킹 문제로 바라보고 텍스트 길이와 이미지 메모리 같은 모든 제약을 함께 고려해야 한다는 것이다. 또한 복잡한 실제 데이터에 적용하기 전에 정수와 같은 장난감 데이터로 알고리즘을 검증하는 절차를 권하며, 사용한 균형 배낭 전략은 NVIDIA의 Eagle 2 논문에서 가져왔다고 밝힌다. 게시물의 커뮤니티 의견에서는 실제 상황에 가까운 비교를 위해 원본 데이터를 셔플하고, 이미지 수뿐 아니라 각 패킹에 포함되는 예시 개수도 균형화하면 학습에 도움이 될 수 있다는 보완점이 제시되었다. 저자는 이 제안을 긍정적으로 받아들이며 게시물에 직접 반영하고 공동 저자로 참여할 것을 제안했다.
🧾 핵심 주장 / 시사점
- 멀티모달 학습 성능은 모델 연산만으로 결정되지 않으며, GPU에 유용한 토큰과 이미지를 얼마나 끊김 없이 조밀하게 공급하는지가 직접적인 병목이 될 수 있다.
- 고정 길이 제한은 극단적으로 긴 샘플의 영향을 줄이지만 데이터 손실과 잔여 패딩을 함께 만들기 때문에, 서로 다른 길이의 샘플을 용량 안에서 조합하는 패킹이 더 근본적인 접근이다.
- 실제 멀티모달 배치에서는 토큰 총량만 최적화해서는 충분하지 않고 이미지 수와 예시 개수의 작업 편차까지 함께 살펴야 하며, 알고리즘 효율과 데이터 공급의 비동기화도 동시에 고려해야 한다.
✅ 액션 아이템
- 데이터 병목 분석을 모델·GPU 성능이 아니라 공급 지연과 배치 패딩 비율 중심으로 정렬해 병목 원인을 정량 추적한다.
- 배치 구성은 고정 최대 길이 제거 후 First Fit Decreasing 기반 빈 패킹으로 전환해 남는 공간 활용도를 높인다.
- ConstantLengthDataset에 토큰·이미지 이중 제약과 과도 샘플 필터링을 반영해, 필요 패딩만 남기는 동적 배치 파이프라인을 정비한다.
❓ 열린 질문
- 토큰·이미지 제약에서 두 자원을 동등 가중치로 볼지, 작업 부하 특성에 맞는 가중치를 어떻게 정할 것인가?
- First Fit Decreasing 방식이 순차 탐욕법 대비 실제 GPU 유휴 시간과 배치 밀도 개선 폭은 어느 지표로 판단할 것인가?
- 과도한 샘플 걸러내기 임계치가 지나치면 유용 데이터 분포가 어떻게 달라지는지 어떤 기준으로 감시할 것인가?