使用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将下载并运行它。下载镜像所需的时间将取决于您的网络连接。

镜像下载并运行后,您可以访问容器。要访问容器,请在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 的鸢尾花数据集示例。

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

  2. 在**启动器**中,于**Notebook**下选择**Python 3**。

  3. 在notebook中,指定以下内容来安装必要的包。

    !pip install matplotlib scikit-learn
    
  4. 选择播放按钮运行代码。

  5. 在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"
    )
  6. 选择播放按钮运行代码。您应该会看到鸢尾花数据集的散点图。

  7. 在顶部菜单中,选择**文件**,然后选择**保存Notebook**。

  8. work目录中指定一个名称,将notebook保存到卷中。例如,work/mynotebook.ipynb

  9. 选择**重命名**以保存notebook。

notebook现在已保存到卷中。

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

现在,任何时候使用该卷运行Jupyter容器,您都可以访问已保存的notebook。

当您运行新的容器并再次运行数据绘图代码时,它需要运行!pip install matplotlib scikit-learn并下载包。您可以通过创建已安装这些包的镜像来避免每次运行新容器时都需要重新安装包。

自定义您的JupyterLab环境

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

在Dockerfile中定义您的环境

在前面来自将notebook保存到卷的鸢尾花数据集示例中,您必须在每次运行新容器时都安装依赖项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中的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

您现在可以使用这些包,而无需在notebook中安装它们。

  1. 在**启动器**中,于**Notebook**下选择**Python 3**。

  2. 在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"
    )
  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进行了更改,则这是必要的。

要访问容器,请在网页浏览器中导航到localhost:8889/lab?token=my-token

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

分享您的工作

通过共享您的镜像和notebook,您可以创建一个可移植且可复制的研究环境,其他数据科学家可以轻松访问和使用它。此过程不仅方便协作,而且还确保您的工作保存在可以运行而不会出现兼容性问题的环境中。

要共享您的镜像和数据,您将使用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-jupyter-image start-notebook.py --NotebookApp.token='my-token'

分享您的卷

此示例使用Docker Desktop图形用户界面。或者,在命令行界面中,您可以备份卷,然后使用ORAS CLI推送它

  1. 登录Docker Desktop。
  2. 在Docker Dashboard中,选择**卷**。
  3. 通过选择名称来选择**jupyter-data**卷。
  4. 选择**导出**选项卡。
  5. 选择**快速导出**。
  6. 对于**位置**,请选择**注册表**。
  7. 在**注册表**下的文本框中,指定您的Docker ID、卷的名称和标签。例如,YOUR-USERNAME/jupyter-data:latest
  8. 选择**保存**。
  9. 验证您是否已将卷导出到Docker Hub。
    1. 转到Docker Hub
    2. 选择**存储库**。
    3. 查看您的存储库的**上次推送**时间。

其他用户现在可以下载并导入您的卷。要导入卷,然后使用您的镜像运行它

  1. 登录Docker Desktop。
  2. 在Docker Dashboard中,选择**卷**。
  3. 选择**创建**以创建新卷。
  4. 为新卷指定一个名称。在本例中,使用jupyter-data-2
  5. 选择**创建**。
  6. 在卷列表中,通过选择名称来选择jupyter-data-2卷。
  7. 选择**导入**。
  8. 对于**位置**,请选择**注册表**。
  9. 注册表下的文本框中,指定与您将卷导出到的存储库相同的名称。例如,YOUR-USERNAME/jupyter-data:latest
  10. 选择**导入**。
  11. 在终端中,运行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服务器,使用必要的工具和包自定义环境,以及与其他数据科学家共享笔记本和环境。

相关信息