使用 JupyterLab 進行資料科學
Docker 和 JupyterLab 是兩個強大的工具,可以提升您的資料科學工作流程。在本指南中,您將學習如何將它們結合使用,以建立並執行可重現的資料科學環境。本指南基於 使用 JupyterLab 和 Docker 強化 AI/ML 開發。
在本指南中,您將學習如何:
- 在您的本機機器上執行個人 Jupyter Server 和 JupyterLab
- 自訂您的 JupyterLab 環境
- 與其他資料科學家分享您的 JupyterLab 筆記本與環境
什麼是 JupyterLab?
JupyterLab 是一個圍繞著計算筆記本文件概念構建的開源應用程式。它支援分享與執行程式碼、資料處理、視覺化,並提供一系列用於建立圖表的互動式功能。
為什麼要將 Docker 與 JupyterLab 結合使用?
透過結合 Docker 與 JupyterLab,您可以同時享有這兩款工具的優勢,例如:
- 容器化可確保 JupyterLab 環境在所有部署中保持一致,從而消除相容性問題。
- 容器化的 JupyterLab 簡化了共享與協作,無需手動設定環境。
- 容器為 JupyterLab 提供了擴展性,支援工作負載分配,並透過 Kubernetes 等平台實現高效的資源管理。
先決條件
若要跟隨本指南操作,您必須安裝最新版本的 Docker Desktop。
執行並存取 JupyterLab 容器
在終端機中,執行以下指令以執行您的 JupyterLab 容器。
$ docker run --rm -p 8889:8888 quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
以下是該指令的重點部分:
-p 8889:8888:將主機的 8889 連接埠映射到容器的 8888 連接埠。start-notebook.py --NotebookApp.token='my-token':設定存取權杖 (token),而非使用隨機權杖。
如需更多詳細資訊,請參閱 Jupyter Server 選項 以及 docker run CLI 參考。
如果您是第一次執行該映像檔,Docker 將會下載並執行它。下載映像檔所需的時間取決於您的網路連線。
映像檔下載並執行完成後,您就可以存取該容器。若要存取容器,請在網頁瀏覽器中前往 localhost:8889/lab?token=my-token。
若要停止容器,請在終端機中按下 ctrl+c。
若要存取您系統上現有的筆記本,可以使用 繫結掛載 (bind mount)。開啟終端機並切換至存放現有筆記本的目錄。然後,根據您的作業系統執行以下指令。
$ docker run --rm -p 8889:8888 -v "$(pwd):/home/jovyan/work" quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
$ docker run --rm -p 8889:8888 -v "%cd%":/home/jovyan/work quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
$ docker run --rm -p 8889:8888 -v "$(pwd):/home/jovyan/work" quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
$ docker run --rm -p 8889:8888 -v "/$(pwd):/home/jovyan/work" quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
-v 選項告訴 Docker 將您當前的工作目錄掛載到容器內的 /home/jovyan/work。預設情況下,Jupyter 映像檔的根目錄是 /home/jovyan,您只能在容器中存取或儲存筆記本到該目錄。
現在,您可以存取 localhost:8889/lab?token=my-token 並開啟掛載目錄中包含的筆記本。
若要停止容器,請在終端機中按下 ctrl+c。
Docker 還提供「儲存卷 (volumes)」,這是保留 Docker 容器生成及使用之資料的首選機制。雖然繫結掛載依賴於主機機器的目錄結構和作業系統,但儲存卷則完全由 Docker 管理。
儲存並存取筆記本
當您移除容器時,該容器中的所有資料都會被刪除。為了將筆記本儲存到容器之外,您可以使用 儲存卷。
使用儲存卷執行 JupyterLab 容器
若要啟動帶有儲存卷的容器,請開啟終端機並執行以下指令:
$ docker run --rm -p 8889:8888 -v jupyter-data:/home/jovyan/work quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
-v 選項告訴 Docker 建立一個名為 jupyter-data 的儲存卷,並將其掛載到容器內的 /home/jovyan/work。
若要存取容器,請在網頁瀏覽器中前往 localhost:8889/lab?token=my-token。筆記本現在可以儲存到儲存卷中,即使刪除容器後,這些資料依然可以存取。
將筆記本儲存到儲存卷
在此範例中,您將使用 scikit-learn 的 Iris 資料集 (Iris Dataset) 範例。
開啟網頁瀏覽器,前往 localhost:8889/lab?token=my-token 存取您的 JupyterLab 容器。
在 Launcher(啟動器)中,於 Notebook 下方選擇 Python 3。
在筆記本中,輸入以下內容以安裝必要的套件。
!pip install matplotlib scikit-learn點選播放按鈕以執行程式碼。
在筆記本中,輸入以下程式碼。
from sklearn import datasets iris = datasets.load_iris() import matplotlib.pyplot as plt _, ax = plt.subplots() scatter = ax.scatter(iris.data[:, 0], iris.data[:, 1], c=iris.target) ax.set(xlabel=iris.feature_names[0], ylabel=iris.feature_names[1]) _ = ax.legend( scatter.legend_elements()[0], iris.target_names, loc="lower right", title="Classes" )點選播放按鈕以執行程式碼。您應該會看到 Iris 資料集的散佈圖。
在頂部選單中,選擇 File,然後選擇 Save Notebook。
在
work目錄中指定一個名稱,將筆記本儲存到儲存卷。例如:work/mynotebook.ipynb。選擇 Rename 以儲存筆記本。
筆記本現在已儲存在儲存卷中。
在終端機中,按下 ctrl+c 停止容器。
現在,每當您使用該儲存卷執行 Jupyter 容器時,您都能存取到已儲存的筆記本。
當您執行新容器並再次執行資料繪圖程式碼時,它會需要執行 !pip install matplotlib scikit-learn 並下載這些套件。您可以透過建立包含已安裝套件的映像檔,來避免每次執行新容器時都要重新安裝套件。
自訂您的 JupyterLab 環境
您可以建立自己的 JupyterLab 環境,並使用 Docker 將其建置為映像檔。透過建置自己的映像檔,您可以利用所需的套件和工具自訂您的 JupyterLab 環境,並確保其在不同部署中保持一致且可重現。建置自己的映像檔還可以讓您更輕鬆地與他人分享您的 JupyterLab 環境,或將其作為進一步開發的基礎。
在 Dockerfile 中定義您的環境
在之前 將筆記本儲存到儲存卷 的 Iris 資料集範例中,您必須在每次執行新容器時安裝 matplotlib 和 scikit-learn 這些依賴項。雖然在那個小型範例中依賴項下載安裝很快,但隨著您的依賴清單增長,這可能會成為問題。環境中可能還有其他您始終需要的工具、套件或檔案。
在這種情況下,您可以將依賴項作為映像檔環境的一部分進行安裝。這樣,每次執行容器時,依賴項都會自動安裝。
您可以在 Dockerfile 中定義您的環境。Dockerfile 是一個文字檔,用於指導 Docker 如何建立您的 JupyterLab 環境映像檔。映像檔包含您執行 JupyterLab 時想要和需要的一切,例如檔案、套件和工具。
在您選擇的目錄中,建立一個名為 Dockerfile 的新文字檔。在 IDE 或文字編輯器中開啟 Dockerfile,然後加入以下內容。
# syntax=docker/dockerfile:1
FROM quay.io/jupyter/base-notebook
RUN pip install --no-cache-dir matplotlib scikit-learn此 Dockerfile 使用 quay.io/jupyter/base-notebook 映像檔作為基礎,然後執行 pip 安裝依賴項。如需關於 Dockerfile 指令的更多詳細資訊,請參閱 Dockerfile 參考。
繼續之前,請儲存您對 Dockerfile 的變更。
將您的環境建置為映像檔
擁有定義環境的 Dockerfile 後,您可以使用 docker build 指令利用該 Dockerfile 建置映像檔。
開啟終端機,切換至您的 Dockerfile 所在目錄,然後執行以下指令。
$ docker build -t my-jupyter-image .
該指令會從您的 Dockerfile 和環境內容建置一個 Docker 映像檔。-t 選項指定映像檔的名稱和標籤 (tag),在此例中為 my-jupyter-image。. 表示當前目錄為環境內容,這意味著該目錄中的檔案可用於映像檔建立過程中。
您可以透過查看 Docker Desktop 中的 Images(映像檔)視圖,或在終端機中執行 docker image ls 指令,驗證映像檔是否已建置。您應該會看到一個名為 my-jupyter-image 的映像檔。
將您的映像檔作為容器執行
若要將您的映像檔作為容器執行,請使用 docker run 指令。在 docker run 指令中,您需要指定您自己的映像檔名稱。
$ docker run --rm -p 8889:8888 my-jupyter-image start-notebook.py --NotebookApp.token='my-token'
若要存取容器,請在網頁瀏覽器中前往 localhost:8889/lab?token=my-token。
您現在可以使用這些套件,無需在筆記本中進行安裝。
在 Launcher(啟動器)中,於 Notebook 下方選擇 Python 3。
在筆記本中,輸入以下程式碼。
from sklearn import datasets iris = datasets.load_iris() import matplotlib.pyplot as plt _, ax = plt.subplots() scatter = ax.scatter(iris.data[:, 0], iris.data[:, 1], c=iris.target) ax.set(xlabel=iris.feature_names[0], ylabel=iris.feature_names[1]) _ = ax.legend( scatter.legend_elements()[0], iris.target_names, loc="lower right", title="Classes" )點選播放按鈕以執行程式碼。您應該會看到 Iris 資料集的散佈圖。
在終端機中,按下 ctrl+c 停止容器。
使用 Compose 執行您的容器
Docker Compose 是一個定義和執行多容器應用程式的工具。在此範例中,應用程式並非多容器應用程式,但 Docker Compose 可以透過將所有 docker run 選項定義在一個檔案中,使執行變得更加容易。
建立 Compose 檔案
若要使用 Compose,您需要一個 compose.yaml 檔案。在與 Dockerfile 同一個目錄中,建立一個名為 compose.yaml 的新檔案。
在 IDE 或文字編輯器中開啟 compose.yaml 檔案並加入以下內容。
services:
jupyter:
build:
context: .
ports:
- 8889:8888
volumes:
- jupyter-data:/home/jovyan/work
command: start-notebook.py --NotebookApp.token='my-token'
volumes:
jupyter-data:
name: jupyter-data此 Compose 檔案指定了您在 docker run 指令中使用過的所有選項。如需關於 Compose 指令的更多詳細資訊,請參閱 Compose 檔案參考。
繼續之前,請儲存您對 compose.yaml 檔案的變更。
使用 Compose 執行您的容器
開啟終端機,切換至您的 compose.yaml 檔案所在目錄,然後執行以下指令。
$ docker compose up --build
該指令會建置您的映像檔,並根據 compose.yaml 檔案中指定的指令將其作為容器執行。--build 選項確保您的映像檔會被重新建置,這在您變更過 Dockerfile 時非常有必要。
若要存取容器,請在網頁瀏覽器中前往 localhost:8889/lab?token=my-token。
在終端機中,按下 ctrl+c 停止容器。
分享您的工作
透過分享您的映像檔和筆記本,您可以建立一個可攜且可重現的研究環境,讓其他資料科學家能夠輕鬆存取和使用。此過程不僅有助於協作,還能確保您的工作保存在一個可以執行且無相容性問題的環境中。
若要分享您的映像檔和資料,您將使用 Docker Hub。Docker Hub 是一個基於雲端的登錄服務,讓您可以分享與發布容器映像檔。
分享您的映像檔
註冊 或登入 Docker Hub。
重新命名您的映像檔,以便 Docker 知道要將其推送至哪個儲存庫。開啟終端機並執行以下
docker tag指令。請將YOUR-USER-NAME取代為您的 Docker ID。$ docker tag my-jupyter-image YOUR-USER-NAME/my-jupyter-image執行以下
docker push指令將映像檔推送至 Docker Hub。請將YOUR-USER-NAME取代為您的 Docker ID。$ docker push YOUR-USER-NAME/my-jupyter-image驗證您已將映像檔成功推送至 Docker Hub。
- 前往 Docker Hub。
- 選擇 我的 Hub > 儲存庫。
- 查看您儲存庫的 Last pushed(最後推送)時間。
其他使用者現在可以使用 docker run 指令下載並執行您的映像檔。他們需要將 YOUR-USER-NAME 取代為您的 Docker ID。
$ docker run --rm -p 8889:8888 YOUR-USER-NAME/my-jupyter-image start-notebook.py --NotebookApp.token='my-token'
分享您的儲存卷
此範例使用 Docker Desktop 圖形化使用者介面。或者,在命令列介面中,您可以 備份儲存卷,然後 使用 ORAS CLI 將其推送。
- 登入 Docker Desktop。
- 在 Docker Dashboard 中,選擇 Volumes(儲存卷)。
- 選取名稱以選擇 jupyter-data 儲存卷。
- 選擇 Exports(匯出)索引標籤。
- 選擇 Quick export(快速匯出)。
- 對於 Location(位置),選擇 Registry(登錄檔)。
- 在 Registry 下方的文字方塊中,指定您的 Docker ID、儲存卷名稱和標籤。例如:
YOUR-USERNAME/jupyter-data:latest。 - 選取「Save」。
- 驗證您已將儲存卷匯出至 Docker Hub。
- 前往 Docker Hub。
- 選擇 我的 Hub > 儲存庫。
- 查看您儲存庫的 Last pushed(最後推送)時間。
其他使用者現在可以下載並匯入您的儲存卷。若要匯入儲存卷並將其與您的映像檔一起執行:
- 登入 Docker Desktop。
- 在 Docker Dashboard 中,選擇 Volumes(儲存卷)。
- 選擇 Create(建立)以建立新儲存卷。
- 指定新儲存卷的名稱。在此範例中,使用
jupyter-data-2。 - 選取「建立」。
- 在儲存卷列表中,選取名稱以選擇 jupyter-data-2 儲存卷。
- 選擇 Import(匯入)。
- 對於 Location(位置),選擇 Registry(登錄檔)。
- 在 Registry 下方的文字方塊中,指定您匯出儲存卷時的相同儲存庫名稱。例如:
YOUR-USERNAME/jupyter-data:latest。 - 選擇 Import(匯入)。
- 在終端機中,執行
docker run以使用匯入的儲存卷執行您的映像檔。請將YOUR-USER-NAME取代為您的 Docker ID。
$ docker run --rm -p 8889:8888 -v jupyter-data-2:/home/jovyan/work YOUR-USER-NAME/my-jupyter-image start-notebook.py --NotebookApp.token='my-token'
總結
在本指南中,您學習了如何利用 Docker 和 JupyterLab 建立可重現的資料科學環境,進而促進資料科學專案的開發與分享。這包括執行個人 JupyterLab 伺服器、使用必要工具和套件自訂環境,以及與其他資料科學家分享筆記本和環境。
相關資訊