使用 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 的 鸢尾花数据集 示例。
打开一个网页浏览器,访问您的 JupyterLab 容器,地址为 localhost:8889/lab?token=my-token。
在 启动器 中,在 笔记本 下,选择 Python 3。
在笔记本中,指定以下内容以安装必要的软件包。
!pip install matplotlib scikit-learn选择播放按钮以运行代码。
在笔记本中,指定以下代码。
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" )选择播放按钮以运行代码。您应该会看到鸢尾花数据集的散点图。
在顶部菜单中,选择 文件,然后选择 保存笔记本。
在
work目录中指定一个名称以将笔记本保存到数据卷中。例如,work/mynotebook.ipynb。选择 重命名 以保存笔记本。
笔记本现在已保存在数据卷中。
在终端中,按 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 中查看 `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。
您现在可以在笔记本中使用这些软件包,而无需安装它们。
在 启动器 中,在 笔记本 下,选择 Python 3。
在笔记本中,指定以下代码。
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" )选择播放按钮以运行代码。您应该会看到鸢尾花数据集的散点图。
在终端中,按 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 是一个基于云的注册表服务,允许您分享和分发容器镜像。
分享您的镜像
注册或登录Docker Hub。
重命名您的镜像,以便 Docker 知道要将其推送到哪个仓库。打开终端并运行以下 `docker tag` 命令。将 `YOUR-USER-NAME` 替换为您的 Docker ID。
$ docker tag my-jupyter-image YOUR-USER-NAME/my-jupyter-image运行以下 `docker push` 命令将镜像推送到 Docker Hub。将 `YOUR-USER-NAME` 替换为您的 Docker ID。
$ docker push YOUR-USER-NAME/my-jupyter-image验证您已将镜像推送到 Docker Hub。
- 前往 Docker Hub。
- 选择 My Hub > Repositories。
- 查看您仓库的 上次推送 时间。
其他用户现在可以使用 `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 推送它。
- 登录到 Docker Desktop。
- 在 Docker 仪表板中,选择 数据卷。
- 通过选择名称来选择 jupyter-data 数据卷。
- 选择 导出 标签页。
- 选择 快速导出。
- 对于 位置,选择 注册表。
- 在 注册表 下的文本框中,指定您的 Docker ID、数据卷的名称和一个标签。例如,`YOUR-USERNAME/jupyter-data:latest`。
- 选择保存。
- 验证您已将数据卷导出到 Docker Hub。
- 前往 Docker Hub。
- 选择 My Hub > Repositories。
- 查看您仓库的 上次推送 时间。
其他用户现在可以下载并导入您的数据卷。要导入数据卷然后与您的镜像一起运行它:
- 登录到 Docker Desktop。
- 在 Docker 仪表板中,选择 数据卷。
- 选择 创建 以创建一个新的数据卷。
- 为新卷指定一个名称。在此示例中,使用 `jupyter-data-2`。
- 选择 Create (创建)。
- 在数据卷列表中,通过选择名称来选择 jupyter-data-2 数据卷。
- 选择 导入。
- 对于 位置,选择 注册表。
- 在 注册表 下的文本框中,指定与您导出数据卷的仓库相同的名称。例如,`YOUR-USERNAME/jupyter-data:latest`。
- 选择 导入。
- 在终端中,运行 `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 服务器、使用必要的工具和包自定义环境,以及与其他数据科学家共享笔记本和环境。
相关信息