فاز 0 · درس 5

آموزش Jupyter Notebook: میز کار مهندسی هوش مصنوعی

نوع
ساختنی
زمان
حدود 30 دقیقه
زبان‌ها
Python
یک میز کار چوبی مرتب آزمایشگاهی با دفترچه باز، نمودارهای علمی و ابزارهای اندازه‌گیری
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفهوم
  4. پیاده‌سازی
  5. مرحله‌ی 1: رابط کاربری خود را انتخاب کنید
  6. مرحله‌ی 2: کلیدهای میان‌بر ضروری
  7. مرحله‌ی 3: انواع سلول‌ها
  8. مرحله‌ی 4: دستورهای جادویی
  9. مرحله‌ی 5: نمایش مستقیم خروجی‌های غنی
  10. مرحله‌ی 6: سرویس Google Colab
  11. کاربرد عملی
  12. نوت‌بوک در برابر اسکریپت: چه زمانی از کدام استفاده کنیم؟
  13. تله‌های رایج
  14. تحویل پروژه
  15. تمرین‌ها
  16. نکات راهنما
  17. اصطلاحات کلیدی
  18. برای مطالعه‌ی بیشتر

اگر دنیای هوش مصنوعی و یادگیری ماشین را دنبال کرده باشید، می‌دانید که تقریباً تمام مقاله‌ها، آموزش‌ها و کدهای پروژه‌ها بر بستر Jupyter Notebook ارائه می‌شوند. این ابزار مثل میز کار یا چرک‌نویس آزمایشگاهی است که امکان اجرای مرحله‌به‌مرحله‌ی کد، مصورسازی فوری داده‌ها و مستندسازی در قالب متن را یک‌جا فراهم می‌کند؛ مهارتی که هر مهندس هوش مصنوعی در همان گام‌های نخست به آن نیاز دارد.

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

برای اجرای محلی این درس نیازی به سخت‌افزار سنگین یا GPU ابری ندارید و کدهای پایه روی پردازنده‌ی سیستم شخصی‌تان بدون مشکل اجرا می‌شوند. همچنین اگر بخواهید از گزینه‌هایی مثل Google Colab استفاده کنید، در نظر داشته باشید که طبق گزارش‌ها، دسترسی به برخی سرویس‌های ابری خارجی از نشانی‌های اینترنتی ایران ممکن است ناپایدار یا محدود باشد و بررسی وضعیت دسترسی پیش از شروع کار ضروری است.

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

اهداف یادگیری

  • نصب و اجرای JupyterLab، Jupyter Notebook یا VS Code همراه با افزونه‌ی Jupyter
  • استفاده از دستورهای جادویی (%timeit، %%time، %matplotlib inline) برای بنچمارک‌گیری و مصورسازی مستقیم در نوت‌بوک
  • تشخیص زمان مناسب برای استفاده از نوت‌بوک در برابر اسکریپت و پیاده‌سازی جریان کاری «اکتشاف در نوت‌بوک، ارسال به عملیات در اسکریپت»
  • شناسایی و پرهیز از تله‌های رایج نوت‌بوک: اجرای نامرتب، وضعیت پنهان و نشت حافظه

صورت مسئله

تمام مقاله‌ها، آموزش‌ها و مسابقات Kaggle در حوزه‌ی هوش مصنوعی از نوت‌بوک‌های Jupyter استفاده می‌کنند. نوت‌بوک‌ها اجازه می‌دهند کد را تکه‌تکه اجرا کنید، خروجی‌ها را درجا ببینید، کد را با توضیحات درهم بیامیزید و با سرعت بالا پیش بروید. یادگیری هوش مصنوعی بدون نوت‌بوک درست مثل حل تمرین‌های ریاضی بدون چرک‌نویس است.

اما نوت‌بوک‌ها تله‌های واقعی دارند. خیلی‌ها از آن‌ها برای همه‌چیز استفاده می‌کنند؛ حتی کارهایی که اصلاً مناسبشان نیست. اگر بدانید کِی باید از نوت‌بوک استفاده کنید و کِی از اسکریپت، بعداً از کابوس‌های طولانی دیباگ نجات پیدا خواهید کرد.

مفهوم

یک نوت‌بوک فهرستی از سلول‌هاست. هر سلول یا کد است یا متن.

سلول Markdown# آزمایش منآزمایش نرخ یادگیری 0.01سلول کد ► اجراmodel.fit(X, y, lr=0.01)---خروجی: loss = 0.342سلول کد ► اجراplt.plot(losses)---خروجی: نمودار درون‌برنامه‌ای

کرنل (Kernel) یک پردازه‌ی پایتون است که در پس‌زمینه اجرا می‌شود. وقتی سلولی را اجرا می‌کنید، کد به کرنل فرستاده می‌شود؛ کرنل آن را اجرا می‌کند و نتیجه را پس می‌فرستد. همه‌ی سلول‌ها از یک کرنل مشترک استفاده می‌کنند؛ بنابراین متغیرها بین سلول‌های مختلف در حافظه می‌مانند.

رابط کاربری نوت‌بوککرنلفرایند Pythonمتغیرها را در حافظه نگه می‌داردسلول‌ها را به هر ترتیبی که کلیک کنید اجرامی‌کندهنگام راه‌اندازی مجدد متوقف می‌شود

همین ویژگی که «سلول‌ها به همان ترتیبی که کلیک می‌کنید اجرا می‌شوند»، هم نقطه‌ی قوت نوت‌بوک‌هاست و هم دامی که ممکن است با آن به پای خودتان شلیک کنید.

ترتیب اجراشمارنده‌ها به ترتیب بالا می‌روند، سپس اجرای مجدد وضعیت را خراب می‌کند
EXECUTION ORDERThe bracket number records when a cell ran, not where it sits. Re-running cell 2 turns [2] into [4], but cell 3 still holds the result of the old order, hidden state the file on disk never shows. When the counters stop reading top to bottom, Restart and Run All is the only honest check.df = load("train.csv")df = clean(df)model.fit(df)[1][2][3][4]روی df قدیمی اجرا شد: کهنهاجرا از بالا به پایین؛ اجرای مجدد بالایی منطق پایینی را به هم می‌ریزد
عدد داخل براکت زمان اجرای سلول را نشان می‌دهد، نه جایگاه آن را در صفحه. اجرای مجدد سلول 2 براکت [2] را به [4] تبدیل می‌کند، اما سلول 3 همچنان نتیجه‌ی ترتیب قبلی را در خود دارد؛ وضعیت پنهانی که فایل ذخیره‌شده روی دیسک هرگز آن را نشان نمی‌دهد. وقتی شمارنده‌ها دیگر از بالا به پایین مرتب نیستند، Restart and Run All تنها راه بررسی صادقانه است.

پیاده‌سازی

مرحله‌ی 1: رابط کاربری خود را انتخاب کنید

سه گزینه، یک فرمت واحد:

رابط کاربری نصب مناسب برای
JupyterLab ابتدا pip install jupyterlab سپس jupyter lab تجربه‌ی یک IDE کامل، چند تب هم‌زمان، مرورگر فایل، ترمینال
Jupyter Notebook ابتدا pip install notebook سپس jupyter notebook ساده، سبک، یک نوت‌بوک در هر زمان
VS Code نصب افزونه‌ی "Jupyter" در ادیتور همیشگی شما، یکپارچگی با Git، قابلیت‌های دیباگ

هر سه ابزار یک فایل مشترک با پسوند .ipynb را می‌خوانند و می‌نویسند. هر کدام را دوست دارید انتخاب کنید. در دنیای هوش مصنوعی، JupyterLab رایج‌ترین گزینه است.

pip install jupyterlab
jupyter lab

مرحله‌ی 2: کلیدهای میان‌بر ضروری

شما در دو حالت کلی کار می‌کنید. با زدن کلید Escape وارد حالت فرمان (Command mode؛ با نوار آبی در سمت چپ) می‌شوید و با زدن Enter به حالت ویرایش (Edit mode؛ با نوار سبز) می‌روید.

حالت فرمان (پُرکاربردترین‌ها):

کلید عملکرد
Shift+Enter اجرای سلول و رفتن به سلول بعدی
A ایجاد سلول در بالا
B ایجاد سلول در پایین
DD حذف سلول
M تبدیل به Markdown
Y تبدیل به کد
Z لغو عملیات سلول (Undo)
Ctrl+Shift+H نمایش همه‌ی میان‌برها

حالت ویرایش:

کلید عملکرد
Tab تکمیل خودکار (Autocomplete)
Shift+Tab نمایش امضای تابع (Signature)
Ctrl+/ کامنت کردن یا خروج از کامنت

میان‌بر Shift+Enter همان کلیدی است که در روز هزار بار از آن استفاده خواهید کرد. اول از همه این را یاد بگیرید.

مرحله‌ی 3: انواع سلول‌ها

سلول‌های کد پایتون را اجرا می‌کنند و خروجی را نشان می‌دهند:

import numpy as np
data = np.random.randn(1000)
data.mean(), data.std()

خروجی: (0.0032, 0.9987)

سلول‌های Markdown متن فرمت‌شده را رندر می‌کنند. از این سلول‌ها برای مستندسازی کاری که انجام می‌دهید و چراییِ آن استفاده کنید. این بخش از تیترها، متن بولد، ایتالیک، فرمول‌های ریاضی لاتک (E=mc2E = mc^2)، جدول‌ها و تصاویر پشتیبانی می‌کند.

مرحله‌ی 4: دستورهای جادویی

این‌ها دستورهای پایتون نیستند؛ دستورهای اختصاصی Jupyter هستند که با % (دستور جادویی خطی) یا %% (دستور جادویی سلولی) شروع می‌شوند.

اندازه‌گیری زمان اجرای کد:

%timeit np.random.randn(10000)

خروجی: 45.2 us +/- 1.3 us per loop

%%time
model.fit(X_train, y_train, epochs=10)

خروجی: Wall time: 2.34 s

دستور %timeit کد را چندین بار اجرا می‌کند و میانگین می‌گیرد. دستور %%time کد را فقط یک بار اجرا می‌کند. از %timeit برای بنچمارک‌های خُرد و از %%time برای ران‌های آموزش مدل استفاده کنید.

فعال‌سازی نمایش درون‌برنامه‌ای نمودارها:

%matplotlib inline

از این پس هر plt.plot() یا plt.show() نمودار را مستقیماً داخل نوت‌بوک رسم می‌کند.

نصب بسته‌ها بدون خروج از نوت‌بوک:

!pip install scikit-learn

علامت ! هر دستوری را در شل (Shell) سیستم اجرا می‌کند.

بررسی متغیرهای محیطی:

%env CUDA_VISIBLE_DEVICES

مرحله‌ی 5: نمایش مستقیم خروجی‌های غنی

نوت‌بوک‌ها آخرین عبارت موجود در سلول را به‌طور خودکار نمایش می‌دهند؛ اما کنترل نمایش دست خودتان است:

import pandas as pd

df = pd.DataFrame({
    "model": ["Linear", "Random Forest", "Neural Net"],
    "accuracy": [0.72, 0.89, 0.94],
    "training_time": [0.1, 2.3, 45.6]
})
df

این کد خروجی را به‌صورت یک جدول فرمت‌شده‌ی HTML رندر می‌کند، نه یک مشت متن خام. ماجرا برای نمودارها هم همین است:

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 4))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title("Inline Plot")
plt.show()

نمودار دقیقاً زیر همان سلول ظاهر می‌شود. دلیل اصلی تسلط نوت‌بوک‌ها بر کارهای هوش مصنوعی همین است؛ داده، نمودار و کد را یک‌جا کنار هم می‌بینید.

برای تصاویر:

from IPython.display import Image, display
display(Image(filename="architecture.png"))

مرحله‌ی 6: سرویس Google Colab

سرویس Colab یک نوت‌بوک رایگان Jupyter روی ابر است. یک GPU، کتابخانه‌های از‌پیش‌نصب‌شده و اتصال به Google Drive را در اختیارتان می‌گذارد؛ بدون نیاز به هیچ‌گونه تنظیمات اولیه.

  1. به آدرس colab.research.google.com بروید.
  2. هر فایل .ipynb از این دوره را آپلود کنید.
  3. مسیر Runtime > Change runtime type > T4 GPU (free) را دنبال کنید.

تفاوت‌های Colab با نسخه‌ی محلی Jupyter:

  • فایل‌ها بین نشست‌ها باقی نمی‌مانند (باید در Drive ذخیره یا دانلودشان کنید).
  • کتابخانه‌های numpy، pandas، matplotlib، torch، tensorflow و sklearn از قبل نصب شده‌اند.
  • from google.colab import files برای آپلود و دانلود فایل‌ها.
  • from google.colab import drive; drive.mount('/content/drive') برای فضای ذخیره‌سازی دائمی.
  • در پلن رایگان، نشست‌ها بعد از 90 دقیقه عدم فعالیت قطع می‌شوند (Timeout).

کاربرد عملی

نوت‌بوک در برابر اسکریپت: چه زمانی از کدام استفاده کنیم؟

نوت‌بوک برای اسکریپت برای
کاوش در یک دیتاست پایپ‌لاین‌های آموزش مدل
ساخت پروتوتایپ مدل ابزارهای کمکی چندبارمصرف
مصورسازی نتایج هر برنامه‌ای که if __name__ دارد
توضیح و تشریح کارتان کدهایی که طبق برنامه‌ی زمانی اجرا می‌شوند
آزمایش‌های سریع کدهای عملیاتی (Production)
تمرین‌های دوره بسته‌ها و کتابخانه‌ها

قاعده این است: اکتشاف در نوت‌بوک، ارسال به عملیات در اسکریپت.

یک جریان کاری رایج در هوش مصنوعی:

  1. کاوش در داده‌ها درون یک نوت‌بوک
  2. ساخت پروتوتایپ مدل درون نوت‌بوک
  3. وقتی کد جواب داد، انتقال آن به فایل‌های .py
  4. ایمپورت دوباره‌ی همان فایل‌های .py به نوت‌بوک برای آزمایش‌های بیشتر

تله‌های رایج

اجرای نامرتب سلول‌ها (Out-of-order execution). سلول 5 را اجرا می‌کنید، بعد سلول 2، و بعد سلول 7. نوت‌بوک روی سیستم شما کار می‌کند، اما وقتی کسی آن را از بالا به پایین اجرا کند به خطا می‌خورد. راه‌حل: قبل از به اشتراک گذاشتن، گزینه‌ی Kernel > Restart & Run All را بزنید.

وضعیت پنهان (Hidden state). سلولی را پاک می‌کنید، اما متغیری که ساخته هنوز در حافظه است. نوت‌بوک در ظاهر تمیز به نظر می‌رسد، ولی به یک سلول شبح وابسته است. راه‌حل: کرنل را مرتب ری‌استارت کنید.

نشت حافظه (Memory leaks). لود کردن یک دیتاست 4 گیگابایتی، آموزش مدل و لود کردن یک دیتاست دیگر؛ هیچ‌چیزی از حافظه آزاد نمی‌شود. راه‌حل: del variable_name و gc.collect() یا ری‌استارت کرنل.

تحویل پروژه

این درس این خروجی را تولید می‌کند:

  • outputs/prompt-notebook-helper.md برای دیباگ مشکلات نوت‌بوک

تمرین‌ها

  1. برنامه‌ی JupyterLab را باز کنید، یک نوت‌بوک بسازید و با %timeit سرعت List Comprehension را در مقایسه با numpy برای ساخت آرایه‌ای از 100,000 عدد تصادفی بسنجید.
  2. نوت‌بوکی بسازید که هم سلول‌های Markdown داشته باشد و هم کد، یک فایل CSV را بخواند، یک دیتافریم را نشان دهد و یک نمودار رسم کند. سپس Kernel > Restart & Run All را بزنید تا مطمئن شوید از اول تا آخر بدون خطا کار می‌کند.
  3. کد فایل code/notebook_tips.py را بردارید، داخل یک نوت‌بوک Colab کپی کنید و با یک GPU رایگان آن را اجرا کنید.

نکات راهنما

تمرین 1. برنامه‌ی JupyterLab را با jupyter lab اجرا کنید؛ سپس هر پیاده‌سازی را در سلول جداگانه‌ای بگذارید که با %timeit شروع می‌شود. در هر دو سلول از همان اندازه‌ی 100,000 استفاده کنید تا هر دو زمان‌سنجی یک کار یکسان را اندازه بگیرند.

تمرین 2. برای خواندن داده‌ها از pd.read_csv استفاده کنید، دیتافریم را در آخرین خط سلول بنویسید تا نمایش داده شود و با df.plot() یا matplotlib نمودار رسم کنید. بعد از اجرای Kernel > Restart & Run All، باید کنار تمام سلول‌ها در شمارنده‌ی اجرا عدد بیفتد و هیچ سلولی نباید خطایی نشان دهد.

تمرین 3. در Colab، قبل از کپی کردن کدها گزینه‌ی Runtime > Change runtime type > GPU را انتخاب کنید. وقتی هر تابع در code/notebook_tips.py بخش مربوط به خودش را چاپ کند و اجرای torch.cuda.is_available() در یک سلول مقدار True بدهد، یعنی اجرا درست بوده است.

اصطلاحات کلیدی

اصطلاح در زبان عامیانه معنای فنی و دقیق
کرنل (Kernel) «همان چیزی که کدم را اجرا می‌کند» یک پردازه‌ی جداگانه‌ی پایتون که سلول‌ها را اجرا می‌کند و متغیرها را در حافظه نگه می‌دارد
سلول (Cell) «یک بلوک کد» یک واحد با قابلیت اجرای مستقل در نوت‌بوک، از جنس کد یا Markdown
دستور جادویی (Magic command) «ترفندهای ژوپیتر» دستورهای ویژه‌ای با پیشوند % یا %% که محیط نوت‌بوک را کنترل می‌کنند
.ipynb «فایل نوت‌بوک» یک فایل بر پایه‌ی JSON حاوی سلول‌ها، خروجی‌ها و متادیتا؛ مخفف IPython Notebook

برای مطالعه‌ی بیشتر

خودآزمایی

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

  1. پیش از درسیک نوت‌بوک ژوپیتر (Jupyter notebook) چیست؟
  2. پیش از درسکرنل ژوپیتر (Jupyter kernel) چه کاری انجام می‌دهد؟
  3. پس از درستفاوت بین دستورهای جادویی ‎%timeit‎ و ‎%%time‎ چیست؟
  4. پس از درسرایج‌ترین دلیلی که باعث می‌شود نوت‌بوک روی سیستم شما کار کند اما هنگام اجرای ترتیبی از بالا به پایین خطا بدهد چیست؟
  5. پس از درسچه زمانی باید کد را از نوت‌بوک به یک اسکریپت ‎.py منتقل کرد؟

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

تفاوت اصلی نوت‌بوک و اسکریپت پایتون در کجاست و چه زمانی باید از هرکدام استفاده کنیم؟

نوت‌بوک برای کاوش در داده، ساخت پروتوتایپ مدل، ترسیم نمودارها و آزمایش‌های سریع است؛ در حالی که اسکریپت پایتون (.py) برای پایپ‌لاین‌های آموزش، کدهای زمان‌بندی‌شده، توابع چندبارمصرف و محیط عملیاتی (Production) استفاده می‌شود.

چرا دستور Kernel > Restart & Run All در نوت‌بوک اهمیت زیادی دارد؟

این دستور تمام وضعیت‌های پنهان متغیرها و کش‌های حافظه را پاک کرده و همه‌ی سلول‌ها را از بالا به پایین اجرا می‌کند تا مطمئن شوید برنامه وابسته به ترتیب کلیک تصادفی شما نیست و کدی سالم و قابل بازتولید تحویل می‌دهید.

فرق دستورهای جادویی timeit% و time%% چیست؟

دستور خطی timeit% قطعه‌کد را چندین بار اجرا کرده و میانگین زمان را برای بنچمارک‌های خرد اعلام می‌کند، اما دستور سلولی time%% کد درون سلول را تنها یک‌بار اجرا می‌کند و زمان واقعی صرف‌شده را نمایش می‌دهد.

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

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