마지막 업데이트: 21 May, 2025

TL;DR – 선택한 파일 포맷은 훈련 시간을 30‑50 % 단축하고, 저장 비용을 1 %–5 % 줄이며, 멀티모달 모델이 정렬되지 않은 데이터 때문에 오류가 나는 것을 방지합니다. 최적의 선택은 스트리밍 준비가 된 컬럼형 바이너리 컨테이너(TFRecord, WebDataset, Arrow/Parquet)로, 사전 토큰화된 텍스트와 사전 인코딩된 미디어를 하나의 버전 관리 샤드에 저장하는 것입니다.
파일 포맷이 AI 훈련에 중요한 이유
| 사실 | 당신에게 의미하는 바 |
|---|---|
| 바이너리, 컬럼형 포맷은 CSV 또는 일반 텍스트보다 30‑50 % 빠릅니다 | 하드웨어(GPU/TPU)와 파이프라인(TensorFlow, PyTorch, Spark)에 직접 연결되는 포맷을 선택하세요. |
| 불일치하는 토큰화 또는 이미지 디코딩은 모델 품질을 저하시킵니다 | 전처리 파이프라인을 한 번 고정한 뒤, 이미 토큰화된 또는 사전 인코딩된 표현을 저장하세요. |
| 페타바이트 규모 LLM은 1 % 용량 감소만으로도 수백만 달러를 절감합니다 | 압축된 샤드 컨테이너(ZSTD‑TFRecord, 사전 인코딩이 적용된 Arrow/Parquet)를 사용하세요. |
| 멀티모달 모델은 동기화된 정렬 메타데이터가 필요합니다 | 타임스탬프, 바운딩 박스, 캡션 ID를 별도 파일이 아니라 같은 레코드 안에 보관하세요. |
| 규제 준수는 이제 불변이며 해시 검증된 데이터를 요구합니다 | 스키마, 체크섬, 출처, 버전을 기록한 매니페스트(JSON/YAML)를 생성하세요. |
핵심 요점: 포맷은 느린 I/O, 잡음 데이터, 그리고 규제 문제에 대한 첫 번째 방어선입니다.
핵심 개념 및 용어 (빠른 참고)
| 개념 | 한 문장 정의 | 전형적인 사용 사례 |
|---|---|---|
| 샤딩 | 거대한 데이터셋을 여러 개의 작고 독립적으로 읽을 수 있는 파일(예: 1 GB 샤드)로 분할합니다. | 분산 훈련 클러스터에서 병렬 로딩. |
| 스트리밍‑레디 포맷 | 무작위 탐색 없이 순차적으로 읽을 수 있는 파일(TFRecord, WebDataset .tar). | 로컬 복사 없이 S3/GCS에서 직접 훈련. |
| 컬럼형 스토리지 | 데이터를 행이 아니라 열 단위로 저장합니다(Parquet, Arrow). | 단일 모달리티(예: 캡션만 로드) 필터링에 효율적. |
| 자체 기술 스키마 | 파일에 자체 필드 이름과 타입이 포함됩니다. | 코드 버전 간 호환성을 보장합니다. |
| 지연 디코딩 / 사전 토큰화 | 이미 토큰화된 텍스트(int‑IDs) 또는 사전 계산된 임베딩을 저장합니다. | 각 에포크마다 전처리 시간을 2‑5배 단축합니다. |
| 멀티모달 레코드 | 이미지, 텍스트, 오디오 및 메타데이터를 하나의 논리 레코드로 묶습니다. | 비전‑언어 또는 오디오‑텍스트 모델을 위한 동기화 샘플링을 가능하게 합니다. |
| 매니페스트 / 인덱스 파일 | 모든 샤드, 체크섬 및 샤드별 통계를 나열한 작은 JSON/YAML 파일 | 빠른 검증, 재개 가능한 훈련, 감사 로그 |
| 데이터 버전 관리 | 데이터를 코드처럼 다루기(DVC, LakeFS, Pachyderm). | 재현 가능한 실험 및 규제 준수 |
올바른 포맷 선택하기
| 포맷 | 지원 모달리티 | 압축 | 스트리밍 | 스키마 | 생태계 |
|---|---|---|---|---|---|
| TFRecord | 텍스트, 이미지, 오디오 등 모든 바이너리 블롭 | 내장 GZIP/ZSTD | ✅ | 암시적(tf.io.parse_example 사용) | TensorFlow, PyTorch(torchdata), HuggingFace datasets |
WebDataset (.tar, .tar.gz) | 멀티모달(이미지 + 텍스트 + 오디오) | 외부(gzip, zstd) | ✅ | 암시적 키‑값 | PyTorch DataLoader, webdataset 라이브러리 |
| Apache Arrow / Parquet | 컬럼형, 중첩 구조, 바이너리 블롭 | Snappy/ZSTD/LZ4 | ✅ (Arrow Flight) | ✅ (자체 기술) | Spark, Pandas, PyArrow, HuggingFace datasets |
| JSONL / NDJSON | 사람에게 읽기 쉬운, 유연함 | 없음(또는 gzip) | ❌ | 암시적 | 빠른 프로토타이핑, 소규모 데이터셋 |
| LMDB | 빠른 랜덤 읽기(키‑값) | 없음(압축 블롭 저장) | ❌ | 암시적 | 검색 강화 생성 |
| HDF5 | 계층적 그룹, 대형 배열 | 내장 gzip/lzf | ❌ (청크 필요) | 암시적 | 과학 데이터, 오디오 스펙트로그램 |
- 대규모 훈련 → TFRecord, WebDataset, 또는 Arrow/Parquet (스트리밍, 압축, 샤딩 지원).
- 탐색적 작업 → JSONL (사람이 읽기 쉬우며 편집이 간편).
- 무거운 랜덤 접근(예: 검색 강화 생성) → LMDB.
단계별 청사진 (원시 파일에서 프로덕션‑준비 샤드까지)
단일 진실 소스 스키마 정의
message MultiModalExample { bytes image = 1; // JPEG‑XL or AVIF repeated int32 caption = 2; // token IDs bytes audio = 3; // Opus or FLAC map<string, string> meta = 4; // source_id, timestamp, etc. }이
.proto(또는 Arrow 스키마)를 데이터셋과 함께 저장하세요.원시 자산 수집 및 정리
- 텍스트: Unicode‑NFKC 적용, 제어 문자 제거, 중복 제거.
- 이미지: 무손실 PNG로 변환 후 필요에 따라 손실 JPEG‑XL(품질 85‑90 %)로 변환.
- 오디오: 16 kHz, 16‑bit PCM으로 재샘플링; Opus(손실) 또는 FLAC(무손실)로 인코딩.
전처리 / 토큰화
모델에 바로 입력할 토크나이저(예:tiktokenfor GPT‑NeoX)를 사용하세요. 결과int32[]토큰 ID를 레코드에 직접 저장합니다.각 레코드 직렬화
빠른 바이너리 직렬화기(Protocol Buffers, FlatBuffers, Arrow IPC) 중 하나를 선택합니다. 목표는 예시당 하나의 바이트 문자열을 만들어 TFRecord 또는 tarball에 기록하는 것입니다.샤드 및 압축
- 목표 샤드 크기: 256 MiB – 1 GiB (S3 GET 범위 요청에 최적).
- Zstandard(level 3‑5) 로 압축 – 빠른 해제와 좋은 비율.
- 파일명 규칙:
train-00000-of-01000.tfrecord.zst.
매니페스트 생성
[ { "shard": "train-00000-of-01000.tfrecord.zst", "checksum": "sha256:ab12…", "num_examples": 12456, "avg_seq_len": 256, "git_hash": "d3f9c1e" }, … ]매니페스트는 검증, 재개 가능한 훈련, 감사의 단일 진실 소스입니다.
검증
레코드 0.1 %를 무작위 샘플링해 각 필드를 디코드하고 이미지 디코드, 토큰 길이, 오디오 길이 등 정상 여부를 확인합니다. 어휘 커버리지, 해상도 분포 등 전역 통계를 계산해 매니페스트에 저장합니다.버전 관리 및 불변 저장
샤드와 매니페스트를 불변 버킷(gs://my‑project/datasets/v1/)에 푸시합니다. 의미 체계 버전(v1.0.0)을 태그하고 스냅샷을 데이터‑버전 관리 시스템(DVC, LakeFS)에 등록합니다.훈련 루프에서 로드
# PyTorch + WebDataset example import webdataset as wds, torch, torchvision, torchaudio def decode(sample): img = torchvision.io.decode_image(sample["jpg"], mode=torchvision.io.ImageReadMode.RGB) txt = torch.tensor([int(t) for t in sample["txt"].decode().split()], dtype=torch.long) wav, _ = torchaudio.load(io.BytesIO(sample["wav"])) return {"image": img, "caption": txt, "audio": wav} ds = (wds.WebDataset("s3://my-bucket/train-{00000..00999}.tar.zst") .decode("torchrgb") .map(decode) .batched(64) .prefetch(2)) loader = torch.utils.data.DataLoader(ds, num_workers=8) for batch in loader: # feed to model … pass
떠오르는 트렌드 및 미래 대비
| 트렌드 | 현재 중요 이유 | 빠른 조치 |
|---|---|---|
| 통합 멀티모달 컨테이너(Meta의 MDS, DeepLake) | 텍스트, 이미지, 비디오, 오디오, 임베딩을 하나의 파일 타입으로 제공하며 내장 버전 관리 기능을 갖추고 있습니다. | DeepLake로 파일럿을 진행해 보세요; LangChain 및 LlamaIndex와 통합됩니다. |
| 제로 카피 GPU‑다이렉트 스토리지 | NVMe‑over‑Fabric와 GPUDirect를 사용하면 압축된 샤드를 GPU 메모리로 바로 스트리밍할 수 있습니다. | NVMe‑SSD 풀을 보유하고 있다면 torch.utils.data.DataLoader(persistent_workers=True)를 활성화하세요. |
| 스키마 진화 친화 포맷 | Arrow 13 이상에서는 전체 데이터셋을 다시 쓰지 않고도 필드를 추가·제거할 수 있습니다. | 깊이 맵, 비디오, 추가 메타데이터를 나중에 수집할 가능성이 있는 파이프라인에는 Arrow/Parquet를 우선 선택하세요. |
| 자기 지도 사전 인코딩 | CLIP 이미지 임베딩이나 wav2vec 오디오 임베딩을 저장하면 파인튜닝 시 연산량을 2‑3배 줄일 수 있습니다. | Arrow 테이블에 image_emb(float16) 컬럼을 추가하고, 원본 이미지는 향후 실험을 위해 보관하세요. |
| 프라이버시 보호 스토리지 | 암호화된 TFRecord와 보안 엔클레이브는 GDPR이 엄격한 분야에서 등장하고 있습니다. | PII를 다루는 경우, 맞춤형 암호화 래퍼와 함께 tf.io.TFRecordWriter를 평가해 보세요. |
| 데이터 중심 AI 메트릭 | 데이터 품질 점수(OCR 신뢰도, 흐림 지표, SNR)가 이제 주요 하이퍼파라미터로 취급됩니다. | 매니페스트에 샤드별 품질 점수를 저장하고, 훈련 시 품질이 낮은 샤드를 필터링하세요. |
프로덕션‑준비 체크리스트
- 스키마 파일(
.proto또는 Arrow 스키마)을 데이터 옆에 저장합니다. - 모든 샤드를 빠른 코덱(ZSTD‑L3 권장)으로 압축합니다.
- 샤드 크기를 256 MiB에서 1 GiB 사이로 설정합니다.
- 매니페스트에 체크섬, 레코드 수, 샤드별 통계 및 전처리 코드의 git 해시를 포함합니다.
- 불변 버전 관리(DVC, LakeFS 등)를 사용합니다.
- 샤드별 데이터 품질 메트릭을 기록합니다.
- 프라이버시 감사 완료(PII 삭제, 선택적 암호화).
- 오류 없이 무작위 샤드를 읽을 수 있는 엔드‑투‑엔드 테스트 로더를 구현합니다.
- 스키마, 전처리 단계 및 샤드 재생성 방법을 설명하는 README를 작성합니다.
이 청사진을 따르면 훈련 파이프라인을 빠르고, 저렴하며, 재현 가능하게 유지할 수 있습니다—현대 LLM 팀이 필요로 하는 세 가지 핵심 축입니다.
Tags: data‑engineering multi‑modal‑llm training‑pipelines
Slug: how-to-prepare-data-file-formats-for-ai-training