使用 JupyterLab 进行数据科学

Docker 和 JupyterLab 是两个强大的工具,可以增强您的数据科学工作流程。在本指南中,您将学习如何一起使用它们来创建和运行可重复的数据科学环境。本指南基于 使用 JupyterLab 和 Docker 进行 Supercharging 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 将下载并运行它。下载图像所需的时间会根据您的网络连接而有所不同。

镜像下载并运行后,您就可以访问容器了。要访问容器,请在 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 管理。

保存和访问笔记本

当您删除容器时,该容器中的所有数据都将被删除。要将笔记本保存在容器外部,您可以使用

运行带有卷的 JupterLab 容器

要使用卷启动容器,请打开终端并运行以下命令

$ 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 中的Iris 数据集示例。

  1. 打开 Web 浏览器并访问位于localhost:8889/lab?token=my-token 的JupyterLab 容器 。

  2. 启动器中的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. 在顶部菜单中,选择“文件”,然后选择“保存笔记本”

  8. 指定目录中的名称work以将笔记本保存到卷。例如,work/mynotebook.ipynb

  9. 选择重命名以保存笔记本。

笔记本现已保存在卷中。

在终端中,按ctrl+c停止容器。

现在,只要您使用该卷运行 Jupyter 容器,您就可以访问保存的笔记本。

当您运行新容器,然后再次运行数据绘图代码时,它将需要运行!pip install matplotlib scikit-learn并下载包。通过使用已安装的软件包创建自己的映像,您可以避免每次运行新容器时重新安装软件包。

自定义您的 JupyterLab 环境

您可以创建自己的 JupyterLab 环境并使用 Docker 将其构建为映像。通过构建自己的映像,您可以使用所需的包和工具自定义 JupyterLab 环境,并确保它在不同部署中保持一致和可重现。构建您自己的映像还可以更轻松地与其他人共享您的 JupyterLab 环境,或将其用作进一步开发的基础。

在 Dockerfile 中定义您的环境

在前面的将笔记本保存到卷中的 Iris 数据集示例中 ,每次运行新容器时,您都必须安装依赖项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。表示.当前目录是上下文,也就是说在镜像创建过程中可以使用该目录下的文件。

Images您可以通过查看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. 启动器中的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.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选项可确保重建您的映像,如果您对Dockefile.

要访问容器,请在 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 中心
    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 Volumes Backup & Share扩展。或者,您可以在 CLI 中 备份卷,然后 使用 ORAS CLI 推送它

  1. 安装卷备份和共享扩展。

    1. 打开 Docker 仪表板并选择Extensions
    2. 搜索Volumes Backup & Share
    3. 在搜索结果中,选择安装扩展。
  2. 在 Docker 仪表板中打开卷备份和共享扩展。

  3. 在jupyter-data卷旁边,选择导出卷图标。

  4. “导出内容”窗口中,选择“注册表”

  5. 在“注册表”下的文本框中,指定您的 Docker ID 和卷的名称。例如,YOUR-USERNAME/jupyter-data

  6. 选择导出

  7. 验证您是否将卷导出到 Docker Hub。

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

相关信息: