فاز 0 · درس 9

مدیریت داده در پروژه‌های هوش مصنوعی با Hugging Face

نوع
ساختنی
زمان
حدود 45 دقیقه
زبان‌ها
Python
یک سیستم کشویی و آرشیو داده مینیمال با لایه‌های طبقه‌بندی شده منظم به رنگ‌های آبی و طوسی
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفهوم اصلی
  4. پیاده‌سازی
  5. گام 1: نصب کتابخانه‌ی datasets
  6. گام 2: بارگذاری یک مجموعه‌داده
  7. گام 3: استریم مجموعه‌داده‌های حجیم
  8. گام 4: فرمت‌های مجموعه‌داده
  9. گام 5: بخش‌بندی داده‌ها
  10. گام 6: دانلود و کَش کردن مدل‌ها
  11. گام 7: مدیریت فایل‌های حجیم
  12. گام 8: الگوهای ذخیره‌سازی
  13. مجموعه‌داده‌های استفاده‌شده در این دوره
  14. استفاده از کد
  15. خروجی این درس
  16. تمرین‌ها
  17. راهنمایی‌ها
  18. اصطلاحات کلیدی

هر پروژه‌ی هوش مصنوعی و یادگیری ماشین پیش از معماری مدل یا تنظیم هایپرپارامترها، با داده آغاز می‌شود. دانلود دستی، تبدیل‌های مداوم فرمت‌ها میان 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) باشند. انجام دستی این مراحل در هر بار اجرای پروژه، کند و خطاست. شما به یک جریان کاریِ تکرارپذیر نیاز دارید.

مفهوم اصلی

Hugging Face Hubکتابخانه datasetsبارگذاری / استریمحافظه موقت محلی~/.cache/huggingface/تبدیل فرمتCSV, JSON, Parquet, Arrowتفکیک داده‌هاtrain / val / testخط لوله آموزش شما

کتابخانه‌ی datasets از Hugging Face روش استاندارد بارگذاری داده برای کارهای هوش مصنوعی است. این کتابخانه تمام مراحل دانلود، کش کردن، تبدیل فرمت و استریم داده را از همان ابتدا و بدون نیاز به تنظیمات خاصی انجام می‌دهد.

خط لوله دادهفایل خام، آرتیفکت دارای نوع، سپس تفکیک‌های دارای seed قابل بازتولید
DATA PIPELINEThe raw CSV is never edited in place: it flows into a typed, compressed Parquet artifact, then into train, val, and test splits cut with a fixed seed. Because each arrow is a script and the seed is pinned, anyone can regenerate the exact rows your metrics were computed on, and that is what makes an experiment comparable.خامdata.csvنوع‌دارdata.parquetنسخه‌دارتفکیک با seed 42تبدیل نوع + حذف تکراریsplit(seed=42)trainvaltestهمان seed، همان سطرها، در هر اجراداده خام دست‌نخورده می‌ماند؛ همه مراحل دوباره قابل اجرا هستند
فایل CSV خام هرگز مستقیماً ویرایش نمی‌شود: به یک آرتیفکت فشرده و نوع‌دار Parquet و سپس به بخش‌های train، val و test با یک seed ثابت تبدیل می‌شود. از آنجا که هر مرحله یک اسکریپت است و seed ثابت مانده، هر کسی می‌تواند دقیقاً همان سطرهایی را بازتولید کند که معیارهای شما بر اساس آن‌ها محاسبه شده‌اند، و این همان چیزی است که یک آزمایش را قابل مقایسه می‌کند.

پیاده‌سازی

گام 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 - پرامپتی برای پیدا کردن مجموعه‌داده‌ی مناسب هر کار

تمرین‌ها

  1. مجموعه‌داده‌ی glue را با کانفیگ mrpc بارگذاری کنید و 5 نمونه‌ی اول آن را ببینید.
  2. مجموعه‌داده‌ی c4 را استریم کنید و بشمارید در مدت 10 ثانیه چند نمونه پردازش می‌شود.
  3. یک مجموعه‌داده را به فرمت Parquet تبدیل کرده و حجم فایل را با CSV مقایسه کنید.
  4. با یک 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/ ذخیره می‌شود

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسچرا داشتن تفکیک‌های مجزای train، validation و test در یادگیری ماشین اهمیت دارد؟
  2. پیش از درسهاب Hugging Face عمدتاً برای چه کاری در جریان‌های کاری هوش مصنوعی و یادگیری ماشین استفاده می‌شود؟
  3. پس از درسفرمت Parquet چه مزیتی نسبت به CSV برای ذخیره‌سازی مجموعه‌های داده یادگیری ماشین دارد؟
  4. پس از درساستفاده از 'streaming=True' هنگام بارگذاری مجموعه داده با کتابخانه datasets در Hugging Face چه کاری انجام می‌دهد؟
  5. پس از درسچه زمانی باید از DVC (کنترل نسخه داده) به‌جای استفاده صرف از gitignore. برای فایل‌های بزرگ استفاده کرد؟

سؤالات متداول

چرا فرمت Parquet برای ذخیره‌سازی داده‌های هوش مصنوعی از CSV و JSON بهتر است؟

فرمت Parquet ساختاری ستونی و فشرده دارد که علاوه بر اشغال فضای بسیار کمتر روی دیسک، سرعت بارگذاری و خواندن بالاتری نسبت به فایل‌های متنی CSV و JSON ارائه می‌دهد.

قابلیت استریم (Streaming) در کتابخانه‌ی Hugging Face چه کاربردی دارد؟

استریم داده به شما اجازه می‌دهد مجموعه‌داده‌های بسیار حجیم را سطر به سطر و بدون نیاز به دانلود کامل روی دیسک پردازش کنید؛ در نتیجه مصرف حافظه‌ی RAM در طول پردازش همواره ثابت می‌ماند.

چگونه از ورود وزن‌های حجیم مدل و دیتاست‌ها به مخزن Git جلوگیری کنیم؟

برای پروژه‌های شخصی ساده‌ترین راه استفاده از فایل `.gitignore` است. در کارهای تیمی و نیازمند به نسخه‌بندی دقیق، Git LFS یا DVC برای رهگیری داده‌های سنگین خارج از مخزن اصلی به کار می‌روند.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.