使用 Kubeflow Notebooks

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

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

概念

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

创建 Notebook Server

  1. 访问监控面板: 进入 Kubeflow 监控面板中的 Notebooks 部分。

  2. 新建 Notebook: 点击 New Notebook。确保在监控面板顶部选择了您想创建 notebook 服务器的正确命名空间。

  3. 配置服务器

    • 名称:输入 notebook 服务器的唯一名称。
    • 镜像
      • 选择类型:选择镜像类型,包括 JupyterLab、Visual Studio Code 或 RStudio。
      • 选择镜像:从预构建镜像列表中选择,或通过提供 Docker 镜像 URL 指定自定义镜像。
    • CPU / 内存:根据工作负载分配 CPU 和内存资源。建议从小配置开始(例如 1 CPU,2GB 内存),如有需要再增加。
    • GPU:如果计划运行需要加速的深度学习训练或推理任务,可申请 GPU(例如 NVIDIA)。
    • 工作区卷:此卷挂载到您的主目录(/home/jovyan)。可以创建新卷(默认)或挂载已有卷以访问之前的工作内容。
    • 数据卷:(可选)挂载额外的已有 PVC,以访问大型数据集而无需复制到工作区。
    • 配置:(可选)选择 PodDefaults(如果可用)以注入通用配置,如 S3 凭证、Git 配置或环境变量。
  4. 启动: 点击 Launch。服务器将被创建。等待状态显示为 Running(绿色)。

连接到 Notebook

服务器状态为 Running 后:

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

环境管理

安装 Python 包

虽然可以在主目录安装包以保持持久性,但最佳实践是使用自定义镜像以确保可复现性。

在主目录创建一个 "venv" 目录并安装包:

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

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

要在 Jupyter 笔记本中使用虚拟环境,可以安装 ipykernel 并创建新内核:

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

然后在 Jupyter 笔记本中选择 "Python (venv)" 内核,即可使用虚拟环境中安装的包。

虚拟环境保存在您的主目录中,即使停止并重启 notebook 服务器也会保留。但如果需要在多个 notebook 服务器间共享环境或提高可复现性,建议构建包含所需包的自定义 Docker 镜像。

使用自定义镜像

对于生产环境或复杂依赖(如系统库),构建包含所有所需库的 Docker 镜像,并在创建 notebook 时作为 Custom Image 使用。这确保了精确的可复现性。

管理配置(PodDefaults)

Kubeflow 使用 PodDefault 资源(UI 中通常标记为 Configurations)向 Notebooks 注入通用配置,如环境变量、卷和卷挂载。这是安全提供对象存储(S3、MinIO)凭证的标准方式,避免在笔记本中硬编码凭证。

创建 PodDefault

您可以通过应用 YAML 清单创建 PodDefault。

定义一个选择带有特定标签的 Pod 的 PodDefault

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

# 假设您将数据卷挂载在 /home/jovyan/data
df = pd.read_csv('/home/jovyan/data/dataset.csv')
print(df.head())

使用对象存储(S3 / MinIO)

要访问 S3 兼容存储中的数据,可使用 boto3s3fs 等库。如果管理员已配置 PodDefaults 以提供凭证,环境变量(如 AWS_ACCESS_KEY_ID)会被预先注入。

import os
import s3fs
import pandas as pd

# 检查凭证是否注入
print(os.getenv("AWS_S3_ENDPOINT"))

# 直接从 S3 读取
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 服务器即使空闲也会消耗集群资源(尤其是 GPU)。不使用时请停止它们。
  • Git 集成:使用 JupyterLab 中的 Git 扩展(或终端)进行笔记本版本控制。避免将大型数据集存储在 Git 中。
  • 资源监控:监控资源使用情况。如果内核频繁崩溃(OOM),可能需要停止服务器并以更大内存限制重启。
  • 清理:定期删除不再需要的旧 notebook 服务器及其关联的 PVC。