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 服务器、使用必要的工具和软件包自定义环境以及与其他数据科学家共享笔记本和环境。

相关信息