使用 JupyterLab 進行資料科學

Docker 和 JupyterLab 是兩個強大的工具,可以增強您的資料科學工作流程。在本指南中,您將學習如何一起使用它們來建立和執行可重現的資料科學環境。本指南基於 使用 JupyterLab 和 Docker 加速 AI/ML 開發

在本指南中,您將學習如何

  • 在您的本機電腦上使用 JupyterLab 執行個人 Jupyter 伺服器
  • 自訂您的 JupyterLab 環境
  • 與其他資料科學家分享您的 JupyterLab 筆記本和環境

什麼是 JupyterLab?

JupyterLab 是一款以計算筆記本文檔概念建構的開源應用程式。它可以分享和執行程式碼、進行資料處理和視覺化,並提供一系列互動式功能來建立圖表。

為什麼要一起使用 Docker 和 JupyterLab?

通過結合 Docker 和 JupyterLab,您可以受益於這兩種工具的優勢,例如

  • 容器化確保所有部署中的 JupyterLab 環境一致,消除了相容性問題。
  • 容器化的 JupyterLab 通過消除手動環境設定的需要,簡化了分享和協作。
  • 容器為 JupyterLab 提供了可擴充性,支援工作負載分配和使用 Kubernetes 等平台進行高效的資源管理。

先決條件

要 mengikuti panduan ini,您必須安裝最新版本的 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':設定存取權杖,而不是使用隨機權杖。

如需更多詳細資訊,請參閱 Jupyter 伺服器選項docker run CLI 參考

如果這是您第一次執行映像檔,Docker 將會下載並執行它。下載映像檔所需的時間將取決於您的網路連接。

映像檔下載並執行後,您就可以存取容器。要存取容器,請在網路瀏覽器中導覽至 localhost:8889/lab?token=my-token

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

要存取系統上現有的筆記本,您可以使用 繫結掛載。開啟終端機並將目錄變更到您現有筆記本所在的位置。然後,根據您的作業系統執行以下指令。


$ 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 也有磁碟區,這是保存 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 的 鳶尾花數據集 範例。

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

  2. 在**啟動器**的**筆記本**下,選擇**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. 選擇播放按鈕以執行程式碼。您應該會看到鳶尾花數據集的散佈圖。

  7. 在頂部選單中,選擇**檔案**,然後選擇**儲存筆記本**。

  8. 在 `work` 目錄中指定一個名稱以將筆記本儲存到磁碟區。例如,`work/mynotebook.ipynb`。

  9. 選擇**重新命名**以儲存筆記本。

筆記本現在已儲存在磁碟區中。

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

現在,只要您使用磁碟區執行 Jupyter 容器,就可以存取已儲存的筆記本。

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

自訂您的 JupyterLab 環境

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

在 Dockerfile 中定義您的環境

在先前的 將筆記本儲存到磁碟區 的鳶尾花數據集範例中,您每次執行新容器時都必須安裝相依性 `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` 選項指定映像檔的名稱和標籤,在此範例中為 `my-jupyter-image`。 `.` 表示目前目錄是上下文,這表示該目錄中的檔案可以用於映像檔建立過程中。

您可以透過檢視 Docker Desktop 中的**映像檔**檢視,或在終端機中執行 `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. 在**啟動器**的**筆記本**下,選擇**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. 選擇播放按鈕以執行程式碼。您應該會看到鳶尾花數據集的散佈圖。

在終端機中,按下 `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分享您的映像檔

  1. 註冊Docker Hub

  • 執行以下 `docker push` 命令將映像檔推送到 Docker Hub。將 `YOUR-USER-NAME` 替換為您的 Docker ID。

  • 驗證您已將映像檔推送到 Docker Hub。

    1. 前往 Docker Hub
      $ 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 儀表板中,選擇**磁碟區**。
    3. 透過選擇名稱來選擇 **jupyter-data** 磁碟區。
    4. 選擇**匯出**索引標籤。
    5. 選擇**快速匯出**。
    6. 對於**位置**,選擇**登錄**。
    7. 在**登錄**下的文字方塊中,指定您的 Docker ID、磁碟區的名稱和標籤。例如,`YOUR-USERNAME/jupyter-data:latest`。
    8. 選擇**儲存**。
    9. 驗證您已將磁碟區匯出到 Docker Hub。
      1. 前往 Docker Hub
        $ 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 伺服器、使用必要的工具和套件自訂環境,以及與其他資料科學家共享筆記本和環境。

        相關資訊