چیتشیت
دفترچهها، فایلهای داده و پروفایلینگ
Notebooks, Data Files and Profiling
اجرای امن نوتبوکها، بارگذاری و تقسیم دیتاست، دور نگه داشتن فایلهای حجیم از git، پروفایلینگ زمان و حافظه، رفع باگهای پنهان هوش مصنوعی.
فهرست مطالب
کلیدهای میانبر نوتبوک
دستورها| دستور | عملکرد |
|---|---|
`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')
پایپلاین داده
معماریبارگذاری، استریمینگ، تبدیل، تفکیک
کد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")
فرمتهای فایل
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
CSV | Slow | حجیم. خوانایی برای انسان، جداول |
JSON | Slow | حجیم. APIها، دادههای تودرتو |
Parquet | Fast | کمحجم. بهترین فرمت ذخیرهسازی برای هوش مصنوعی |
Arrow | Fastest | کمحجم. در حافظه، درون datasets |
Train split | 80% | اعتبارسنجی 10٪، تست 10٪ |
Dataset cache | ~/.cache/huggingface/datasets/ | کش مدل در مسیر ~/.cache/huggingface/hub/ است |
دور نگه داشتن فایلهای حجیم از git
کار و کد| وظیفه | کد |
|---|---|
| نادیده گرفتن وزنها و دادهها | `*.safetensors`, `*.pt`, `data/*.parquet`, `models/` |
| ردیابی با Git LFS | git lfs track "*.safetensors" |
| ثبت کامیت قوانین LFS | git add .gitattributes |
| راهاندازی DVC | dvc init |
| ردیابی داده با DVC | dvc 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` |
جریان کاری دیباگ
گامبهگام- پیش از آموزشاجرای
check_shapesبا یک دسته نمونه. - 10 گام اولاجرای
debug_printروی تابع زیان (loss)، خروجیها و گرادیانها. بررسی عدم وجود NaN. - حین آموزشثبت تابع زیان (loss)، نرخ یادگیری و نُرم گرادیان در TensorBoard.
- هنگام بروز خطاقرار دادن
breakpoint()در نقطه شکست. - برای بهبود سرعتزمانسنجی بارگذاری داده، رفت (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را تنظیم کنید.