跳至內容

從零開始學 AI 工程(五):
Phase 0-5 Jupyter Notebooks

基本認識 AI 工程師的實驗桌 Jupyter Notebook,搞懂 Cell、Kernel、Magic Commands 這些關鍵字。

本文作者是 AI 工程的初學者,正透過《AI Engineering from Scratch》課程自學,並全程搭配 AI 輔助:一步步照著課程開發者的進度動手執行,卡關時就向 AI 提問、請它引導。這篇文章,是把作者與 AI 互動的完整過程與學習歷程,先交由 AI 記錄、統整成初稿,再由作者親自逐段審視、修改、優化而成。AI 負責整理,最終判斷與文字由作者把關。

寫下它有兩個用意:替後來的讀者鋪一條能照著走的路徑,也幫作者自己複習、把學過的東西沉澱下來。

這篇跟前幾課不太一樣

前幾課(Dev Environment、Git、GPU、APIs)都有明確的步驟:先做什麼、再做什麼。這一課不是這樣。它比較像一份工具介紹:告訴你 Jupyter Notebook 是什麼、為什麼 AI 領域到處都在用、裡面有哪些功能、有哪些該注意的地方。

所以這篇文章的結構也跟著調整。不再是「步驟 1 → 步驟 2 → 步驟 3」,而是順著課程的脈絡,基本地把 Jupyter 認識一輪。

這一課導覽框

  • 課名:Phase 0 - Lesson 5 — Jupyter Notebooks
  • 目標:認識 Jupyter Notebook 的核心概念、學會基本操作和 Magic Commands、知道 Notebook 和 Script 的分工
  • 時間:課程標約 30 分鐘,我邊理解邊動手大概花了 40 分鐘
  • 需要動手的部分:在 Cursor(或 VS Code)裡開 Notebook、試快捷鍵和 Magic Commands、在 Colab 跑課程範例
  • 完課驗證:能在本機開 Notebook 跑程式碼並看到輸出、能用 %timeit 比較速度、能在 Colab 跑課程的 notebook_tips.py

Jupyter Notebook 是什麼

Jupyter Notebook 你寫一段程式碼,按 Shift+Enter,它可以快速計算程式碼,結果貼在下面。 課程原文:

Notebooks are the lab bench of AI engineering. You prototype here, then move what works into production.

Notebook 是 AI 工程師的實驗桌。你在這裡試做原型,確認可行的東西再搬去正式環境。

AI 領域幾乎人人用 Jupyter。 論文、教學、Kaggle 比賽,全部都用它。課程的比喻是:如果你不會用 Notebook,就像做數學作業沒有草稿紙。


三個關鍵字

學 Jupyter 之前要先認識三個詞。 後面所有操作都建立在這三個概念上。

Cell(格子)

Notebook 就是一格一格排下來的,每一格只有兩種:

Code Cell 是程式格。你在裡面寫 Python,按 Shift+Enter 就執行,結果貼在正下方。

Markdown Cell 是文字格。你在裡面寫說明、標題、公式,按 Shift+Enter 會渲染成格式化的文字。支援粗體、斜體、標題階層,甚至 LaTeX 數學公式($E = mc^2$)。

課程原文的圖把它畫得很清楚:一個 Notebook 從頭到尾就是「Markdown Cell → Code Cell → Code Cell → …」這樣交替排列。你的思考過程、程式碼、執行結果全部在同一份文件裡。

Kernel(核心)

Kernel 是背後那隻幫你跑程式的 Python 程序。你寫好一格、按下 Shift+Enter,Notebook 的介面(UI)把程式碼遞給 Kernel,Kernel 算完再把結果遞回來。

重點是:Kernel 有記憶。你在第一格寫 x = 10,到第十格它還記得 x 是 10。所有 Cell 共用同一個 Kernel 的記憶。

課程的圖裡列了 Kernel 的三個特性:

  • Keeps variables in memory — 它會記住變數
  • Runs cells in whatever order you click — 你點哪格它就跑哪格,不管順序
  • Dies when you restart it — 重啟 Kernel,所有記憶歸零

課程在圖下方寫了一句話:「無論你點擊哪個順序」這部分既是它的超能力,也是它的致命弱點。自由帶來威力,但也帶來混亂的風險。後面「常見陷阱」那段會回來講這件事。

.ipynb

Notebook 存下來就是 .ipynb 檔(IPython Notebook 的縮寫)。它是一個 JSON 格式的檔案,裡面記錄每一格的程式碼、文字、還有輸出結果。


三種介面,讀寫同一種檔案

課程列了三個可以開 .ipynb 的介面:

JupyterLab 功能最完整,有檔案瀏覽器、多分頁、內建終端機,AI 領域最常見。在終端機打 jupyter lab 就能啟動。

Jupyter Notebook 最簡單,一次開一本。在終端機打 jupyter notebook 啟動。

VS Code + Jupyter 擴充套件 如果你已經在用 VS Code(或 Cursor),裝個 Jupyter 擴充套件就能直接在編輯器裡開 Notebook。

三種介面讀寫的都是同一種 .ipynb 檔案,選哪個都行。

我選了 Cursor

我的選擇是 Cursor(基於 VS Code 改的編輯器,自帶 AI 功能)。原因是之後寫 .py 腳本、管檔案、用 Git 都在 Cursor 裡面做,Notebook 也放在同一個工具裡,不用在不同應用程式之間跳來跳去。Cursor 內建就已經裝好了 Jupyter 擴充套件,不用另外裝。

開 Notebook 的方式:按 Cmd + Shift + P 打開指令面板,輸入 Create: New Jupyter Notebook,就會開一個空白的 Notebook。記得右上角選 Kernel 的時候,要選你課程資料夾裡的 .venv(Python 3.12),這樣跑程式碼才會用到之前裝好的套件。

之前用的 Colab 也是 Jupyter

我之前在 Google Colab 上做過一些練習,一格一格寫程式碼、按 Shift+Enter 執行。學到這裡才知道,Colab 就是 Google 把 Jupyter Notebook 搬到雲端、幫你包裝好的版本。

差別只在於 Kernel 跑在哪裡。本機的 Jupyter,Kernel 跑在你自己的電腦上;Colab 的 Kernel 跑在 Google 的伺服器上。這就是為什麼 Colab 閒置 90 分鐘會斷線——Google 把那台虛擬機回收了,Kernel 死掉,記憶體裡的變數全部消失。


快捷鍵

Notebook 有兩種模式。按 Escape 進入 Command Mode(操作整格),按 Enter 進入 Edit Mode(編輯格內文字)。

Command Mode(操作格子)

按鍵做什麼
Shift+Enter執行這格,跳到下一格
A在上方新增一格
B在下方新增一格
DD(連按兩下 D)刪除這格
M把這格轉成 Markdown
Y把這格轉成 Code
Z撤銷格子操作

Edit Mode(編輯內容)

按鍵做什麼
Tab自動補全(打到一半按 Tab 幫你補完)
Shift+Tab顯示函數說明
Ctrl + /切換註解

課程說 Shift+Enter 是你一天要用上千次的快捷鍵。確實,用了之後就回不去了。


Magic Commands

這些不是 Python 語法,是 Jupyter 專屬的特殊指令,用 %(單行)或 %%(整格)開頭。

%timeit — 測速,重複跑取平均

%timeit np.random.randn(10000)

輸出類似 45.2 us +/- 1.3 us per loop。它會自動把這行重複跑很多次,算出平均花多久。適合微觀測速:「這行程式碼本身快不快?」

%%time — 計時,跑一次量總時間

%%time
total = sum(range(10000000))
print(total)

輸出類似 Wall time: 2.34 s。跑一次整格,量從頭到尾花了多久。適合測「訓練一個模型要多久」這種不想重複跑的場景。

怎麼記:一個 % 管一行、重複跑;兩個 %% 管整格、跑一次。

%matplotlib inline — 讓圖畫在 Notebook 裡

%matplotlib inline

加了這行之後,所有 plt.plot()plt.show() 產生的圖表都會直接出現在 Cell 下方,不會跳出新視窗。

! — 跑 Shell 指令

!pip install scikit-learn

! 開頭的指令會跳出去執行 shell 命令。最常見的用途是在 Colab 上裝套件。Colab 在雲端,你摸不到它的終端機,!pip install 是唯一的裝法。在本機的話,你有終端機可以用,用不用 ! 都行。

%env — 查環境變數

%env CUDA_VISIBLE_DEVICES

查特定的環境變數。CUDA_VISIBLE_DEVICES 是用來控制「讓程式看得到哪幾張 GPU」的設定。我的 Mac 沒有 NVIDIA GPU,所以用不到這個。課程列出來是讓你知道有這個功能,之後在有 GPU 的環境上工作時會用到。


Rich Output — 圖表和表格直接顯示

Notebook 其中中一個功能:程式碼的輸出不只是文字,圖表和表格會直接渲染在 Cell 下面。

畫圖

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()

圖直接出現在那格正下方。你不用存檔再開、不用切到別的視窗看,程式碼和圖在一起。

表格

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

注意最後一行只寫 df,不是 print(df)。Notebook 會自動把一格裡最後一個表達式渲染成格式化的輸出。用 print() 只會得到純文字;直接寫變數名稱,會得到漂亮的 HTML 表格。課程管這個叫「auto-display the last expression in a cell」。


Notebooks vs Scripts:什麼時候用哪個

課程給了一條規則:在 Notebook 裡探索,在 Script 裡出貨。

用 Notebook 做用 Script(.py 檔)做
探索資料集—拿到一堆資料,東看看西看看,畫個圖,算個平均訓練流程——確認方法可行之後,整理成一個從頭跑到尾的程式
試做模型原型—寫幾行試試看行不行,改改參數再試可重複使用的工具函式——把常用功能放在一個檔案裡,需要時 import
畫圖看結果—馬上看到圖出現在程式碼下面排程跑的程式——每天自動跑一次,不可能每天去按 Shift+Enter
解釋你的工作—Markdown Cell 穿插在程式碼之間,像實驗報告上線的程式——給使用者用的系統,背後跑的一定是 .py 檔
快速實驗、課程練習—跑幾行看看結果套件和函式庫——像 numpy 本身就是用 .py 檔打包的

實務上的常見流程是:先在 Notebook 裡實驗 → 確認可行 → 把程式碼搬到 .py 檔 → 再從 .py 檔 import 回 Notebook 繼續實驗。


三個常見的陷阱

亂序執行

你先跑了第五格、再跑第二格、再跑第七格。你自己知道順序,但別人拿到這本 Notebook 從頭跑就爛了。解法是分享前一定要 Kernel → Restart & Run All,確認從第一格到最後一格順著跑沒問題。

幽靈狀態

你寫了一格 x = 100,跑了,然後把那格刪掉了。可是 Kernel 的記憶裡 x 還在。Notebook 看起來乾乾淨淨,但背後有一個你看不到的變數在作祟。解法是定期重啟 Kernel。

我在 Colab 上親身碰到了一次幽靈狀態:先跑了課程的 notebook_tips.py(裡面用了 plt.savefig() 之類的方式處理圖片),結果之後的 Cell 畫圖都不顯示。加了 %matplotlib inline 之後才恢復。前面的 Cell 改了 matplotlib 的設定,後面的 Cell 受影響但畫面上看不出來。

記憶體爆掉

讀了一個大資料集,又訓練模型,又讀另一個資料集,全部卡在記憶體裡不放。解法是 del 變數名稱gc.collect(),或者直接重啟 Kernel。


動手做:用 %timeit 比速度

課程的練習要你用 %timeit 比較 Python 原生和 numpy 產生十萬個隨機數字的速度:

%timeit [np.random.random() for _ in range(100000)]
%timeit np.random.random(100000)

我的結果:Python 的 list comprehension 花了 12 ms,numpy 只花了 176 us。numpy 快了大約 68 倍。

兩句都有用到 np.random.random,差別不在「誰產生隨機數」,而在「怎麼產生」。第一句是 Python 的迴圈,每次迴圈呼叫 numpy 產生一個數字、塞進 list,來回十萬次。第二句是直接跟 numpy 說「一次給我十萬個」,numpy 內部用 C 語言一口氣算完。慢的不是 numpy,是 Python 那個來回十萬次的迴圈。


四個關鍵詞

術語一般怎麼講白話意思
Kernel「跑我程式的那個東西」一個獨立的 Python 程序,執行 Cell、把變數記在記憶體裡
Cell「一格程式碼」Notebook 裡可以獨立執行的最小單位,有 Code 和 Markdown 兩種
Magic command「Jupyter 小技巧」%%% 開頭的特殊指令,不是 Python 語法,是 Jupyter 專屬
.ipynb「Notebook 檔案」JSON 格式的檔案,記錄 Cell、輸出結果和 metadata。名字來自 IPython Notebook

走到這裡才會知道的事

Cursor 內建就有 Jupyter 擴充套件。 課程說要 pip install jupyterlab,但如果你用 Cursor(或比較新版的 VS Code),Jupyter 擴充套件已經裝好了,不用額外處理。

Cursor 打開有 .venv 的資料夾會自動 activate。 你不需要每次手動在終端機打 source .venv/bin/activate,IDE 會幫你做。

在 Colab 上,%matplotlib inline 有時候需要手動加。 一般情況下 Colab 會自動開啟 inline 顯示,但如果你先跑了某些腳本改變了 matplotlib 的設定,後面的圖可能不會顯示。手動加一行 %matplotlib inline 就能解決。

課程 Build It 段落混了兩種範例。 有些是「你現在就跑」的(%timeit、畫圖),有些是「讓你知道有這個,以後用」的(%%time model.fit(...))。後者你現在跑不了,因為還沒有 model 和訓練資料。作者先給你看未來的使用場景,等你後面真的有模型了再回來用。