JupyterLab 上的資料科學

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

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

  • 在您的本地機器上執行帶有 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 將下載並執行它。下載映象所需的時間會根據您的網路連線而有所不同。

映象下載並執行後,您就可以訪問容器。要訪問容器,請在網路瀏覽器中導航到 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。現在,筆記本可以儲存到卷中,即使容器被刪除,也可以訪問它們。

將筆記本儲存到卷中

在本例中,您將使用 Iris 資料集 來自 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 環境

您可以建立自己的 JupyterLab 環境並使用 Docker 將其構建到映象中。透過構建自己的映象,您可以使用所需的軟體包和工具自定義 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 中的映象檢視或在終端中執行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'

要訪問容器,請在 Web 瀏覽器中導航到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進行了更改時是必需的。

要訪問容器,請在 Web 瀏覽器中導航到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. 選擇**儲存庫**。
    3. 檢視儲存庫的**最後推送**時間。

其他使用者現在可以使用docker run命令下載和執行您的映象。他們需要將YOUR-USER-NAME替換為您的 Docker ID。

$ docker run --rm -p 8889:8888 YOUR-USER-NAME/my-jupyer-image start-notebook.py --NotebookApp.token='my-token'

共享您的卷

此示例使用 Docker Desktop卷備份和共享擴充套件。或者,在 CLI 中,您可以備份卷,然後使用 ORAS CLI 推送卷

  1. 安裝卷備份和共享擴充套件。

    1. 開啟 Docker 儀表板並選擇**擴充套件**。
    2. 搜尋卷備份和共享
    3. 在搜尋結果中,選擇擴充套件的**安裝**。
  2. 在 Docker 儀表板中開啟**卷備份和共享**擴充套件。

  3. 在**jupyter-data**卷旁邊,選擇**匯出卷**圖示。

  4. 在**匯出內容**視窗中,選擇**登錄檔**。

  5. 在**登錄檔**下的文字框中,指定您的 Docker ID 和卷的名稱。例如,YOUR-USERNAME/jupyter-data

  6. 選擇**匯出**。

  7. 驗證您是否已將卷匯出到 Docker Hub。

    1. 轉到Docker Hub
    2. 選擇**儲存庫**。
    3. 檢視儲存庫的**最後推送**時間。

其他使用者現在可以下載和匯入您的卷。要匯入卷,然後使用您的映象執行它

  1. 在卷備份和共享擴充套件中,選擇**匯入到新卷**。

  2. 在**匯入到新卷**視窗中,選擇**登錄檔**。

  3. 在**登錄檔**下的文字框中,指定您的 Docker ID 和卷的儲存庫名稱。例如,YOUR-USERNAME/jupyter-data

  4. 在**卷名稱**中,指定要賦予卷的名稱。此示例使用jupyter-data作為名稱。

  5. 選擇**匯入**。

  6. 在終端中,執行docker run以使用匯入的卷執行您的映象。將YOUR-USER-NAME替換為您的 Docker ID。

    $ docker run --rm -p 8889:8888 -v jupyter-data:/home/jovyan/work YOUR-USER-NAME/my-jupyter-image start-notebook.py --NotebookApp.token='my-token'
    

總結

在本指南中,您學習瞭如何利用 Docker 和 JupyterLab 建立可重複的資料科學環境,從而促進資料科學專案的開發和共享。這包括執行個人 JupyterLab 伺服器、使用必要的工具和軟體包自定義環境以及與其他資料科學家共享筆記本和環境。

相關資訊