چیت‌شیت

دفترچه‌ها، فایل‌های داده و پروفایلینگ

Notebooks, Data Files and Profiling

اجرای امن نوت‌بوک‌ها، بارگذاری و تقسیم دیتاست، دور نگه داشتن فایل‌های حجیم از git، پروفایلینگ زمان و حافظه، رفع باگ‌های پنهان هوش مصنوعی.

  • ۱۲ بخش
  • ۳ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. کلیدهای میانبر نوت‌بوک
  2. دستورات جادویی (Magic Commands)
  3. عیب‌یابی نوت‌بوک
  4. پایپ‌لاین داده
  5. بارگذاری، استریمینگ، تبدیل، تفکیک
  6. فرمت‌های فایل
  7. دور نگه داشتن فایل‌های حجیم از git
  8. ابزارهای دیباگ و پروفایلینگ
  9. جریان کاری دیباگ
  10. باگ‌های پنهان هوش مصنوعی
  11. تحلیل نمودارها
  12. نکات کاربردی

کلیدهای میانبر نوت‌بوک

دستورها
دستورعملکرد
`pip install jupyterlab` then `jupyter lab`اجرای JupyterLab
`Escape` / `Enter`حالت دستوری / حالت ویرایش
Shift+Enterاجرای سلول و رفتن به سلول بعدی
`A` / `B`افزودن سلول در بالا / پایین
DDحذف سلول
`M` / `Y`تبدیل به markdown / کد
Shift+Tabنمایش ساختار ورودی‌های تابع (signature)
Ctrl+Shift+Hنمایش تمام کلیدهای میانبر

دستورات جادویی (Magic Commands)

دستورها
دستورعملکرد
%timeit np.random.randn(10000)اجرا در دفعات متعدد و میانگین‌گیری. بنچمارک‌های خرد
%%timeاجرای یک‌باره سلول. اجراهای آموزشی
%matplotlib inlineرندر نمودارها داخل نوت‌بوک
!pip install scikit-learn! اجرای هر دستور شل
%env CUDA_VISIBLE_DEVICESبررسی یک متغیر محیطی
%whoفهرست کردن تمام متغیرهای موجود در حافظه
!which pythonبررسی محیط کرنل

عیب‌یابی نوت‌بوک

عیب‌یابی
  • برای من کار می‌کند، برای دیگران ارور می‌دهد

    علت
    اجرای نامرتب و بدون ترتیب سلول‌ها
    راه‌حل
    قبل از اشتراک‌گذاری: Kernel > Restart & Run All
  • نوت‌بوک تمیز به یک سلول حذف‌شده وابسته است

    علت
    وضعیت پنهان در کرنل
    راه‌حل
    راه‌اندازی مجدد دوره‌ای کرنل
  • افزایش مداوم مصرف RAM

    علت
    باقی ماندن متغیرها میان سلول‌ها
    راه‌حل
    del variable_name و سپس gc.collect()
  • خاموش شدن بی‌صدای کرنل

    علت
    پنهان ماندن خطا توسط واسط کاربری
    راه‌حل
    بررسی ترمینالی که Jupyter در آن اجرا شده
  • print(df) متن ساده نشان می‌دهد

    علت
    آخرین عبارت بودن سلول رعایت نشده
    راه‌حل
    پایان دادن سلول با نام df
  • خطای ایمپورت بعد از pip install

    علت
    نصب پکیج در یک محیط پایتون دیگر
    راه‌حل
    اجرای !pip install package داخل نوت‌بوک
  • سلول بی‌وقفه اجرا می‌شود

    علت
    در انتظار ورودی با input() یا یک حلقه
    راه‌حل
    Kernel > Interrupt یا فشردن دو بار کلید I
  • پاک شدن فایل‌های Colab

    علت
    پایان نشست رایگان پس از 90 دقیقه عدم فعالیت
    راه‌حل
    drive.mount('/content/drive')

پایپ‌لاین داده

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

بارگذاری، استریمینگ، تبدیل، تفکیک

کد
python
dataset = load_dataset("stanfordnlp/imdb", split="train")  # کش‌شده پس از نخستین بارگذاری
stream = load_dataset("wikimedia/wikipedia", "20231101.en", split="train", streaming=True)
dataset.to_parquet("imdb_train.parquet")                   # همچنین to_csv، to_json
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, val_ds, test_ds = train_val["train"], train_val["test"], split["test"]
make_splits(ds, train_ratio=0.8, val_ratio=0.1, seed=42)   # هلپر data_utils
model_dir = snapshot_download("sentence-transformers/all-MiniLM-L6-v2")

فرمت‌های فایل

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
CSVSlowحجیم. خوانایی برای انسان، جداول
JSONSlowحجیم. APIها، داده‌های تو‌در‌تو
ParquetFastکم‌حجم. بهترین فرمت ذخیره‌سازی برای هوش مصنوعی
ArrowFastestکم‌حجم. در حافظه، درون datasets
Train split80%اعتبارسنجی 10٪، تست 10٪
Dataset cache~/.cache/huggingface/datasets/کش مدل در مسیر ~/.cache/huggingface/hub/ است

دور نگه داشتن فایل‌های حجیم از git

کار و کد
وظیفهکد
نادیده گرفتن وزن‌ها و داده‌ها`*.safetensors`, `*.pt`, `data/*.parquet`, `models/`
ردیابی با Git LFSgit lfs track "*.safetensors"
ثبت کامیت قوانین LFSgit add .gitattributes
راه‌اندازی DVCdvc init
ردیابی داده با DVCdvc add data/training_set.parquet
کامیت کردن فایل نشانگرgit add data/training_set.parquet.dvc data/.gitignore
انتقال داده‌ها با push به S3`dvc remote add -d myremote s3://my-bucket/dvc-store` then `dvc push`

ابزارهای دیباگ و پروفایلینگ

کار و کد
وظیفهکد
توقف تنها در صورت مقدار نامناسب تابع زیان (loss)if loss.item() > 100 or torch.isnan(loss): breakpoint()
بررسی و پیمایش در pdb`p outputs.shape`, `p loss.item()`, then `c` or `q`
پروفایلینگ توابعpython -m cProfile -s cumtime train.py
پروفایلینگ خط‌به‌خط کد`@profile`, then `kernprof -l -v train.py`
بررسی خط‌به‌خط حافظهpython -m memory_profiler your_script.py
شناسایی بیشترین تخصیص‌های حافظهtracemalloc.take_snapshot().statistics("lineno")
حافظه GPU`torch.cuda.memory_allocated()`, `torch.cuda.memory_reserved()`
نمودارهای آموزش`SummaryWriter("runs/experiment_1")`, then `tensorboard --logdir=runs`

جریان کاری دیباگ

گام‌به‌گام
  1. پیش از آموزشاجرای check_shapes با یک دسته نمونه.
  2. 10 گام اولاجرای debug_print روی تابع زیان (loss)، خروجی‌ها و گرادیان‌ها. بررسی عدم وجود NaN.
  3. حین آموزشثبت تابع زیان (loss)، نرخ یادگیری و نُرم گرادیان در TensorBoard.
  4. هنگام بروز خطاقرار دادن breakpoint() در نقطه شکست.
  5. برای بهبود سرعتزمان‌سنجی بارگذاری داده، رفت (forward) و برگشت (backward). پروفایلینگ حافظه در آستانه OOM.

باگ‌های پنهان هوش مصنوعی

عیب‌یابی
  • بروز NaN پس از چند گام

    علت
    بسیار بالا بودن نرخ یادگیری
    راه‌حل
    کاهش به میزان 10x. افزودن برش گرادیان
  • بروز فوری NaN

    علت
    لگاریتم صفر یا مقدار منفی
    راه‌حل
    torch.log(x + 1e-8)
  • توقف تابع زیان (loss) روی ln(num_classes)

    علت
    عدم جریان گرادیان
    راه‌حل
    حذف .detach() تصادفی
  • دقت تست 99٪

    علت
    نشت داده
    راه‌حل
    check_data_leakage(train_set, test_set)
  • خطای OOM

    علت
    بیش از حد بزرگ بودن دسته
    راه‌حل
    نصف کردن اندازه دسته. torch.cuda.empty_cache()
  • بروز OOM حین backward

    علت
    پاک نشدن گرادیان‌ها
    راه‌حل
    اجرای optimizer.zero_grad() در هر گام
  • سرعت پایین و استفاده کم از GPU

    علت
    گلوگاه در بارگذاری داده
    راه‌حل
    تنظیم num_workers=4 و pin_memory=True
  • تنسور روی دستگاه اشتباه

    علت
    تنسور روی CPU، مدل روی GPU
    راه‌حل
    check_devices(model, *tensors)

تحلیل نمودارها

پرسش و پاسخ
عدم کاهش تابع زیان (loss)؟
نرخ یادگیری بسیار کم است، یا معماری مشکل دارد.
نوسان شدید تابع زیان (loss)؟
نرخ یادگیری بسیار زیاد است.
کاهش loss آموزش و افزایش loss ولیدیشن؟
بیش‌برازش.
صفر شدن نمودارهای هیستوگرام وزن‌ها؟
محوشدگی گرادیان.
انفجار هیستوگرام گرادیان؟
استفاده از برش گرادیان.

نکات کاربردی

نکته‌ها
  • اکتشاف و تست در نوت‌بوک، تحویل نهایی در اسکریپت.
  • استفاده از %timeit برای بنچمارک‌های خرد و %%time برای ران‌های آموزش.
  • همیشه سید (seed) تصادفی تعیین کنید. سید یکسان تفکیک داده یکسانی می‌دهد.
  • اگر دیتاست روی دیسک جا نمی‌شود، از استریمینگ استفاده کنید.
  • بارگذاری داده اغلب 60٪ زمان آموزش را می‌گیرد. مقدار num_workers > 0 را تنظیم کنید.