อัปเดตล่าสุด: 21 May, 2025

TL;DR – รูปแบบไฟล์ที่คุณเลือกสามารถลดเวลาในการฝึกได้ 30‑50 %, ลดค่าใช้จ่ายการจัดเก็บโดย 1 %–5 %, และทำให้โมเดลหลายโหมดของคุณไม่เกิดปัญหาข้อมูลที่ไม่สอดคล้องกัน จุดที่เหมาะสมที่สุดคือ คอนเทนเนอร์ไบนารีแบบคอลัมน์ที่พร้อมสตรีม (TFRecord, WebDataset, Arrow/Parquet) ที่เก็บ ข้อความที่ทำการแปลงเป็นโทเคนแล้ว และ สื่อที่เข้ารหัสล่วงหน้า ไว้ในชาร์ดเดียวที่ควบคุมเวอร์ชัน
ทำไมรูปแบบไฟล์จึงสำคัญสำหรับการฝึก AI
| ข้อเท็จจริง | ความหมายสำหรับคุณ |
|---|---|
| รูปแบบไบนารีแบบคอลัมน์เร็วขึ้น 30‑50 % เมื่อเทียบกับ CSV หรือข้อความธรรมดา | เลือกรูปแบบที่สื่อสารโดยตรงกับฮาร์ดแวร์ของคุณ (GPU/TPU) และ pipeline (TensorFlow, PyTorch, Spark). |
| การแปลงโทเคนหรือการถอดรหัสภาพที่ไม่สอดคล้องกันทำให้คุณภาพโมเดลลดลง | ทำให้ pipeline การเตรียมข้อมูลคงที่แล้วเก็บตัวแทนที่ แปลงเป็นโทเคนแล้ว หรือ เข้ารหัสล่วงหน้า. |
| LLM ขนาดระดับเพตาไบต์ประหยัดเงินหลายล้านดอลลาร์ด้วยการลดขนาด 1 % | ใช้คอนเทนเนอร์ที่บีบอัดและแบ่งชาร์ด (ZSTD‑TFRecord, Arrow/Parquet พร้อมการเข้ารหัสแบบพจนานุกรม). |
| โมเดลหลายโหมดต้องการเมตาดาต้าการจัดตำแหน่งที่ซิงโครไนซ์ | เก็บ timestamp, bounding box, caption ID ภายในเรคคอร์ดเดียวกัน แทนการแยกไฟล์. |
| การปฏิบัติตามกฎระเบียบในปัจจุบันต้องการข้อมูลที่ไม่เปลี่ยนแปลงและตรวจสอบด้วยแฮช | สร้าง manifest (JSON/YAML) ที่บันทึกสคีม่า, checksum, แหล่งที่มา, และเวอร์ชัน. |
สรุป: รูปแบบไฟล์เป็นแนวป้องกันแรก ต่อ I/O ที่ช้า, ข้อมูลที่มีเสียงรบกวน, และปัญหาการปฏิบัติตามกฎระเบียบ.
แนวคิดและคำศัพท์หลัก (อ้างอิงอย่างรวดเร็ว)
| แนวคิด | คำนิยามหนึ่งประโยค | กรณีการใช้งานทั่วไป |
|---|---|---|
| Sharding | การแบ่งชุดข้อมูลขนาดมหาศาลเป็นไฟล์เล็ก ๆ จำนวนมากที่สามารถอ่านได้อย่างอิสระ (เช่น ชาร์ดขนาด 1 GB). | การโหลดแบบขนานบนคลัสเตอร์การฝึกแบบกระจาย. |
| Streaming‑Ready Format | ไฟล์ที่สามารถอ่านต่อเนื่องได้โดยไม่ต้องทำการ seek แบบสุ่ม (TFRecord, WebDataset .tar). | ฝึกโมเดลโดยตรงจาก S3/GCS โดยไม่ต้องคัดลอกลงเครื่องท้องถิ่น. |
| Columnar Storage | ข้อมูลที่จัดเก็บตามคอลัมน์แทนแถว (Parquet, Arrow). | การกรองข้อมูลแบบโมดาลิตี้เดียวอย่างมีประสิทธิภาพ (เช่น โหลดเฉพาะคำบรรยาย). |
| Self‑Describing Schema | ไฟล์ฝังชื่อฟิลด์และประเภทของข้อมูลไว้ในตัวเอง. | รับประกันความเข้ากันได้ระหว่างเวอร์ชันของโค้ด. |
| Lazy Decoding / Pre‑Tokenization | การเก็บข้อความที่แปลงเป็นโทเคนแล้ว (int‑IDs) หรือ embedding ที่คำนวณล่วงหน้า. | ลดเวลา preprocessing ลง 2‑5 เท่าในแต่ละ epoch. |
| Multi‑Modal Record | เรคคอร์ดตรรกะเดียวที่รวมภาพ, ข้อความ, เสียง, และเมตาดาต้า. | ทำให้สามารถสุ่มตัวอย่างแบบซิงโครไนซ์สำหรับโมเดลวิชัน‑ภาษา หรือเสียง‑ข้อความ. |
| Manifest / Index File | ไฟล์ JSON/YAML ขนาดเล็กที่ระบุรายการชาร์ดทั้งหมด, checksum, และสถิติของแต่ละชาร์ด. | การตรวจสอบที่รวดเร็ว, การฝึกต่อได้, และเส้นทางการตรวจสอบ. |
| Data‑Versioning | การจัดการข้อมูลเหมือนโค้ด (DVC, LakeFS, Pachyderm). | การทดลองที่ทำซ้ำได้และการปฏิบัติตามกฎระเบียบ. |
การเลือกรูปแบบที่เหมาะสม
| รูปแบบ | การสนับสนุนโมดาลิตี้ | การบีบอัด | สตรีมมิ่ง | สคีม่า | ระบบนิเวศ |
|---|---|---|---|---|---|
| TFRecord | บล็อบไบนารีใด ๆ → ข้อความ, ภาพ, เสียง | มี GZIP/ZSTD ในตัว | ✅ | โดยอัตโนมัติ (ผ่าน tf.io.parse_example) | TensorFlow, PyTorch (torchdata), HuggingFace datasets |
WebDataset (.tar, .tar.gz) | หลายโหมด (ภาพ + ข้อความ + เสียง) | ภายนอก (gzip, zstd) | ✅ | โดยอัตโนมัติแบบคีย์‑ค่า | PyTorch DataLoader, webdataset lib |
| Apache Arrow / Parquet | แบบคอลัมน์, โครงสร้างซ้อน, บล็อบไบนารี | Snappy/ZSTD/LZ4 | ✅ (Arrow Flight) | ✅ (อธิบายตนเอง) | Spark, Pandas, PyArrow, HuggingFace datasets |
| JSONL / NDJSON | อ่านง่ายโดยมนุษย์, ยืดหยุ่น | ไม่มี (หรือ gzip) | ❌ | โดยอัตโนมัติ | การสร้างต้นแบบอย่างรวดเร็ว, ชุดข้อมูลขนาดเล็ก |
| LMDB | การอ่านแบบสุ่มที่เร็ว (คีย์‑ค่า) | ไม่มี (เก็บบล็อบที่บีบอัด) | ❌ | โดยอัตโนมัติ | Retrieval‑augmented generation |
| HDF5 | กลุ่มเชิงลำดับชั้น, อาเรย์ขนาดใหญ่ | มี gzip/lzf ในตัว | ❌ (ต้องใช้ chunking) | โดยอัตโนมัติ | Scientific data, audio spectrograms |
Rule of thumb:
- การฝึกในระดับใหญ่ → 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. }Store this
.proto(or Arrow schema) alongside the dataset.เก็บรวบรวมและทำความสะอาดทรัพยากรดิบ
- ข้อความ: Unicode‑NFKC, ลบอักขระควบคุม, กำจัดข้อมูลซ้ำ.
- ภาพ: แปลงเป็น PNG แบบไม่มีการสูญเสียก่อน, จากนั้นอาจแปลงเป็น JPEG‑XL แบบเสียคุณภาพ (คุณภาพ 85‑90 %).
- เสียง: รีแซมป์เป็น 16 kHz, 16‑bit PCM; เข้ารหัสด้วย Opus (เสียคุณภาพ) หรือ FLAC (ไม่มีการสูญเสีย).
ทำการประมวลผลล่วงหน้า / แปลงเป็นโทเคน
ใช้ tokenizer เดียวกันที่คุณจะป้อนให้โมเดล (เช่นtiktokenสำหรับ GPT‑NeoX). เก็บint32[]token ID ที่ได้โดยตรงในเรคคอร์ด.ทำการซีเรียลไลซ์แต่ละเรคคอร์ด
เลือกตัวซีเรียลไลเซอร์ไบนารีที่เร็ว: Protocol Buffers, FlatBuffers, หรือ Arrow IPC. เป้าหมายคือ สตริงไบต์เดียวต่อแต่ละตัวอย่าง ที่สามารถเขียนลงใน TFRecord หรือ tarball.แบ่งชาร์ดและบีบอัด
- ขนาดชาร์ดเป้าหมาย: 256 MiB – 1 GiB (เหมาะสำหรับการร้องขอช่วงของ S3 GET).
- บีบอัดด้วย Zstandard (ระดับ 3‑5) – การแตกไฟล์เร็ว, อัตราการบีบอัดดี.
- รูปแบบการตั้งชื่อ:
train-00000-of-01000.tfrecord.zst.
สร้าง manifest
[ { "shard": "train-00000-of-01000.tfrecord.zst", "checksum": "sha256:ab12…", "num_examples": 12456, "avg_seq_len": 256, "git_hash": "d3f9c1e" }, … ]Manifest เป็นแหล่งความจริงเดียวสำหรับการตรวจสอบ, การฝึกต่อได้, และการตรวจสอบ.
ตรวจสอบ
สุ่มตัวอย่าง 0.1 % ของเรคคอร์ด, ถอดรหัสแต่ละฟิลด์, และทำการตรวจสอบความสมเหตุสมผล (การถอดรหัสภาพ, ความยาวโทเคน, ระยะเวลาเสียง). คำนวณสถิติทั่วโลก (การครอบคลุม vocab, การกระจายความละเอียด) และเก็บไว้ใน manifest.เวอร์ชันและเก็บแบบไม่เปลี่ยนแปลง
ผลักดันชาร์ด + manifest ไปยัง bucket ที่ไม่เปลี่ยนแปลง (gs://my‑project/datasets/v1/). ใส่แท็กเวอร์ชันเชิงความหมาย (v1.0.0) และลงทะเบียน snapshot ในระบบเวอร์ชันข้อมูล (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’s MDS, DeepLake) | ไฟล์ชนิดเดียวสำหรับข้อความ, ภาพ, วิดีโอ, เสียง, และ embedding, พร้อมเวอร์ชันในตัว. | ลองทำพิลอตกับ DeepLake; มันรวมกับ LangChain และ LlamaIndex. |
| การจัดเก็บแบบ GPU‑direct แบบไม่มีการคัดลอก | NVMe‑over‑Fabric + GPUDirect ทำให้คุณสามารถสตรีมชาร์ดที่บีบอัดโดยตรงเข้าสู่หน่วยความจำ GPU. | เมื่อคุณมี NVMe‑SSD pool, เปิดใช้งาน torch.utils.data.DataLoader(persistent_workers=True). |
| รูปแบบที่เป็นมิตรต่อการพัฒนาสคีม่า | Arrow 13+ ให้คุณเพิ่ม/ลบฟิลด์โดยไม่ต้องเขียนชุดข้อมูลทั้งหมดใหม่. | แนะนำให้ใช้ Arrow/Parquet สำหรับ pipeline ใด ๆ ที่อาจต่อมานำเข้าภาพความลึก, วิดีโอ, หรือเมตาดาต้าเพิ่มเติม. |
| การเข้ารหัสล่วงหน้าแบบ Self‑supervised | การเก็บ embedding ของภาพจาก CLIP หรือเสียงจาก wav2vec ลดการคำนวณลง 2‑3 เท่าสำหรับการปรับแต่งต่อ. | เพิ่มคอลัมน์พิเศษ image_emb (float16) ไปยังตาราง Arrow ของคุณ; เก็บภาพดิบไว้สำหรับการทดลองในอนาคต. |
| การจัดเก็บที่รักษาความเป็นส่วนตัว | TFRecord ที่เข้ารหัส + secure enclave กำลังเกิดขึ้นสำหรับโดเมนที่มี GDPR มาก. | ประเมิน tf.io.TFRecordWriter พร้อม wrapper การเข้ารหัสแบบกำหนดเองหากคุณจัดการข้อมูลส่วนบุคคล (PII). |
| เมตริก AI ที่เน้นข้อมูล | คะแนนคุณภาพข้อมูล (ความเชื่อมั่น OCR, ตัวชี้วัดเบลอ, SNR) ตอนนี้เป็น hyper‑parameter ชั้นแรก. | เก็บคะแนนคุณภาพต่อชาร์ดใน manifest และกรองชาร์ดคุณภาพต่ำระหว่างการฝึก. |
รายการตรวจสอบพร้อมผลิต
- ไฟล์สคีม่า (
.protoหรือ Arrow schema) เก็บไว้ข้างข้อมูล - ทุกชาร์ดบีบอัดด้วย codec ที่เร็ว (แนะนำ ZSTD‑L3).
- ขนาดชาร์ดอยู่ระหว่าง 256 MiB ถึง 1 GiB.
- Manifest มี checksum, จำนวนเรคคอร์ด, สถิติแต่ละชาร์ด, และ git hash ของโค้ดการเตรียมข้อมูล.
- ระบบควบคุมเวอร์ชันที่ไม่เปลี่ยนแปลง (DVC, LakeFS, หรือคล้ายกัน).
- บันทึกเมตริกคุณภาพข้อมูลต่อชาร์ด.
- การตรวจสอบความเป็นส่วนตัวเสร็จสมบูรณ์ (การลบข้อมูลส่วนบุคคล, การเข้ารหัสแบบเลือก).
- ตัวโหลดทดสอบแบบ End‑to‑end ที่สามารถอ่านชาร์ดสุ่มได้โดยไม่มีข้อผิดพลาด.
- README ที่อธิบายสคีม่า, ขั้นตอนการเตรียมข้อมูล, และวิธีสร้างชาร์ดใหม่.
การทำตามแผนผังนี้จะทำให้ pipeline การฝึกของคุณ เร็ว, ราคาถูก, และทำซ้ำได้ — สามเสาหลักที่ทีม LLM สมัยใหม่ทุกทีมต้องการ.
Tags: data‑engineering multi‑modal‑llm training‑pipelines
Slug: how-to-prepare-data-file-formats-for-ai-training