我见过太多这样的场景:Notebook 里把模型调准确率调到了 92%,看起来顺风顺水,结果要把这套东西交付出去的时候,对方拿到的还是一个 .ipynb 文件,里面依赖没写清楚、路径是写死的、跑到某个 cell 还要手动点一下按钮。诚然,Notebook 做探索性实验是无敌的,但一旦数据每天更新、团队要协作、结果要可复现,你就需要一条真正的数据流水线。
这篇文章的思路很简单:以 GCP 为底座,讲讲怎么从 Notebook 里的“能跑”,一步步走到流水线里的“能自动跑、能重复跑、能追踪产物”。适合那些已经在 Jupyter/Notebook 里调过模型,但还没碰过 Cloud Composer、Vertex AI Pipelines 这类编排工具的人。我会把中间最容易被忽视的几个坑也一并放在里面,这些坑我基本都踩过。
1. 先在 Notebook 里跑通模型,再回答“要不要上流水线”
1.1 为什么我宁愿把机器学习实验放在 GCP,而不是本地
最早我做实验其实是本地跑的,公司配的机器还算不错,但一旦要跑稍微大一点的数据,CPU 直接打满,风扇声跟飞机起飞一样,更别提同时开好几个实验的时候了。后来我切到 GCP 上的 Notebook 实例,一个很现实的变化是:实验环境跟数据放到了同一个地方。
GCP 里数据一般在 Cloud Storage(GCS)或者 BigQuery 里,你本地写代码去连这些服务,网络延迟是一回事,权限配置又是一回事。把 Notebook 放在 GCP 上的优势在于,它跟 GCS、BigQuery 在同一个内网,你只需要在服务账号上配好 IAM 权限,读写数据的耗时能少一个量级。另外 GPU 是按分钟计费的,训练完把实例停掉,成本可控,不用一直供着一台吃灰的机器。
对于个人学习和中小型项目来说,n1-standard-4 这类 CPU 实例基本够用,先用 CPU 跑通逻辑,再临时加 GPU 跑大模型,是比较正常的节奏。我自己一般先开一个不带 GPU 的实例做数据探索和代码调试,确认没问题再单独开一个带 GPU 的实例做训练,省钱的习惯就是从这里养成的。
1.2 Notebook 实例创建:一份不会出错的初始化清单
GCP 的 AI Platform Notebooks 现在已经整合到 Vertex AI Workbench 里了,界面创建实例的流程很傻瓜,选区域、选机型、选镜像,点创建。但有几个细节值得单独说一下:
- 区域尽量跟你的数据所在区域一致。数据在
us-central1,实例开在asia-east1,跨区域访问 GCS 虽然不报错,但会产生网络费用和延迟,没必要。 - 镜像建议选带预装 PyTorch 或 TensorFlow 的 Deep Learning 镜像,省去后面装框架的时间。镜像选完之后,系统会默认创建一个
jupyter用户,Python 环境很干净。 - 重点来了:很多人在创建实例之后会用终端手动
pip install一堆包,觉得环境已经装好了。但实际上一旦实例停止再启动,部分系统盘环境会被重置,你手动装的东西可能会丢。更稳妥的做法是写一个启动脚本,在实例每次启动时自动执行安装,或者干脆用 conda 建一个独立环境来装依赖。
我给你一个可以直接用的启动脚本示例:
bash复制#!/bin/bash
set -e
# 这里放到 Notebook 实例的“自定义启动脚本”里
source /opt/conda/etc/profile.d/conda.sh
conda activate base
pip install --quiet \
pandas-gbq \
scikit-learn \
lightgbm \
google-cloud-storage \
gcsfs \
kfp==2.*
这段脚本做的事情很简单:每次实例启动时,确保这些常用包是存在的。看似多此一举,却能在“实例重启后环境丢失”这种问题上给你省下大量排查时间。
1.3 什么时候才真正需要数据流水线
这是很现实的问题。不是所有机器学习项目都需要上流水线,有些人只是拿 Notebook 做一次性的分析,那确实没必要折腾。但如果你遇到下面这些情况之一,就应该认真考虑流水线了:
- 数据每天或每周更新,模型需要定期重跑;
- 训练数据来源不止一个,需要先合并、清洗再建模;
- 有队友需要复现你的实验,但他不可能把你 Notebok 里的 cell 一个个手工执行;
- 你需要向别人证明某次模型指标是哪个数据集、哪份代码、哪个超参数跑出来的;
- 训练完成之后还要自动部署模型或者自动产出报告。
当你发现自己开始做“每天早上手动跑一遍同一个 Notebook”这种毫无技术含量的事情,就该转向流水线了。流水线真正要替代的,不是模型训练本身,而是那些重复、易错、靠人来保证的中间流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Notebook 实验环境的几个坑:从 IAM 到依赖冲突
2.1 权限问题:为什么你连 GCS 里的文件都读不到
Notebook 实例创建好之后,默认会带一个 Compute Engine 默认服务账号,多数情况下访问 GCS 是没问题的。但有个常见翻车现场:你在 GCS 的某个 bucket 里只给某个子账号开了权限,Notebook 用的是默认服务账号,两边对不上,读取数据就 403。
最好的做法是单独创建一个服务于机器学习任务的服务账号,而不是用默认账号一把梭。比如:
bash复制gcloud iam service-accounts create ml-notebook-sa \
--display-name="ML Notebook SA"
gcloud projects add-iam-policy-binding my-project \
--member="serviceAccount:ml-notebook-sa@my-project.iam.gserviceaccount.com" \
--role="roles/storage.objectVie
