使用 JupyterLab 进行数据科学
Docker 和 JupyterLab 是两个强大的工具,可以增强你的数据科学工作流程。在本指南中,你将学习如何将它们结合使用来创建和运行可重现的数据科学环境。本指南基于 使用 JupyterLab 和 Docker 为 AI/ML 开发提速。
在本指南中,你将学习如何
- 在本地机器上使用 JupyterLab 运行个人 Jupyter Server
- 自定义 JupyterLab 环境
- 与其他数据科学家分享你的 JupyterLab Notebook 和环境
什么是 JupyterLab?
JupyterLab 是一款开源应用,围绕计算型 Notebook 文档的概念构建。它支持代码共享和执行、数据处理、可视化,并提供一系列交互功能来创建图表。
为什么要同时使用 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 Server Options 和 docker run CLI 参考。
如果这是你第一次运行该镜像,Docker 将下载并运行它。下载镜像所需的时间取决于你的网络连接。
镜像下载并运行后,你可以访问容器。要访问容器,请在 Web 浏览器中导航到 localhost:8889/lab?token=my-token。
要停止容器,在终端中按 ctrl
+c
。
要访问系统上的现有 Notebook,可以使用 绑定挂载(bind mount)。打开终端并切换到现有 Notebook 所在的目录。然后,根据你的操作系统运行以下命令。
$ 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
,并且你只能访问或保存 Notebook 到容器中的这个目录。
现在你可以访问 localhost:8889/lab?token=my-token 并打开绑定挂载目录中包含的 Notebook。
要停止容器,在终端中按 ctrl
+c
。
Docker 也有 数据卷(volumes),这是持久化 Docker 容器生成和使用的数据的首选机制。绑定挂载依赖于主机的文件目录结构和操作系统,而数据卷完全由 Docker 管理。
保存和访问 Notebook
当你移除一个容器时,容器中的所有数据都会被删除。要在容器外部保存 Notebook,可以使用 数据卷。
使用数据卷运行 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。Notebook 现在可以保存到数据卷中,即使容器被删除也能访问到。
将 Notebook 保存到数据卷
在本例中,你将使用 scikit-learn 中的 Iris Dataset(鸢尾花数据集)示例。
打开 Web 浏览器并访问你的 JupyterLab 容器,地址为 localhost:8889/lab?token=my-token。
在 Launcher 中,在 Notebook 下选择 Python 3。
在 Notebook 中,指定以下内容以安装必要的软件包。
!pip install matplotlib scikit-learn
选择播放按钮运行代码。
在 Notebook 中,指定以下代码。
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" )
选择播放按钮运行代码。你应该会看到一个鸢尾花数据集的散点图。
在顶部菜单中,选择 File,然后选择 Save Notebook。
在
work
目录中指定一个名称,将 Notebook 保存到数据卷。例如,work/mynotebook.ipynb
。选择 Rename 保存 Notebook。
Notebook 现在已保存到数据卷中。
在终端中,按 ctrl
+c
停止容器。
现在,无论何时使用该数据卷运行 Jupyter 容器,你都可以访问已保存的 Notebook。
当你运行一个新的容器,并再次运行数据绘图代码时,它需要运行 !pip install matplotlib scikit-learn
并下载这些包。你可以通过创建自己的镜像,并将软件包预先安装好,来避免每次运行新容器时都重新安装软件包。
自定义 JupyterLab 环境
你可以使用 Docker 创建自己的 JupyterLab 环境并将其构建成一个镜像。通过构建自己的镜像,你可以使用所需的软件包和工具自定义 JupyterLab 环境,并确保它在不同部署中的一致性和可重现性。构建自己的镜像还可以让你更轻松地与他人分享 JupyterLab 环境,或将其用作进一步开发的基础。
在 Dockerfile 中定义你的环境
在之前 将 Notebook 保存到数据卷 的鸢尾花数据集示例中,每次运行新容器时,你都必须安装依赖项 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 .
-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'
要访问容器,请在 Web 浏览器中导航到 localhost:8889/lab?token=my-token。
现在你无需在 Notebook 中安装即可使用这些软件包。
在 Launcher 中,在 Notebook 下选择 Python 3。
在 Notebook 中,指定以下代码。
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
,这是必要的。
要访问容器,请在 Web 浏览器中导航到 localhost:8889/lab?token=my-token。
在终端中,按 ctrl
+c
停止容器。
分享你的工作
通过分享你的镜像和 Notebook,你创建了一个可移植且可复制的研究环境,其他数据科学家可以轻松访问和使用它。这个过程不仅促进了协作,还确保了你的工作在一个可以运行且没有兼容性问题的环境中得到保存。
要分享你的镜像和数据,你需要使用 Docker Hub。Docker Hub 是一个基于云的注册服务,允许你分享和分发容器镜像。
分享你的镜像
注册 或登录 Docker Hub。
重命名你的镜像,以便 Docker 知道要将其推送到哪个仓库(repository)。打开终端并运行以下
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。
- 选择 我的 Hub > 仓库。
- 查看你的仓库的上次推送时间。
其他用户现在可以使用 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 Dashboard 中,选择 数据卷。
- 通过选择名称来选择 jupyter-data 数据卷。
- 选择 导出 选项卡。
- 选择 快速导出。
- 对于 位置,选择 注册表。
- 在 注册表 下方的文本框中,指定你的 Docker ID、数据卷名称和标签。例如,
YOUR-USERNAME/jupyter-data:latest
。 - 选择 保存。
- 验证你已将数据卷导出到 Docker Hub。
- 前往 Docker Hub。
- 选择 我的 Hub > 仓库。
- 查看你的仓库的上次推送时间。
其他用户现在可以下载并导入你的数据卷。要导入数据卷并使用你的镜像运行它
- 登录 Docker Desktop。
- 在 Docker Dashboard 中,选择 数据卷。
- 选择 创建 以创建一个新的数据卷。
- 为新数据卷指定一个名称。在本例中,使用
jupyter-data-2
。 - 选择 创建。
- 在数据卷列表中,通过选择名称来选择 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 服务器、使用必要的工具和软件包自定义环境,以及与其他数据科学家分享 Notebook 和环境。
相关信息