使用 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) 範例。

  1. 開啟網頁瀏覽器,前往 localhost:8889/lab?token=my-token 存取您的 JupyterLab 容器。

  2. Launcher(啟動器)中,於 Notebook 下方選擇 Python 3

  3. 在筆記本中,輸入以下內容以安裝必要的套件。

    !pip install matplotlib scikit-learn
    
  4. 點選播放按鈕以執行程式碼。

  5. 在筆記本中,輸入以下程式碼。

    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"
    )
  6. 點選播放按鈕以執行程式碼。您應該會看到 Iris 資料集的散佈圖。

  7. 在頂部選單中,選擇 File,然後選擇 Save Notebook

  8. work 目錄中指定一個名稱,將筆記本儲存到儲存卷。例如:work/mynotebook.ipynb

  9. 選擇 Rename 以儲存筆記本。

筆記本現在已儲存在儲存卷中。

在終端機中,按下 ctrl+c 停止容器。

現在,每當您使用該儲存卷執行 Jupyter 容器時,您都能存取到已儲存的筆記本。

當您執行新容器並再次執行資料繪圖程式碼時,它會需要執行 !pip install matplotlib scikit-learn 並下載這些套件。您可以透過建立包含已安裝套件的映像檔,來避免每次執行新容器時都要重新安裝套件。

自訂您的 JupyterLab 環境

您可以建立自己的 JupyterLab 環境,並使用 Docker 將其建置為映像檔。透過建置自己的映像檔,您可以利用所需的套件和工具自訂您的 JupyterLab 環境,並確保其在不同部署中保持一致且可重現。建置自己的映像檔還可以讓您更輕鬆地與他人分享您的 JupyterLab 環境,或將其作為進一步開發的基礎。

在 Dockerfile 中定義您的環境

在之前 將筆記本儲存到儲存卷 的 Iris 資料集範例中,您必須在每次執行新容器時安裝 matplotlibscikit-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

您現在可以使用這些套件,無需在筆記本中進行安裝。

  1. Launcher(啟動器)中,於 Notebook 下方選擇 Python 3

  2. 在筆記本中,輸入以下程式碼。

    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"
    )
  3. 點選播放按鈕以執行程式碼。您應該會看到 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 是一個基於雲端的登錄服務,讓您可以分享與發布容器映像檔。

分享您的映像檔

  1. 註冊 或登入 Docker Hub

  2. 重新命名您的映像檔,以便 Docker 知道要將其推送至哪個儲存庫。開啟終端機並執行以下 docker tag 指令。請將 YOUR-USER-NAME 取代為您的 Docker ID。

    $ docker tag my-jupyter-image YOUR-USER-NAME/my-jupyter-image
    
  3. 執行以下 docker push 指令將映像檔推送至 Docker Hub。請將 YOUR-USER-NAME 取代為您的 Docker ID。

    $ docker push YOUR-USER-NAME/my-jupyter-image
    
  4. 驗證您已將映像檔成功推送至 Docker Hub。

    1. 前往 Docker Hub
    2. 選擇 我的 Hub > 儲存庫
    3. 查看您儲存庫的 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 將其推送

  1. 登入 Docker Desktop。
  2. 在 Docker Dashboard 中,選擇 Volumes(儲存卷)。
  3. 選取名稱以選擇 jupyter-data 儲存卷。
  4. 選擇 Exports(匯出)索引標籤。
  5. 選擇 Quick export(快速匯出)。
  6. 對於 Location(位置),選擇 Registry(登錄檔)。
  7. Registry 下方的文字方塊中,指定您的 Docker ID、儲存卷名稱和標籤。例如:YOUR-USERNAME/jupyter-data:latest
  8. 選取「Save」。
  9. 驗證您已將儲存卷匯出至 Docker Hub。
  10. 前往 Docker Hub
  11. 選擇 我的 Hub > 儲存庫
  12. 查看您儲存庫的 Last pushed(最後推送)時間。

其他使用者現在可以下載並匯入您的儲存卷。若要匯入儲存卷並將其與您的映像檔一起執行:

  1. 登入 Docker Desktop。
  2. 在 Docker Dashboard 中,選擇 Volumes(儲存卷)。
  3. 選擇 Create(建立)以建立新儲存卷。
  4. 指定新儲存卷的名稱。在此範例中,使用 jupyter-data-2
  5. 選取「建立」。
  6. 在儲存卷列表中,選取名稱以選擇 jupyter-data-2 儲存卷。
  7. 選擇 Import(匯入)。
  8. 對於 Location(位置),選擇 Registry(登錄檔)。
  9. Registry 下方的文字方塊中,指定您匯出儲存卷時的相同儲存庫名稱。例如:YOUR-USERNAME/jupyter-data:latest
  10. 選擇 Import(匯入)。
  11. 在終端機中,執行 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 伺服器、使用必要工具和套件自訂環境,以及與其他資料科學家分享筆記本和環境。

相關資訊

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.