هر پروژهی هوش مصنوعی و یادگیری ماشین پیش از معماری مدل یا تنظیم هایپرپارامترها، با داده آغاز میشود. دانلود دستی، تبدیلهای مداوم فرمتها میان CSV و JSON و بخشبندی غیراصولی دادهها فرایندی فرسایشی و خطاست که بازتولیدپذیری (reproducibility) آزمایشها را از بین میبرد. داشتن یک پایپلاین استاندارد برای بارگذاری، کَش و ذخیرهسازی، اولین گام حرفهای در مهندسی دادههای یادگیری ماشین است.
کتابخانهی `datasets` از اکوسیستم Hugging Face استاندارد روز برای مدیریت دادههای هوش مصنوعی است. این ابزار به کمک لایهی زیرین Apache Arrow و فرمت ستونی Parquet، خواندن دادهها را بهینهسازی میکند و با قابلیت استریم (streaming)، امکان کار با دادههای چند ده گیگابایتی را حتی روی سیستمی با رم و حافظهی محدود فراهم میسازد.
از سوی دیگر، دانلود از مخازن خارجی نظیر Hugging Face و PyPI از داخل ایران گاهی با کندی یا ناپایداری روبهرو میشود؛ بنابراین آشنایی با سازوکار کَش محلی، کاهش مصرف پهنای باند و شناخت شیوههای ذخیرهسازی و نسخهبندی حجمهای سنگین (مانند Git LFS یا DVC) برای توسعهدهندگان ایرانی ضرورتی دوچندان دارد.
داده همان سوخت است؛ نحوهی مدیریت آن تعیین میکند با چه سرعتی پیش بروید.
اهداف یادگیری
- بارگذاری، استریم و کَش کردن مجموعهدادهها با کتابخانهی
datasetsاز Hugging Face - تبدیل فرمتها میان CSV، JSON، Parquet و Arrow و درک مزایا و معایب هرکدام
- ساخت بخشبندیهای آموزش، اعتبارسنجی و آزمون (train/validation/test) با بازتولیدپذیری تضمینشده با کمک سید رندوم (random seed) ثابت
- مدیریت فایلهای حجیم مدل و مجموعهداده با استفاده از
.gitignore، Git LFS یا DVC
صورت مسئله
هر پروژهی هوش مصنوعی با داده آغاز میشود. باید مجموعهدادهها را پیدا کنید، دانلودشان کنید، به فرمتهای مختلف تبدیل کنید، برای آموزش و ارزیابی بخشبندیشان کنید و نسخهی آنها را نگه دارید تا آزمایشها بازتولیدپذیر (reproducible) باشند. انجام دستی این مراحل در هر بار اجرای پروژه، کند و خطاست. شما به یک جریان کاریِ تکرارپذیر نیاز دارید.
مفهوم اصلی
کتابخانهی datasets از Hugging Face روش استاندارد بارگذاری داده برای کارهای هوش مصنوعی است. این کتابخانه تمام مراحل دانلود، کش کردن، تبدیل فرمت و استریم داده را از همان ابتدا و بدون نیاز به تنظیمات خاصی انجام میدهد.
پیادهسازی
گام 1: نصب کتابخانهی datasets
pip install datasets huggingface_hub
گام 2: بارگذاری یک مجموعهداده
from datasets import load_dataset
dataset = load_dataset("stanfordnlp/imdb")
print(dataset)
print(dataset["train"][0])
این کد مجموعهدادهی نظرات فیلم IMDB را دانلود میکند. پس از اولین دانلود، دادهها از مسیر کَش در ~/.cache/huggingface/datasets/ خوانده میشوند.
گام 3: استریم مجموعهدادههای حجیم
برخی مجموعهدادهها آنقدر بزرگاند که روی دیسک جا نمیشوند. در حالت استریم (streaming)، دادهها سطر به سطر بارگذاری میشوند؛ بدون آنکه نیاز باشد کل مجموعهداده دانلود شود.
dataset = load_dataset("wikimedia/wikipedia", "20231101.en", split="train", streaming=True)
for i, example in enumerate(dataset):
print(example["title"])
if i >= 4:
break
با استریم کردن، یک IterableDataset دریافت میکنید. دادهها را به محض دریافت پردازش میکنید و مصرف حافظه صرفنظر از اندازهی مجموعهداده، همواره ثابت میماند.
گام 4: فرمتهای مجموعهداده
کتابخانهی datasets در لایهی زیرین از Apache Arrow استفاده میکند. بسته به نیازمندیهای پایپلاین خود، میتوانید دادهها را به فرمتهای دیگر تبدیل کنید.
dataset = load_dataset("stanfordnlp/imdb", split="train")
dataset.to_csv("imdb_train.csv")
dataset.to_json("imdb_train.json")
dataset.to_parquet("imdb_train.parquet")
مقایسهی فرمتها:
| فرمت | حجم | سرعت خواندن | مناسب برای |
|---|---|---|---|
| CSV | زیاد | کند | خوانایی برای انسان، نرمافزارهای صفحهگسترده |
| JSON | زیاد | کند | APIها، دادههای تودرتو |
| Parquet | کم | سریع | تحلیل داده، کوئریهای ستونی |
| Arrow | کم | سریعترین | پردازش درونحافظهای (فرمت داخلی خود datasets) |
برای پروژههای هوش مصنوعی، Parquet بهترین فرمت برای ذخیرهسازی است. فرمت Arrow همان چیزی است که درون حافظه با آن کار میکنید؛ CSV و JSON هم صرفاً برای جابهجایی و تبادل داده کاربرد دارند.
گام 5: بخشبندی دادهها
هر پروژهی یادگیری ماشین به سه بخش نیاز دارد:
- آموزش (Train): مدل از روی این دادهها یاد میگیرد (معمولاً 80%)
- اعتبارسنجی (Validation): روند پیشرفت مدل در طول آموزش با آن بررسی میشود (معمولاً 10%)
- آزمون (Test): ارزیابی نهایی مدل پس از پایان کامل آموزش (معمولاً 10%)
برخی مجموعهدادهها از قبل بخشبندی شدهاند. اگر چنین نبود، خودتان آنها را تفکیک کنید:
dataset = load_dataset("stanfordnlp/imdb", split="train")
split = dataset.train_test_split(test_size=0.2, seed=42)
train_val = split["train"].train_test_split(test_size=0.125, seed=42)
train_ds = train_val["train"]
val_ds = train_val["test"]
test_ds = split["test"]
print(f"Train: {len(train_ds)}, Val: {len(val_ds)}, Test: {len(test_ds)}")
همیشه یک مقدار ثابت برای seed تنظیم کنید تا نتایج بازتولیدپذیر بمانند؛ چون یک seed مشخص در هر بار اجرا، دقیقاً همان بخشبندی یکسان را تولید میکند.
گام 6: دانلود و کَش کردن مدلها
مدلها فایلهای بسیار حجیمی دارند. کتابخانهی huggingface_hub فرایند دانلود و کَش کردن آنها را مدیریت میکند.
from huggingface_hub import hf_hub_download, snapshot_download
model_path = hf_hub_download(
repo_id="sentence-transformers/all-MiniLM-L6-v2",
filename="config.json"
)
print(f"Cached at: {model_path}")
model_dir = snapshot_download("sentence-transformers/all-MiniLM-L6-v2")
print(f"Full model at: {model_dir}")
مدلها در مسیر ~/.cache/huggingface/hub/ ذخیره میشوند. پس از دانلود، در دفعات بعدی بلافاصله اجرا و خوانده خواهند شد.
گام 7: مدیریت فایلهای حجیم
وزنهای مدل و مجموعهدادههای حجیم نباید وارد git شوند. برای حل این موضوع سه راه دارید:
گزینهی اول: .gitignore (سادهترین روش)
*.bin
*.safetensors
*.pt
*.onnx
data/*.parquet
data/*.csv
models/
گزینهی دوم: Git LFS (رهگیری فایلهای حجیم در git)
git lfs install
git lfs track "*.bin"
git lfs track "*.safetensors"
git add .gitattributes
ابزار Git LFS فقط پوینترها را داخل مخزن شما نگه میدارد و فایلهای اصلی را روی یک سرور جداگانه ذخیره میکند. گیتهاب تا سقف 1 گیگابایت فضای رایگان در اختیارتان میگذارد.
گزینهی سوم: DVC (کنترل نسخهی دادهها)
pip install dvc
dvc init
dvc add data/training_set.parquet
git add data/training_set.parquet.dvc data/.gitignore
git commit -m "Track training data with DVC"
ابزار DVC فایلهای سبکی با پسوند .dvc میسازد که به دادههای اصلی اشاره میکنند. خودِ دادهها در S3، GCS یا دیگر فضاهای ذخیرهسازی در مخزن راهدور قرار میگیرند.
| رویکرد | پیچیدگی | مناسب برای |
|---|---|---|
| .gitignore | کم | پروژههای شخصی، دادههایی با قابلیت دانلود مجدد |
| Git LFS | متوسط | تیمهایی که وزنهای مدل را از طریق git به اشتراک میگذارند |
| DVC | زیاد | آزمایشهای بازتولیدپذیر، مجموعهدادههای بزرگ، کارهای تیمی |
برای این دوره، همان .gitignore کافی است. فقط زمانی سراغ DVC بروید که نیاز به بازتولید دقیق آزمایشها روی سیستمهای مختلف داشته باشید.
گام 8: الگوهای ذخیرهسازی
ذخیرهسازی محلی (Local storage) برای مجموعهدادههای زیر 10 گیگابایت جواب میدهد؛ کَش HF این کار را خودکار مدیریت میکند.
ذخیرهسازی ابری (Cloud storage) برای هر دیتای بزرگتر از این یا دادههای مشترک بین چند سیستم است:
import os
local_path = os.path.expanduser("~/.cache/huggingface/datasets/")
# s3_path = "s3://my-bucket/datasets/"
# gcs_path = "gs://my-bucket/datasets/"
ابزار DVC مستقیماً با S3 و GCS ادغام میشود:
dvc remote add -d myremote s3://my-bucket/dvc-store
dvc push
در این دوره ذخیرهسازی محلی برایتان کاملاً کافی است؛ ذخیرهسازی ابری زمانی اهمیت پیدا میکند که بخواهید مدلها را روی نمونههای GPU در سرورهای ابری فاینتیون کنید.
مجموعهدادههای استفادهشده در این دوره
| مجموعهداده | درسها | حجم | موضوع آموزشی |
|---|---|---|---|
| IMDB | توکنسازی، طبقهبندی | 84 MB | مبانی طبقهبندی متن |
| WikiText | مدلسازی زبان | 181 MB | پیشبینی توکن بعدی |
| SQuAD | سیستمهای پرسش و پاسخ | 35 MB | پاسخ به سؤالات، پیدا کردن بازهها (spans) |
| Common Crawl (بخش منتخبی) | امبدینگها | متغیر | پردازش متن در مقیاس وسیع |
| MNIST | مبانی بینایی ماشین | 21 MB | پایههای طبقهبندی تصویر |
| COCO (بخش منتخبی) | چندوجهی (Multimodal) | متغیر | جفتهای تصویر و متن |
نیازی نیست همهی اینها را همین الان دانلود کنید. هر درس دقیقاً مشخص میکند به کدام موارد نیاز دارد.
استفاده از کد
برای بررسی صحت کارکرد همه بخشها، اسکریپت زیر را اجرا کنید:
python code/data_utils.py
این اسکریپت مجموعهدادهی کوچکی را دانلود میکند، فرمتش را تغییر میدهد، آن را بخشبندی میکند و در پایان خلاصهای از نتایج را نمایش میدهد.
خروجی این درس
از این درس موارد زیر حاصل میشود:
code/data_utils.py- ابزار کاربردی و قابل استفادهی مجدد برای بارگذاری و کَش کردن دادههاoutputs/prompt-data-helper.md- پرامپتی برای پیدا کردن مجموعهدادهی مناسب هر کار
تمرینها
- مجموعهدادهی
glueرا با کانفیگmrpcبارگذاری کنید و 5 نمونهی اول آن را ببینید. - مجموعهدادهی
c4را استریم کنید و بشمارید در مدت 10 ثانیه چند نمونه پردازش میشود. - یک مجموعهداده را به فرمت Parquet تبدیل کرده و حجم فایل را با CSV مقایسه کنید.
- با یک seed ثابت، دادهها را با نسبتهای 70/15/15 بین train/val/test بخشبندی کرده و تعداد سطرهای هرکدام را چک کنید.
راهنماییها
تمرین 1. تابع load_and_inspect("glue", "mrpc") را از فایل code/data_utils.py فراخوانی کنید یا مستقیماً دستور load_dataset("glue", "mrpc") را بزنید و ds["train"][:5] را چاپ کنید. هر نمونه باید دارای فیلدهای sentence1، sentence2 و label باشد.
تمرین 2. مجموعهداده را مانند تابع stream_dataset با آرگومان streaming=True بارگذاری کنید و نمونهها را در حلقهای بخوانید که پس از گذشت 10 ثانیه از زمان شروع (time.time()) متوقف شود. تعداد را چاپ کنید؛ این کار را دو بار اجرا کنید چون بار اول زمان راهاندازی اتصال به سرور را هم شامل میشود.
تمرین 3. مانند تابع convert_format، همان مجموعهداده را با دو تابع to_csv و to_parquet ذخیره کنید، سپس با دستور ls -lh یا تابع os.path.getsize حجم فایلها را مقایسه کنید. فایل Parquet را با load_from_parquet دوباره بخوانید و بررسی کنید که تعداد سطرها تغییری نکرده باشد.
تمرین 4. از تابع train_test_split دو بار با یک seed ثابت استفاده کنید: اول 30 درصد داده را جدا کنید، سپس آن 30 درصد را به دو نیم تقسیم کنید. مجموع طول این سه بخش باید برابر با طول دادهی اولیه شود و اجرای مجدد با همان seed نیز باید دقیقاً همان سطر اول را در هر بخش تولید کند.
اصطلاحات کلیدی
| اصطلاح | در گفتوگوهای عامیانه | معنای دقیق فنی |
|---|---|---|
| Dataset split | «دادههای آموزشی» | زیرمجموعهای نامگذاریشده (train/val/test) که در مراحل مختلف چرخهی یادگیری ماشین به کار میرود |
| Streaming | «لود تنبل (lazy)» | پردازش دادهها به صورت سطر به سطر از یک منبع در مخزن راهدور، بدون نیاز به دانلود کل مجموعهداده |
| Parquet | «همان CSV فشرده» | فرمت فایل ستونی که برای کوئریهای تحلیلی و صرفهجویی در فضای ذخیرهسازی بهینهسازی شده است |
| Arrow | «دیتافریمِ فوقسریع» | فرمت ستونی درونحافظهای که در کتابخانهی datasets برای خواندن دادهها بدون کپی اضافه (zero-copy) به کار میرود |
| Git LFS | «گیت برای فایلهای حجیم» | افزونهای که فایلهای بزرگ را خارج از مخزن اصلی git نگه میدارد و فقط پوینترهای آنها را در کنترل نسخه حفظ میکند |
| DVC | «گیت برای دادهها» | سیستم کنترل نسخه ویژهی مجموعهدادهها و مدلها که با فضاهای ذخیرهسازی ابری یکپارچه میشود |
| Cache | «قبلاً دانلود شده» | نسخهای محلی از دادههای دانلودشدهی قبلی که به طور پیشفرض در مسیر ~/.cache/huggingface/ ذخیره میشود |
