使用 Kubeflow Notebooks

Kubeflow Notebooks 为数据科学家提供了一个 Kubernetes 原生的 Jupyter 环境,用于开发、训练和部署机器学习模型。每个 notebook 服务器都作为 namespace 中一个独立的 Pod 运行,从而确保隔离性和专用资源。

注意:我们建议使用 Alauda AI Workbench,以获得更集成的体验,并享受资源类型、配置以及与其他组件更好的集成等附加功能。不过,如果你更偏好轻量级的设置,或者需要上游项目中的特定功能,也可以使用原生的 Kubeflow Notebooks。

概念

  • Notebook Server:在容器中运行的 JupyterLab 实例。
  • Custom Image:你可以使用标准的预构建镜像(例如包含 TensorFlow、PyTorch),也可以提供带有特定库的自定义 Docker 镜像。
  • Persistent Storage:默认情况下,notebook 服务器会挂载到 Persistent Volume Claims (PVCs),用于存储工作区目录(通常是 /home/jovyan)。这可以确保即使服务器重启或更新,你的 notebooks 和数据也会被保存。

创建 Notebook Server

  1. 访问监控面板: 导航到 Kubeflow 监控面板中的 Notebooks 部分。

  2. 新建 Notebook: 点击 New Notebook。请确保在监控面板顶部选择正确的 namespace,即你希望创建 notebook 服务器的位置。

  3. 配置服务器

    • Name:为你的 notebook 服务器输入一个唯一名称。
    • Image
      • Select Type:选择镜像类型,包括 JupyterLab、Visual Studio Code 或 RStudio。
      • Select Image:从预构建镜像列表中选择,或者通过提供 Docker 镜像 URL 指定自定义镜像。
    • CPU / RAM:根据工作负载分配 CPU 和 Memory 资源。可以先从较小的配置开始(例如 1 CPU、2GB RAM),如有需要再增加。
    • GPUs:如果你计划运行需要加速的深度学习训练或推理任务,请申请 GPUs(例如 NVIDIA)。
    • Workspace Volume:此卷会挂载到你的主目录(/home/jovyan)。你可以创建一个新卷(默认),或者挂载现有卷以访问之前的工作。
    • Data Volumes:(可选)附加其他现有 PVC,以便访问大型数据集,而无需将其复制到工作区。
    • Configurations:(可选)选择 PodDefaults(如果可用),以注入诸如 S3 凭据、Git 配置或环境变量等通用配置。
  4. 启动: 点击 Launch。系统将为该服务器进行 provisioning。等待状态显示变为 Running(绿色)。

连接到 Notebook

当服务器状态为 Running 后:

  1. 点击 Connect
  2. 这将会在新的浏览器标签页中打开 JupyterLab/VS Code/RStudio 界面。
  3. 现在你可以创建 Python 3 notebooks、打开终端,或者管理文件。

环境管理

安装 Python 包

虽然你可以将包安装到主目录中以便持久保存,但为了保证可重复性,最佳实践是使用自定义镜像。

在主目录中创建一个 "venv" 目录,并将包安装到其中:

python -m venv ~/venv
source ~/venv/bin/activate
python -m pip install transformers datasets

当你启动新的终端会话时,请记得激活虚拟环境,以访问已安装的包。

要在 Jupyter notebooks 中使用虚拟环境,可以安装 ipykernel 并创建一个新的 kernel:

source ~/venv/bin/activate
python -m pip install ipykernel
python -m ipykernel install --user --name=venv --display-name "Python (venv)"

然后,在你的 Jupyter notebook 中,可以选择 "Python (venv)" kernel 来使用安装在虚拟环境中的包。

虚拟环境会保存在你的主目录中,因此即使你停止并重新启动 notebook 服务器,它们仍然可用。不过,如果你需要在多个 notebook 服务器之间共享该环境,或者希望获得更好的可重复性,可以考虑构建一个预装所需包的自定义 Docker 镜像。

使用自定义镜像

对于生产环境或复杂依赖(例如系统库),请构建一个包含所有必需库的 Docker 镜像,并在创建 notebook 时将其用作你的 Custom Image。这样可以确保完全可重复。

管理配置(PodDefaults)

Kubeflow 使用 PodDefault 资源(在 UI 中通常标记为 Configurations)向 Notebooks 注入常见配置,例如环境变量、卷和卷挂载。这是安全提供 Object Storage 凭据且无需在 notebooks 中硬编码的标准方式。

创建 PodDefault

你可以通过应用 YAML manifest 来创建 PodDefault。

定义一个 PodDefault,用于选择带有特定标签的 pods。

apiVersion: kubeflow.org/v1alpha1
kind: PodDefault
metadata:
  name: add-gcp-secret
  namespace: MY_PROFILE_NAMESPACE
spec:
 selector:
  matchLabels:
    add-gcp-secret: "true"
 desc: "add gcp credential"
 volumeMounts:
 - name: secret-volume
   mountPath: /secret/gcp
 volumes:
 - name: secret-volume
   secret:
    secretName: gcp-secret

应用配置

创建新的 Notebook Server 时:

  1. 滚动到 Configurations 部分。
  2. 你将看到可用 PodDefaults 列表(例如 s3-access)。
  3. 勾选复选框以应用它。

这将自动把指定的环境变量或卷注入到你的 Notebook 容器中。

访问数据

使用挂载卷

如果你在创建过程中附加了数据卷(PVC),它将可在指定的挂载点中使用。

import pandas as pd

# Assuming you mounted a data volume at /home/jovyan/data
df = pd.read_csv('/home/jovyan/data/dataset.csv')
print(df.head())

使用对象存储

要访问 Object Storage 中的数据,请使用 boto3s3fs 等库。许多提供商都提供与 S3 兼容的 API,因此如果你的管理员已为凭据配置了 PodDefaults,那么诸如 AWS_ACCESS_KEY_ID 之类的环境变量通常会被预先填充。

import os
import s3fs
import pandas as pd

# Check if credentials are injected
print(os.getenv("AWS_S3_ENDPOINT"))

# Read directly from Object Storage
fs = s3fs.S3FileSystem(
    client_kwargs={'endpoint_url': os.getenv('AWS_S3_ENDPOINT')},
    key=os.getenv('AWS_ACCESS_KEY_ID'),
    secret=os.getenv('AWS_SECRET_ACCESS_KEY')
)

with fs.open('s3://my-bucket/data/train.csv') as f:
    df = pd.read_csv(f)

最佳实践

  • 停止未使用的服务器:即使处于空闲状态,notebook 服务器也会消耗集群资源(尤其是 GPUs)。当你不在主动工作时,请停止它们。
  • Git 集成:使用 JupyterLab 中的 Git 扩展(或终端)来对 notebooks 进行版本控制。避免将大型数据集存储在 Git 中。
  • 资源监控:监控你的资源使用情况。如果你的 kernel 经常崩溃(OOM),你可能需要停止服务器,并使用更高的 Memory 限制重新启动它。
  • 清理:如果旧 notebook 服务器及其关联的 PVC 不再需要,请定期删除它们。