使用 JupyterLab 進行資料科學

Docker 和 JupyterLab 是兩個強大的工具,可以增強您的資料科學工作流程。在本指南中,您將學習如何將它們結合使用,以建立和執行可復現的資料科學環境。本指南基於 Supercharging AI/ML Development with JupyterLab and Docker

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

  • 在您的本地機器上執行一個帶有 JupyterLab 的個人 Jupyter 伺服器
  • 自定義您的 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':設定訪問令牌,而不是使用隨機令牌。

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

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

映象下載並執行後,您可以訪問該容器。要訪問容器,請在 Web 瀏覽器中導航至 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 目錄。

要訪問容器,請在 Web 瀏覽器中導航到 localhost:8889/lab?token=my-token。現在可以將筆記本儲存到資料卷中,並且即使容器被刪除,這些筆記本也將是可訪問的。

將筆記本儲存到資料卷

在此示例中,您將使用 scikit-learn 的 鳶尾花資料集 示例。

  1. 開啟一個網頁瀏覽器,訪問您的 JupyterLab 容器,地址為 localhost:8889/lab?token=my-token

  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 中定義您的環境

在前面的將筆記本儲存到資料卷中的鳶尾花資料集示例中,您每次執行新容器時都必須安裝依賴項 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` 選項指定了映象的名稱和標籤,在本例中是 `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. 啟動器 中,在 筆記本 下,選擇 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。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. 選擇 My Hub > Repositories
    3. 檢視您倉庫的 上次推送 時間。

其他使用者現在可以使用 `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 儀表板中,選擇 資料卷
  3. 透過選擇名稱來選擇 jupyter-data 資料卷。
  4. 選擇 匯出 標籤頁。
  5. 選擇 快速匯出
  6. 對於 位置,選擇 登錄檔
  7. 登錄檔 下的文字框中,指定您的 Docker ID、資料卷的名稱和一個標籤。例如,`YOUR-USERNAME/jupyter-data:latest`。
  8. 選擇儲存
  9. 驗證您已將資料卷匯出到 Docker Hub。
    1. 前往 Docker Hub
    2. 選擇 My Hub > Repositories
    3. 檢視您倉庫的 上次推送 時間。

其他使用者現在可以下載並匯入您的資料卷。要匯入資料卷然後與您的映象一起執行它:

  1. 登入到 Docker Desktop。
  2. 在 Docker 儀表板中,選擇 資料卷
  3. 選擇 建立 以建立一個新的資料卷。
  4. 為新卷指定一個名稱。在此示例中,使用 `jupyter-data-2`。
  5. 選擇 Create (建立)。
  6. 在資料卷列表中,透過選擇名稱來選擇 jupyter-data-2 資料卷。
  7. 選擇 匯入
  8. 對於 位置,選擇 登錄檔
  9. 登錄檔 下的文字框中,指定與您匯出資料卷的倉庫相同的名稱。例如,`YOUR-USERNAME/jupyter-data:latest`。
  10. 選擇 匯入
  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 伺服器、使用必要的工具和包自定義環境,以及與其他資料科學家共享筆記本和環境。

相關資訊