سناریو:
پروژههای هوش مصنوعی با داده شروع میشوند. برای شروع، معمولاً باید دیتاستها را پیدا، دانلود و در صورت نیاز فرمت آنها را تبدیل کنیم، سپس آنها را به بخشهای مختلف مثل آموزش (train)، اعتبارسنجی (validation) و تست (test) تقسیم کنیم. هر آزمایشی که انجام میشود باید روی نسخههای مشخصی از داده انجام شود تا هم تکرارپذیر باشد و هم بتوان نتایج را بهصورت قابل اتکا بازتولید کرد. برای جلوگیری از خطا و تضمین قابل اتکا بودن نتایج، به روشی بهینه برای مدیریت دادهها و نسخههای آنها نیاز داریم.
روشی استاندارد برای کار با دیتاستهای مختلف فراهم میکند: دانلود، کش (cache)، تبدیل فرمت، تقسیم دیتاست به بخشهای مختلف و … .
# install pip install datasets # load imdb dataset from datasets import load_dataset dataset = load_dataset("imdb")
در مرتبهی اول، کل دیتاست دانلود و در کش ذخیره میشود و در مرتبههای بعدی، بهجای دانلود مجدد، از کش روی دیسک لود میشود.
حال اگر دیتاست ما سایز خیلی زیادی داشت که ممکن است روی دیسک جا نشود و سیستم کرش کند بهترین راه استفاده از روش stream کردن دیتاست است که سطر به سطر دیتا را لود میکند. تابع load_dataset برای برخی دیتاستها مثل ویکیپدیا نیاز به مشخص کردن name دارد. برای مثال:
from datasets import load_dataset dataset = load_dataset("wikipedia", name="20220301.en", streaming=True) for i, sample in enumerate(dataset['train']): print(i, sample) if i > 100: break
نکته: آبجکت برگرداندهشده در حالت استریمینگ معمولاً یک دیکشنری از اسپلیتهاست، بنابراین باید مثلاً dataset['train'] را پیمایش کنیم.
اگر بخواهیم دیتاست را به بخش های آموزش و تست تقسیم کنیم:
from datasets import load_dataset train_ds = load_dataset("imdb", split="train") test_ds = load_dataset("imdb", split="test") print("length and first train sample: ", len(train_ds), train_ds[0])
فرمتهای CSV و JSON متنمحور و خوانا برای انسان هستند، ولی برای دیتاستهای بزرگ، هم فضای نسبتاً زیادی روی دیسک میگیرند و هم برای پردازش و جستجو روی حجم زیاد داده، معمولاً کارایی پایینی نسبت به فرمتهای ستونی دارند.
فرمت Parquet یک فرمت ستونی و باینری است که برای ذخیرهسازی فشرده، سرعت خواندن/نوشتن بالا و پردازش تحلیلی روی دادههای حجیم طراحی شده است. این فرمت برای سناریوهایی مانند آموزشهای توزیعشده و ذخیرهسازی روی چند دیسک یا سیستم توزیعشده بسیار کاربردی است.
گفتیم که یک راه برای مدیریت دیتاست های حجیم استفاده از streaming است که کمک میکند سطر به سطر دیتا لود شود.
حال فرض کنید ما در سیستم خود چندین مدل آموزش دیده شده و دیتاست های مختلف داریم، اگر همه آنها را در گیت آپلود کنیم کاری بهینه نیست، برای این سناریو سه روش موثر وجود دارد:
۱. استفاده از gitignore
در این فایل میتوانیم لیستی از فایلها و دایرکتوریهایی که نمیخواهیم Git آنها را تحت کنترل ورژن قرار دهد مشخص کنیم. در نتیجه این فایلها هر بار به مخزن ریموت (مثلاً GitHub) ارسال نمیشوند. برای کامنت گذاشتن در فایل .gitignore دقیقا مانند کامنت گذاشتن در پایتون از # استفاده می کنیم.
# ignore model checkpoints *.pt *.pth #ignore directories venv/ dataset/
۲. استفاده از Git LFS
وقتی بخواهیم فایلهای بزرگ را در کنار کد در مخزن Git نگه داریم، میتوانیم از Git LFS استفاده کنیم. در این روش، بهجای ذخیرهی مستقیم فایلهای حجیم در مخزن pointerهای کوچکی به آنها در repository ذخیره میشود و خود فایلهای بزرگ در یک فضای ذخیرهسازی جداگانه نگهداری میشوند.
git lfs install git lfs track "*.pt" git lfs track "*.bin" git add .gitattributes git commit -m "Git «إئ setup"
۳. استفاده از dvc
برای کنترل نسخهی دادهها میتوان از DVC (Data Version Control) استفاده کرد. DVC برای هر فایل دادهای که track میشود یک فایل کوچک با پسوند .dvc ایجاد میکند که حاوی اطلاعات متادیتا و آدرس ذخیرهسازی دادهی اصلی است. خود دادهی اصلی میتواند روی دیسک محلی، سرور ریموت، یا سرویسهای ابری (مثل S3، Google Drive و …) ذخیره شود.
pip install dvc # setup dvc and track data dvc init dvc add data/training_set.parquet # after dvc, git must be setup and track dvc file and gitignore git add data/training_set.parquet.dvc data/.gitignore git commit -m "Track training data with dvc"