境配置到批量執(zhí)行)
Jupyter Notebook 如果只被當(dāng)成一個能寫代碼的記事本就浪費了它一半的價值。它真正的用法是把代碼、數(shù)據(jù)、圖表、說明文字和運行結(jié)果放在同一份文檔里讓分析過程可以逐段回放、逐段檢查、逐段復(fù)用。NTMSS2023 第 4 天第 1 節(jié)的內(nèi)容是 “Intro to Jupyter notebooks”正好是這套工具的入門入口。這篇教程會按照實際使用的順序來寫先看 Jupyter 能做什么、大概需要什么環(huán)境然后走一遍安裝、啟動、新建、運行、導(dǎo)出、批量執(zhí)行的完整流程。最后把最容易踩的坑集中列出來方便你遇到問題時直接對照排查。無論你是剛接觸 Python 數(shù)據(jù)分析還是想在團隊里統(tǒng)一分析流程這篇文章都可以直接作為第一份操作手冊。1. Jupyter Notebook 核心能力速覽Jupyter Notebook 嚴(yán)格來說不是單一的軟件而是一套組件組合瀏覽器里的交互式界面、獨立運行的計算內(nèi)核、文件格式 .ipynb、以及周邊導(dǎo)出和調(diào)度工具。這套結(jié)構(gòu)決定了它的能力邊界。能力項說明項目類型交互式計算環(huán)境常用于數(shù)據(jù)分析、教學(xué)、算法原型驗證主要組成Notebook 界面、Kernel 內(nèi)核、.ipynb 文件格式、nbconvert、JupyterLab支持語言通過安裝不同內(nèi)核支持 Python、R、Julia 等最常見的是 Python啟動方式命令行啟動 JupyterLab 或 Notebook瀏覽器訪問遠(yuǎn)程訪問默認(rèn)只監(jiān)聽本機可配置遠(yuǎn)程訪問但需要額外處理安全認(rèn)證批量任務(wù)可用 nbconvert --execute 或 papermill 批量執(zhí)行筆記本接口能力提供 REST API也支持 Notebook 文件格式級調(diào)用交互能力支持 Markdown 單元格、代碼單元格、表格、圖片、交互式控件適合場景數(shù)據(jù)探索、課程教學(xué)、實驗記錄、論文復(fù)現(xiàn)、算法調(diào)試不適合場景大型工程開發(fā)、高并發(fā)服務(wù)、需要長期運行的獨立任務(wù)從這張表可以看出來Jupyter 的強項不是“部署一個服務(wù)”而是“讓一個分析過程可讀、可改、可重跑”。后面所有操作都圍繞這個核心展開。2. 適用場景與使用邊界先回答最實際的問題我要不要用 Jupyter用它解決什么問題最典型的適用場景是數(shù)據(jù)探索。拿到一批數(shù)據(jù)不想一開始就寫完整腳本而是想快速看看字段、分布、缺失值這時候 Jupyter 的逐格運行優(yōu)勢非常明顯寫一小段、跑一小段、立刻看結(jié)果發(fā)現(xiàn)不對就改。對課程教學(xué)來說它可以把理論、公式、示意代碼和效果圖并排放在一起學(xué)生可以自己動手改參數(shù)重跑。對論文復(fù)現(xiàn)來說notebook 文件天然記錄了運行順序和中間輸出比零散的 .py 文件更容易還原當(dāng)時的分析過程。它不適合什么場景如果任務(wù)是一個完整的后端服務(wù)比如 Web API、爬蟲調(diào)度器、消息隊列消費者那不應(yīng)該用 notebook 長期運行因為 kernel 斷開會話就丟也不方便做進程守護。如果代碼庫很大、模塊很多、需要嚴(yán)格測試和類型檢查Jupyter 也不是最合適的主戰(zhàn)場它更適合做研究階段的原型工程化階段仍然建議把穩(wěn)定代碼抽成 .py 模塊和測試用例。還有一個必須強調(diào)的使用邊界Jupyter 里運行代碼時單元格之間是共享全部變量的這帶來便利也帶來隱患。前一個單元格定義了變量后一個單元格可能隱式依賴它重跑整個 notebook 時順序一亂結(jié)果就變樣。所以要養(yǎng)成“從頭到尾重跑一遍”的驗證習(xí)慣。涉及敏感數(shù)據(jù)時不要把明文密鑰、手機號、身份證號、業(yè)務(wù)隱私數(shù)據(jù)直接放在 notebook 里也不要隨手把帶敏感輸出的 notebook 分享出去。本地演示用測試數(shù)據(jù)線上數(shù)據(jù)要脫敏后再進 notebook。3. 環(huán)境準(zhǔn)備與前置條件Jupyter 的本質(zhì)是一個 Python 包加瀏覽器界面環(huán)境準(zhǔn)備并不復(fù)雜但要避免后面反復(fù)折騰依賴沖突所以環(huán)境隔離這一步不能省。3.1 操作系統(tǒng)的選擇Jupyter Notebook 官方支持 Windows、macOS 和主流 Linux 發(fā)行版。Windows 上安裝時要注意如果路徑中含中文或空格可能帶來一些兼容問題建議所有安裝目錄盡量用英文路徑。Linux 服務(wù)器上安裝時注意區(qū)分系統(tǒng)自帶的 Python 和通過包管理器安裝的 Python避免混用不同版本。3.2 Python 版本與虛擬環(huán)境檢查運行以下命令確認(rèn)當(dāng)前 Python 版本python --version pip --version如果還沒有 Python推薦先安裝 Miniconda體積比 Anaconda 小很多但足夠管理虛擬環(huán)境。使用 conda 或 venv 創(chuàng)建獨立環(huán)境不要讓 Jupyter 直接裝在系統(tǒng) Python 里。使用 conda 創(chuàng)建環(huán)境conda create -n jupyter-env python3.11 -y conda activate jupyter-env如果系統(tǒng)里只有普通 Python可以用 venv 創(chuàng)建虛擬環(huán)境python -m venv jupyter-env # Windows: jupyter-env\Scripts\activate # Linux/macOS: source jupyter-env/bin/activate3.3 磁盤空間與依賴規(guī)劃Jupyter 本體占用空間很小但安裝數(shù)據(jù)分析常用庫比如 pandas、numpy、matplotlib會占用幾百 MB 到 1GB 以上。在服務(wù)器上使用時要提前給用戶目錄和臨時目錄留出空間。.ipynb 文件本身是 JSON 格式如果單元格里嵌入了大量圖片、大表格輸出文件會迅速膨脹所以要注意保存前清理不必要的輸出。4. 安裝部署與啟動方式環(huán)境準(zhǔn)備好之后安裝和啟動 Jupyter 只需要幾條命令。這里推薦安裝 JupyterLab它是新版 Notebook 的功能超集既有傳統(tǒng) Notebook 的文件列表又支持多標(biāo)簽頁、插件、終端、代碼格式化等擴展功能。4.1 安裝 JupyterLabpip install jupyterlab安裝完成后確認(rèn)版本jupyter lab --version如果是在服務(wù)器或容器中運行也可以考慮安裝完整的數(shù)據(jù)科學(xué)基礎(chǔ)包pip install pandas numpy matplotlib4.2 本地啟動服務(wù)默認(rèn)情況下JupyterLab 只綁定在 127.0.0.1也就是只有本機能訪問這個默認(rèn)策略比較安全建議保持。啟動命令如下jupyter lab啟動后終端會輸出一個帶 token 的訪問地址形如http://127.0.0.1:8888/lab?token一串隨機字符瀏覽器打開這個地址就可以進入工作臺。如果你想手動指定端口比如端口 8889 被占用時jupyter lab --port 8889如果想指定監(jiān)聽地址和端口比如在遠(yuǎn)程服務(wù)器上使用需要顯式設(shè)置jupyter lab --ip 0.0.0.0 --port 8888 --no-browser這里必須提醒將 IP 設(shè)置為 0.0.0.0 意味著同一網(wǎng)絡(luò)內(nèi)其他機器都可以訪問你的服務(wù)沒有設(shè)置密碼時非常危險。遠(yuǎn)程使用時要先配置密碼或使用 token并且建議配合防火墻只放行可信 IP。不要把未保護的 Jupyter 暴露到公網(wǎng)。4.3 設(shè)置登錄密碼設(shè)置密碼可以避免每次復(fù)制 tokenjupyter server password輸入兩次密碼后后續(xù)訪問到登錄頁輸入該密碼即可。這個密碼會寫入配置文件中權(quán)限需要由當(dāng)前用戶控制。4.4 利用 JupyterLab 的桌面入口如果是個人電腦日常使用JupyterLab 安裝后通常會在開始菜單或應(yīng)用程序目錄中生成快捷方式直接雙擊啟動即可。啟動后瀏覽器會打開工作臺界面左側(cè)是文件樹中間是文件編輯區(qū)。界面語言為英文但源碼和 Markdown 支持中文編輯。5. 功能測試與效果驗證安裝完成只是一個開始接下來要驗證 notebook 是否真的能run起來。下面按“新建—運行—導(dǎo)出”的主線走一遍。5.1 新建第一個 Notebook進入 JupyterLab 工作臺后點擊左側(cè)號在 Launcher 中找到 Python 3 圖標(biāo)點擊即可新建一個 notebook。注意這里的 Python 3 代表當(dāng)前環(huán)境里的默認(rèn) kernel。如果你是在 conda 環(huán)境里安裝的 jupyter但 Launcher 里沒有顯示這個環(huán)境的 Python說明 kernel 沒有注冊需要安裝 ipykernelpip install ipykernel python -m ipykernel install --user --name jupyter-env --display-name Python (jupyter-env)注冊完成后刷新瀏覽器頁面Launcher 里就會多一個對應(yīng)的選項。5.2 單元格基本運行Notebook 由兩種單元格組成Code 單元格和 Markdown 單元格。Code 單元格用于運行程序按Shift Enter執(zhí)行并跳到下一個單元格Markdown 單元格用于寫說明文字同樣按Shift Enter渲染。先在第一個 Code 單元格里寫一個最簡單的測試print(Hello Jupyter)按Shift Enter執(zhí)行輸出區(qū)域應(yīng)顯示Hello Jupyter。接著測試一下基本的 Python 操作data [1, 2, 3, 4, 5] mean sum(data) / len(data) print(fmean: {mean})此時說明 kernel 正常工作。注意變量data和mean已經(jīng)存進了當(dāng)前 kernel 的全局命名空間在后續(xù)任意單元格中都可以直接引用。5.3 Markdown 單元格與圖文混排在當(dāng)前單元格上方點擊 “” 插入一個新單元格切換單元格類型為 Markdown輸入# 數(shù)據(jù)分析實驗記錄 - 數(shù)據(jù)來源示例數(shù)據(jù) - 分析目標(biāo)驗證均值計算 - 環(huán)境JupyterLab Python 3按Shift Enter渲染文檔會顯示標(biāo)題和列表。這就是 notebook 比普通腳本直觀的原因代碼、輸出、筆記在同一個文件里按順序排列。5.4 可視化驗證數(shù)據(jù)分析和展示是 Jupyter 的標(biāo)準(zhǔn)功能。先安裝 matplotlib然后運行import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4], [2, 4, 1, 3]) plt.title(Test Plot) plt.show()輸出區(qū)域應(yīng)顯示折線圖。如果圖片能正常顯示說明 matplotlib 集成沒問題。需要說明的是在 notebook 中通常不需要顯式調(diào)用%matplotlib inline新版 JupyterLab 默認(rèn)就能嵌入圖片但如果是舊版本 Notebook可能需要手動設(shè)置。5.5 時間開銷測試分析場景里經(jīng)常需要關(guān)心一段代碼跑多久。用魔術(shù)命令%time或者%%time可以不額外寫代碼完成計時%%time total 0 for i in range(1000000): total i print(total)計時結(jié)果會顯示在單元格輸出中比如CPU times: user 62.3 ms, sys: 3.1 ms, total: 65.4 ms Wall time: 65.9 ms這個能力在排查性能問題時很實用。%time只對單條語句計時%%time對當(dāng)前單元格整體計時。5.6 重新執(zhí)行整個 NotebookNotebook 的一個常見坑是你只從上到下執(zhí)行一次沒問題但修改中間某個單元格后后面單元格里的變量可能就變了。所以每次改動后最好通過菜單Run Run All Cells重跑整個 notebook驗證邏輯是否仍然正確。這個操作在正式分享或提交輸出前很有必要。5.7 保存與導(dǎo)出notebook 的自動保存默認(rèn)開啟但建議長會話中手動按CtrlS保存。導(dǎo)出為其他格式使用菜單File Save and Export Notebook As可以導(dǎo)出為 Markdown、HTML、Python 腳本等。命令行導(dǎo)出在后面接口部分講批量場景更常用。6. 接口 API 與批量任務(wù)很多人只把 Jupyter 當(dāng)個人工具用忽略了一個亮點它的文件格式和執(zhí)行邏輯是可以被程序調(diào)用的。這意味著你可以批量執(zhí)行若干 notebook、批量導(dǎo)出報告甚至把 notebook 當(dāng)成一種可復(fù)現(xiàn)的“分析腳本”。6.1 命令行批量轉(zhuǎn)換nbconvertnbconvert 是 Jupyter 自帶的轉(zhuǎn)換工具。把一個 notebook 轉(zhuǎn)為 HTML 報告jupyter nbconvert --to html analysis.ipynb轉(zhuǎn)為 Markdownjupyter nbconvert --to markdown analysis.ipynb這個命令可以加--execute參數(shù)先執(zhí)行所有單元格再導(dǎo)出jupyter nbconvert --to html --execute analysis.ipynb加上--ExecutePreprocessor.timeout600可以加大超時時間適合長時間運行的單元格jupyter nbconvert --to html --execute analysis.ipynb --ExecutePreprocessor.timeout600批量轉(zhuǎn)換多個 notebook 時可以直接把多個文件名放一起或者寫一個簡單的 shell 循環(huán)。例如在 Linux/macOS 下for file in notebooks/*.ipynb; do jupyter nbconvert --to html --execute $file doneWindows PowerShell 下可以寫Get-ChildItem notebooks\*.ipynb | ForEach-Object { jupyter nbconvert --to html --execute $_.FullName }這種方式的優(yōu)勢是簡單每個 notebook 獨立執(zhí)行失敗時該文件會報錯但不會影響其他文件。6.2 參數(shù)化批量執(zhí)行papermill如果 notebook 里跑的是同一套分析邏輯只是輸入?yún)?shù)不同nbconvert 的缺點就暴露了每次都要手動改單元格里的變量。paper mill 是專門解決這個問題的工具通過在 notebook 中標(biāo)記參數(shù)單元格讓外部命令注入?yún)?shù)然后批量執(zhí)行并單獨保存輸出。安裝 papermillpip install papermill假設(shè) notebook 中某個 Code 單元格是# 參數(shù) input_file data/input.csv threshold 0.5用 papermill 執(zhí)行并注入新參數(shù)papermill analysis.ipynb output/analysis_0.8.ipynb -p threshold 0.8 -p input_file data/input_2.csv它會把參數(shù)單元格替換為指定值然后從頭執(zhí)行整個 notebook并把結(jié)果輸出到新文件。這樣可以一次跑多個參數(shù)組合papermill analysis.ipynb output/analysis_0.1.ipynb -p threshold 0.1 papermill analysis.ipynb output/analysis_0.5.ipynb -p threshold 0.5 papermill analysis.ipynb output/analysis_0.9.ipynb -p threshold 0.9執(zhí)行完成后output 目錄下會保留每個參數(shù)組合對應(yīng)的完整 notebook附帶全部運行輸出。這對參數(shù)掃描、敏感性分析、周期報表自動化非常有幫助。6.3 使用 Jupyter REST APIJupyter 服務(wù)本身也提供 HTTP 接口比如查看當(dāng)前運行的內(nèi)核、創(chuàng)建內(nèi)核、執(zhí)行代碼等。默認(rèn)訪問需要 token可以在啟動日志里找到。向內(nèi)核執(zhí)行代碼需要先獲取 kernel id然后通過 WebSocket 發(fā)送消息這個過程比較復(fù)雜。相對實用的場景是列出服務(wù)狀態(tài)和 kernel 列表。列出 kernel 列表curl -H Authorization: token 你的token http://127.0.0.1:8888/api/kernels返回結(jié)果是一個 JSON 數(shù)組包含 name、kernel id、connections 等信息。用 Requests 也可以import requests url http://127.0.0.1:8888/api/kernels r requests.get(url, headers{Authorization: token 你的token}) print(r.json())如果你的主要訴求是“讓程序運行某個 notebook 并拿到結(jié)果”更推薦 nbconvert 或 papermill而不是直接調(diào) API。直接調(diào) REST API 適合做集成監(jiān)控、自動化運維比如確認(rèn)某個服務(wù)節(jié)點上的 kernel 還活著。6.4 任務(wù)隊列與失敗重試建議批量執(zhí)行 notebook 時要考慮穩(wěn)定性。建議每次執(zhí)行都在獨立輸出目錄中保存結(jié)果文件避免覆蓋原文件。執(zhí)行日志要保留哪個文件失敗、哪一步超時要有記錄。對于臨時失敗比如網(wǎng)絡(luò)下載依賴導(dǎo)致的失敗可以加一層重試先執(zhí)行一次失敗后等幾秒再執(zhí)行一次。對于參數(shù)類任務(wù)強烈建議把參數(shù)文件集中管理用 JSON 或 YAML 記錄參數(shù)組合方便復(fù)現(xiàn){ task1: { input_file: data/input_1.csv, threshold: 0.5 }, task2: { input_file: data/input_2.csv, threshold: 0.8 } }然后寫一個 Python 腳本讀取 JSON 后調(diào)用 papermill 接口逐個執(zhí)行。7. 資源占用與性能觀察Jupyter 不是重型應(yīng)用但它的資源占用情況會直接決定你的工作流是否順暢。核心要觀察兩個維度內(nèi)存占用和 kernel 占用。7.1 內(nèi)存占用Jupyter 啟動后Node.js 前端進程和一個 Python kernel 進程會常駐。前端進程負(fù)責(zé)瀏覽器界面和文件服務(wù)kernel 進程負(fù)責(zé)執(zhí)行代碼。內(nèi)存占用不像固定指標(biāo)取決于你加載了多少數(shù)據(jù)、多少庫。比如一個空 notebook 的 kernel 內(nèi)存占用很低但一旦加載大 DataFrame內(nèi)存會明顯上升。所以不要用“一個 kernel 占多少內(nèi)存”來量化而要把top或任務(wù)管理器里的 python 進程當(dāng)作觀察點。在 Linux 服務(wù)器上可以用top -u $USER或者用 htop 實時看htop如果頁面卡頓通常不是 Jupyter 本身的問題而是 kernel 正在執(zhí)行大計算。此時瀏覽器請求等結(jié)果并不代表 Jupyter 卡死。7.2 內(nèi)核數(shù)量與端口每新建一個 notebookJupyter 會對應(yīng)一個 kernel 進程。打開的 notebook 越多后臺進程就越多。長時間不用的 notebook 應(yīng)該關(guān)閉并關(guān)閉其 kernel否則會白占內(nèi)存??梢酝ㄟ^菜單File Shut Down Kernel關(guān)閉指定 notebook 的內(nèi)核也可以通過左側(cè)Running Terminals and Kernels面板統(tǒng)一管理。7.3 降低資源占用的實用方法不要在同一個 notebook 里加載多份大型數(shù)據(jù)集用不到的就釋放或刪除。大矩陣和中間結(jié)果變量要及時釋放del 變量名之后如果內(nèi)存沒有立即下降可以調(diào)用import gc; gc.collect()。涉及長時間循環(huán)時優(yōu)先用向量化寫法比如把 Python 循環(huán)改寫為 pandas 或 numpy 操作。帶圖像的單元格會被緩存到內(nèi)存中輸出過多時重啟 kernel 會更干凈。如果是為了保留運行結(jié)果而保存 large output可以在保存前清空輸出再重跑一遍生成最終報告。8. 常見問題與排查方法問題現(xiàn)象可能原因排查方式解決方案瀏覽器打開地址后提示 404服務(wù)未啟動或地址端口寫錯檢查終端日志中的訪問 URL確認(rèn)端口重新用jupyter lab啟動復(fù)制終端里的完整 URL啟動后找不到 token服務(wù)啟動時沒有打印 URL或終端滾動丟失執(zhí)行jupyter server list查看當(dāng)前服務(wù)和 token也可用jupyter server password設(shè)置固定密碼端口被占用另一個 Jupyter 服務(wù)或程序占用了 8888netstat -anofindstr 8888Windows或lsof -i:8888macOS/Linux新建 notebook 時沒有 Python 3 kernel當(dāng)前環(huán)境沒有注冊 ipykernel運行jupyter kernelspec list查看已注冊內(nèi)核執(zhí)行python -m ipykernel install --user --name 環(huán)境名單元格執(zhí)行后提示 ModuleNotFoundError模塊沒有安裝或安裝到了另外的 Python 環(huán)境在 notebook 里執(zhí)行import sys; print(sys.executable)確認(rèn) kernel 使用的 Python 路徑在對應(yīng)環(huán)境中執(zhí)行pip install 包名代碼能跑但頁面不顯示圖片matplotlib 輸出嵌入配置問題檢查圖表代碼是否在正確單元格是否有plt.show()新版本一般自動嵌入舊版本可添加%matplotlib inlinenotebook 文件保存失敗權(quán)限不足或磁盤空間不足查看終端日志檢查目錄寫權(quán)限更換輸出目錄或調(diào)整用戶權(quán)限遠(yuǎn)程訪問被拒絕服務(wù)只監(jiān)聽 127.0.0.1或防火墻攔截檢查啟動命令是否有--ip 0.0.0.0檢查防火墻規(guī)則明確設(shè)置監(jiān)聽地址配置密碼并放行端口批量執(zhí)行時某個文件卡住單元格中有長循環(huán)或等待超時增加 ExecutePreprocessor timeout--ExecutePreprocessor.timeout600長時間運行后頁面無響應(yīng)kernel 內(nèi)存過大或正在計算查看系統(tǒng)資源占用查看終端日志重啟 kernel減少單次計算量9. 最佳實踐與使用建議Jupyter 用久了很多人會發(fā)現(xiàn)最影響效率的不是功能不會用而是 notebook 結(jié)構(gòu)混亂、難以復(fù)現(xiàn)。下面幾條實踐建議適合個人和團隊場景。第一一個 notebook 只解決一個分析問題。不要把數(shù)據(jù)清洗、特征工程、建模、繪圖、導(dǎo)出報告全塞進同一個文件。按階段拆成多個 notebook比如01_load_data.ipynb、02_clean_data.ipynb、03_model.ipynb每個文件專注一個環(huán)節(jié)后續(xù)調(diào)用和回溯都方便。第二單元格的順序就是執(zhí)行邏輯的順序。從上到下寫完每次修改后都完整重跑一次。不要在 notebook 中間隨機跳著執(zhí)行否則輸出的結(jié)果只能代表當(dāng)前順序下的狀態(tài)不是可復(fù)現(xiàn)的結(jié)果。分享前用Run All Cells重跑一遍確認(rèn)所有輸出都能復(fù)現(xiàn)。第三控制單元格粒度。一個單元格里寫幾千行代碼和寫一個 .py 腳本沒區(qū)別。合理粒度是每個單元格完成一個獨立子任務(wù)函數(shù)定義、參數(shù)設(shè)置、數(shù)據(jù)加載、可視化、結(jié)果統(tǒng)計分別放在不同單元格。這樣別人閱讀時可以按段理解邏輯。第四敏感信息不要留在 notebook 里。數(shù)據(jù)庫密碼、API Key、個人數(shù)據(jù)等不應(yīng)該寫入代碼單元格或輸出區(qū)域。如果必須做配置用環(huán)境變量或單獨的配置文件并在提交前清理輸出。第五版本控制要同步。.ipynb 是 JSON 格式直接放進 Git 會導(dǎo)致 diff 難讀而且輸出變化會造成大量無關(guān)改動。團隊協(xié)作時可以把最終版本導(dǎo)出為 .py 或 Markdown 審查也可以在 Git 中配置清理工具過濾輸出。如果只是自己使用至少要做到模型文件、輸入數(shù)據(jù)、輸出結(jié)果分別放在獨立目錄中notebook 文件按日期或版本命名。第六依賴環(huán)境要記錄。在項目根目錄維護 requirements.txt 或 environment.yml。這樣換機器或換環(huán)境時一條命令就能恢復(fù)依賴pip freeze requirements.txt # 或 conda env export environment.yml恢復(fù)環(huán)境pip install -r requirements.txt # 或 conda env create -f environment.yml第七批量執(zhí)行時先小范圍測試。第一次用 papermill 批量跑 20 個參數(shù)組合前先跑 1 個驗證 notebook 能正常執(zhí)行、輸出路徑正確。確認(rèn)沒問題后再擴大到全部參數(shù)。批量任務(wù)要保留日志以便定位哪個參數(shù)組合執(zhí)行失敗。第八注意遠(yuǎn)程服務(wù)的訪問邊界。如果是在服務(wù)器上用 Jupyter建議啟用密碼認(rèn)證、只監(jiān)聽可信 IP、通過 SSH 隧道訪問而不是直接暴露公網(wǎng)。從安全穩(wěn)定角度考慮公共服務(wù)部署不應(yīng)該依賴 notebook 長期進程。10. 總結(jié)與下一步Jupyter Notebook 最值得嘗試的點是把“寫代碼”和“寫分析文檔”合并成同一件事。你可以在一個 .ipynb 文件里同時保留思路、代碼、圖表和結(jié)論而且隨時可以重新執(zhí)行。最開始拿到一個 notebook 時先跑一遍Run All Cells再逐段修改學(xué)習(xí)理解每個單元格做了什么是上手最快的方式。最容易踩的坑有兩個第一環(huán)境混亂模塊裝到了別的 Python 環(huán)境導(dǎo)致啟動后找不到包第二單元格執(zhí)行順序混亂導(dǎo)致最終結(jié)果無法復(fù)現(xiàn)。只要把虛擬環(huán)境和“重跑全部”這兩個習(xí)慣養(yǎng)成大部分 Jupyter 使用問題都能規(guī)避。下一步可以按自己的方向繼續(xù)擴展學(xué)習(xí) JupyterLab 的快捷鍵和分屏操作提升日常編輯效率。研究 papermill 與參數(shù)化執(zhí)行把你的 notebook 變成可批量執(zhí)行的自動分析流程。嘗試 Jupyter Book把多個 notebook 組織成在線閱讀文檔。在云端平臺里使用 Jupyter比如通過 Binder 快速分享教學(xué)示例或使用云端 GPU 跑模型實驗。將穩(wěn)定代碼從 notebook 中抽成 .py 模塊再通過 notebook 做調(diào)用演示兼顧工程化和可讀性。Jupyter 的關(guān)鍵不是某個花哨功能而是讓你的分析過程可以被記錄、被解釋、被復(fù)用。從這節(jié)課的內(nèi)容出發(fā)先跑通一個最小示例再逐步加入你要處理的數(shù)據(jù)和方法就是最穩(wěn)的前進路徑。