先讲一个我最近遇到的真实场景:客户反馈 Vertex AI Pipeline 突然读不到 GCS 桶里的数据,训练任务跑一个挂一个。我排查了半天,最后发现根因不在代码、不在服务账号,而是这个 Pipeline 所在的项目是某位离职同事用个人 Gmail 账号开通的。人一走,权限跟着自然人账号一起停用,整个项目立刻变成"半残废"状态。这事情听起来像段子,但在企业里一点都不少见。
所以今天想认真聊一个话题:Vertex AI 这种平台级服务,为什么必须放在 Google Cloud 的企业账号体系里跑。这里说的企业账号体系,不是单纯"注册个企业邮箱",而是指完整的组织节点(Organization Node)、文件夹、项目、IAM、结算账户和配额治理这套底座。缺了这套底座,模型实验阶段也许还能凑合,一旦进入多人协作、生产推理、成本管控和审计合规阶段,个人账号和散装项目一定会成为最大的隐患。这篇文章适合正在用个人账号跑 Vertex AI 的算法工程师,也适合准备把模型从实验推向生产的架构师和平台负责人。
1. Vertex AI 为什么离不开企业级资源边界
1.1 平台服务的每一层都在"吃"云资源权限
很多人以为 Vertex AI 就是一个 API,调一下就能训练模型。实际上,它是由一堆子服务组成的:自定义训练任务(CustomJob / TrainingPipeline)、Vertex AI Pipelines、模型注册表(Model Registry)、在线推理端点(Endpoint)、特征存储(Feature Store)、实验跟踪(Experiments)、TensorBoard 等等。
这些组件全部依赖同一个 Google Cloud 项目里的底层资源:GCS 桶(存数据集和模型产物)、Artifact Registry(存容器镜像)、Cloud Run / Cloud Functions(跑流水线组件)、VPC(网络隔离)、Secret Manager(存密钥)、KMS(加密密钥)。你跑一个训练任务,至少会触发这几件事:创建一批短暂计算资源、读写 GCS 中的训练数据、把日志和指标写入 Metadata Store、可能还要从 Artifact Registry 拉取自定义镜像。
任何一个环节的权限出了岔子,任务就卡住。我用生活类比解释一下:个人账号玩法像在自己家厨房做饭,锅碗瓢盆都是私人的;企业账号体系则是中央厨房,有独立的进货、仓储、消防和门禁制度。Vertex AI 这种"带客人来做年夜饭"的场景,没有中央厨房的规范和隔离,后厨一定会乱。单个模型实验可以容忍混乱,但十几个模型、几十条 Pipeline、多个团队共用一套训练平台时,没有企业级资源边界,互相踩脚是必然的。
1.2 个人账号的隐形成本:所有权、凭据与账单
个人账号系统跑 Vertex AI,表面上是"免费试用"或者"先跑通再说",实际上隐含三个大坑。
第一是所有权跟着自然人走。算法同学用自己的 Gmail 创建项目,公司既不拥有这个项目,也无法在员工离职后接管。更麻烦的是,项目里可能还躺着训练数据快照、未发布模型、客户相关特征数据。公司对这些资产没有任何控制权。
第二是凭据没有边界。个人账号一旦被攻破,或者 API Key 泄露,风险不局限于单个项目,还会波及其他绑定在同一账号下的 Google 服务。对于需要满足内部安全审计的企业来说,这属于不可接受的风险敞口。
第三是结算和身份混在一起。个人账号绑定的往往是个人信用卡,成本无法归集到部门,预算告警无从谈起。月底财务问"这个月 Vertex AI 花了多少钱",你只能拿一张个人账单去报销,这种体验我相信踩过的人都懂。
1.3 一个典型的翻车实例
再讲一个更常见的场景:某团队按照"快速开始"文档,顺手在个人项目里创建了 Endpoint,把模型发布成在线推理服务。三个月后负责部署的同学转岗,公司收回他的个人账号,所有端点全部 503,没有任何人能接管。要恢复的唯一办法是拿到该账号的登录权限——在企业环境里这种事基本做不到。
这类案例我几乎每次和客户聊都能听到一两例。所以我对团队的建议很直接:模型实验阶段,个人环境随便折腾;一旦涉及训练数据导入、多人协作、在线推理,立刻迁到企业账号体系下。别等到模型准备上线时再迁移,那是最贵的时间点。
2. 组织节点、文件夹、项目:账号体系的"三层骨架"
2.1 Organization Node 才是公司的"所有权根"
Google Cloud 企业账号体系最底层是 Organization Node(组织节点),一般通过 Cloud Identity 的专属域名创建。它代表的是"这家公司"本身,是资源层次结构的根节点。公司所有的项目都挂在这个根节点下面,员工离职后,项目的权限、数据、模型依然属于组织,不会被个人账号绑走。这才是"企业账号体系"和"个人账号散装项目"最本质的区别。
控制台里的资源层次大致是:
Organization Node 文件夹(部门 / 环境) 项目(产品 / 业务单元) 资源(GCS 桶、Vertex AI 模型、端点等)如果公司没有组织节点,所有项目都是"孤立项目(standalone project)",别人想从组织层面做统一安全策略也找不到抓手。Google Cloud 的很多企业级能力,比如 VPC Service Controls 的服务边界、组织级统一审计策略、跨项目资源搜索,都是建立在组织节点之上的。所以搭建账号体系第一步,就是要先拥有一个真实的组织节点,而不是急着开项目。
2.2 Folder 的三种常见用法
组织节点之下是文件夹(Folder),主要用来分层管理项目。我见过最常用的三种分法:
- 按环境分:dev / staging / prod 三个文件夹,然后通过 IAM 和组织策略严格控制生产文件夹的权限范围。
- 按业务线分:推荐团队、搜索团队、风控团队各一个文件夹,团队成员只在各自的文件夹内有权限。
- 按成本中心分:每个预算单位一个文件夹,账单归属一目了然,财务对账时省很多功夫。
在 Vertex AI 场景里,我倾向于至少把项目拆成"实验"和"生产"两类,分别挂到不同文件夹下。实验项目的权限可以放得松一些,生产项目则严格要求审批、审计和最低权限。文件夹的好处是权限和策略可以继承,你不需要在每个项目上重复配置。
2.3 项目:最小的权限和结算边界
在 Vertex AI 语境里,项目是最小隔离单元。我推荐的项目拆分方案是至少分成三类:
- 数据项目:存放原始数据、特征表、训练数据集,权限只开放给数据工程师和受控服务账号。
- 训练项目:跑训练 Job、Pipeline,输出模型工件到模型仓库。
- 推理项目:部署 Endpoint,做在线或批量预测,访问控制最严格。
这种拆法的好处很直接:训练项目出问题不会影响推理项目;数据项目的权限可以收紧到只有数据相关角色;成本也能精确分摊到各个业务方。如果所有东西堆在一个项目里,任何一个测试脚本误删数据,都可能导致生产推理服务遭殃。
2.4 组织策略:把"规则的锁"提前上好
账号体系建好之后,还要配置 Organization Policy 防止日后被绕过。我常用的几条包括:
iam.disableServiceAccountKeyCreation:禁止创建长期有效的 Service Account Key,强制团队改用短期凭证或 Workload Identity Federation。resourcemanager.limitProjectCreation:限定只有特定文件夹下的管理员可以创建新项目,避免"野项目"遍地开花。- 针对 Vertex AI 的 VPC-SC 服务边界策略,把 AI 平台的访问限制在企业内部网络范围内。
这些策略看起来和"训练一个模型"没有直接关系,但没有它们,账号体系会随着时间被各种"快捷操作"慢慢腐蚀。比如某个工程师为了本地调试图省事,创建了一把长期 Key,然后随手提交到 Git 仓库——这类问题不是靠自觉能解决的,只能靠组织策略从机制上禁止。
3. IAM:把"谁能建训练任务、谁能删端点"落到最小权限
3.1 Vertex AI 的原生角色已经切得够细
Google Cloud 的 IAM 里,Vertex AI 原生提供了多个预制角色,比如roles/aiplatform.admin、roles/aiplatform.user、roles/aiplatform.customCode、roles/aiplatform.viewer。这些角色的粒度基本能满足大多数团队的需求。
我常用的配套方式如下:
- 算法工程师:给
roles/aiplatform.user,可以创建和管理训练任务、发布模型、部署端点;再叠加 IAM Condition 限制只能操作 dev 或 staging 环境。 - 数据工程师:通常只给 Storage 对象查看/读写权限,让他们管理数据集,但不接触在线端点。
- 运维 / 安全人员:给 Vertex AI 只读角色,加上日志查看权限,方便排查问题但不修改配置。
如果你把 Enterprise 级别的需求带进来,光给roles/owner或者roles/editor肯定是不行的。前者权限过大,后者几乎等于裸奔。我见过太多团队为了省事直接给算法工程师绑了editor角色,结果一次误删操作把 Artifact Registry 里的镜像全清了,这种情况在 Vertex AI 生产环境里非常致命。
3.2 服务账号:任务的"临时身份"
Vertex AI 底层有两类服务账号,很多人分不清楚。第一类是 Google 托管的 Vertex AI Service Agent,形如service-PROJECT_NUMBER@gcp-sa-aiplatform.iam.gserviceaccount.com,由平台自动创建,负责访问项目内的默认资源,比如写日志、读元数据。这个服务账号原则上不需要用户手动干预,也不应该去改它的权限。
第二类是自定义服务账号(Custom Service Account),是你在训练任务或批量预测时通过--service-account参数或 SDK 显式指定的账号。这个账号决定了你的训练脚本到底能访问哪些数据桶、哪些 Artifact Registry 仓库。
实际经验里最坑的是:自定义服务账号权限少写一两个,任务不会在启动时报错,而是跑到一半才失败。比如训练脚本读取 GCS 文件时突然 403。所以我对团队的要求是:自定义服务账号从最小权限开始,先只给roles/storage.objectViewer列表和读取,确认任务能跑通,再按需逐步加权限。尽量不要一上来就给roles/storage.admin。
3.3 IAM Condition:把权限约束到"资源级别"
光有角色还不够。同一个角色绑定到所有资源,等于没有做隔离。好用的武器是 IAM Condition,也就是在权限绑定时加一个条件表达式。比如可以限定某个成员只能操作名称以manual-*开头的端点:
resource.name.startsWith("projects/_/locations/us-central1/endpoints/manual-")这样,即便某位工程师在某个角色下拥有管理端点的权限,他也只能操作符合条件的端点。对抗权限漂移、防止误删生产资源,这种方法比反复开会强调"大家小心一点"有效得多。
3.4 Service Account Key 的典型坑
我自己踩过的一个典型坑是:为了在本机跑 Vertex AI SDK,图方便创建了服务账号 JSON Key,然后不小心提交到了 Git 仓库。几天后安全团队提示,Key 已经被外部扫描器抓到,被迫紧急轮换所有相关权限。这个问题的教训不是"下次小心",而是从机制上禁用长期 Key。
正确做法是:
- 本机开发用
gcloud auth application-default login,让 SDK 使用你自己的身份去访问资源; - CI/CD 里用 Workload Identity Federation,把 GitHub Actions 或其他 CI 系统的身份直接映射到 Google Cloud 服务账号;
- 组织策略里打开
iam.disableServiceAccountKeyCreation,从源头禁止。
这一步做得好,账号体系的安全性才算是真正闭合。
4. 结算账户与配额:成本失控前的最后防线
4.1 Billing Account 与项目的关系
一个完整的企业账号体系里,所有项目都要挂到企业结算账户(Billing Account)上,而不是个人支付方式。这样 Vertex AI 的训练费用、端点费用、GCS 存储费用才能统一结算,也才能使用预算和告警功能。
预算告警的配置建议:按月设置固定预算,阈值设 50%、90%、100%;通知渠道至少有两个,比如邮件加 webhook。触发后自动发消息到内部群,相关人员当天就能看到。
我见过最多的一类成本失控事故是:实验做完了,Endpoint 忘记删除,每小时按节点计费跑了一整周,月底账单直接多出好几万。预算告警本身不能替你删资源,但它能让你在第二天早上就发现"成本异常上涨",及时止损。
4.2 Vertex AI 的配额体系
Vertex AI 相关的配额分散在多个维度:每分钟请求数(RPM)、并发训练任务数、每个区域的端点和大模型配额等。在控制台的 Quotas 页面搜索aiplatform.googleapis.com就能看到。
如果训练并发一上来就报Quota exceeded,通常不是代码 bug,而是配额没有提前申请。配额申请一般要求写明预估用量和持续需求,这时候企业账号体系的优势就体现出来了:项目归属清晰,历史消费记录客观,配额审批通过率会比个人账号高很多。如果你用的是个人账号,Google Cloud 很难判断你是真实企业,配额卡住的概率也大。
4.3 "此结算账户已关闭、暂停或信誉不佳"的排查链路
Google Cloud 用户在兑换赠金(credits)时经常会看到这样一段提示:"google cloud 兑换赠金显示此结算账户已关闭、暂停或信誉不佳。请在云控制台中查看。"我帮人排查过几次,基本链路如下:
- 确认当前登录账号有该结算账户的 Billing Account Viewer 或 Editor 权限。
- 进入 Cloud Console 的 Billing 页面,选择目标结算账户,查看 Overview 里的状态。状态一般有 Active、Closed、Suspended、Disabled。
- 如果是 Suspended,大概率是支付验证没过:账单地址不完整、绑定的银行卡被拒、或者赠金兑换触发了风控。按界面提示补全信息,必要时点 "Reactivate" 走重新验证流程。
- 如果显示"信誉不佳",通常是系统根据历史付款结果做的风险标记,比如之前有过支付失败或退款争议。处理方式是更新有效的支付方式,并按照官方支持流程提交验证材料。
- 等状态恢复为 Active 之后,再回到 Offers / Credits 页面重新 redeem。
这条提示也说明了另一个问题:企业账号体系里的结算账户要"提前养好"。正式账号做实名认证、绑定公司支付方式、开启预算告警,平时基本不会遇到这类临时状态异常。等到需要用赠金或提额度时才发现账户被冻结,才是最被动的。
4.4 成本治理的实用三板斧
除了预算告警,Vertex AI 的成本治理还有几个实用手段:
- 可容错的训练任务用 Spot 节点,价格远低于按需节点;
- 在线端点设置最小/最大副本数并开启自动扩缩容,避免常驻高配节点;
- 为模型版本设置生命周期保留策略,过期版本自动下线。
这些手段不需要很高的实施成本,但对账单金额的影响非常大。我把它们列为企业账号体系的一部分,是因为没有统一的账号和项目级治理,这些优化很难落地——你会不知道哪些任务用了 Spot,哪些模型版本还挂在线上浪费钱。
5. 从零落地的实操清单:照着这个顺序建,基本不会错
5.1 第一步:初始化组织节点
如果公司还没有 Cloud Identity,先注册一个专属域名并完成 DNS 验证,然后启用 Cloud Identity。组织节点创建完成后,用管理员账号执行:
gcloud organizations list会看到一个组织形式如organizations/123456789012的 ID,记录它,后续的资源创建和管理都基于这个组织节点。
这一步容易忽略的是:初始管理员账号必须是企业管理员,而不是某个员工的个人账号。否则后面组织节点的所有权又会落到个人头上,重蹈覆辙。
5.2 第二步:规划文件夹与项目命名
我建议的 Folder 层级是:公司名 / 环境(dev、staging、prod),或者公司名 / 业务线 / 环境。项目命名建议带前缀区分用途,比如:
gcloud projects create vertex-prod-001 \ --folder=FOLDER_ID \ --labels=team=ml,env=prod创建后绑定结算账户:
gcloud billing projects link vertex-prod-001 \ --billing-account=XXXXXX-XXXXXX-XXXXXX如果项目之前已经创建,但没有挂在组织节点下,可以使用gcloud projects update迁移到目标文件夹。迁移前一定要梳理现有 IAM 绑定,防止文件夹层级的继承策略和原有权限冲突,导致某些成员意外失去权限或获得过多权限。
5.3 第三步:创建预算和告警
在 Cloud Console 的 Billing 页面创建预算。建议用"固定金额"模式,比如每月 10 万;然后添加 50%、90%、100% 三档告警阈值。通知渠道配置邮件加 webhook,不要只设邮件——邮件可能被邮箱规则归档,webhook 直接推给内部群更保险。
如果你用 Terraform 或 Cloud Deployment Manager 管理基础设施,也可以用 Billing Budget API 自动化创建预算,这样每个新项目上线时都会自动带上告警配置,不依赖人工操作。
5.4 第四步:为 Vertex AI 建立服务账号链
这是账号体系里最关键的环节。先创建训练服务账号:
gcloud iam service-accounts create vertex-trainer \ --display-name="Vertex Trainer SA" \ --project=vertex-prod-001然后给服务账号绑定 Vertex AI 用户角色,以及访问数据项目桶的只读权限:
gcloud projects add-iam-policy-binding vertex-prod-001 \ --member="serviceAccount:vertex-trainer@vertex-prod-001.iam.gserviceaccount.com" \ --role="roles/aiplatform.user" gcloud projects add-iam-policy-binding <data-project-id> \ --member="serviceAccount:vertex-trainer@vertex-prod-001.iam.gserviceaccount.com" \ --role="roles/storage.objectViewer"最后在使用 Vertex AI SDK 初始化时指定这个服务账号,训练任务就会以该身份运行:
from google.cloud import aiplatform aiplatform.init( project="vertex-prod-001", location="us-central1", staging_bucket="gs://vertex-prod-artifacts", )在创建 CustomJob 或 PipelineJob 时,把service_account参数传进去即可。这段逻辑很多人容易漏的是:只给服务账号绑了 AI Platform 角色,却忘记给数据桶授权,导致任务能创建但跑起来立刻 403。
5.5 第五步:验证权限完全符合预期
权限体系配置完,不能直接说"应该没问题",一定要验证。我的做法是:
- 用最小权限账号实际跑一次空训练任务,观察是否能正常创建和退出。
- 尝试读取没有授权的另一个数据桶,确认返回 403,说明权限边界确实生效。
- 让安全团队导出项目的 IAM Policy,确认没有人持有
roles/owner或roles/editor这类过宽角色。
这一步很容易被跳过,但恰恰是最有价值的。权限系统不是写完就算完,验证阶段往往能发现一堆配置错误。
6. 那些在 Production 阶段才暴露的隐患与我的应对
6.1 服务 Agent 和自定义服务账号不要搞混
我见过不少人为了"安全加固",把 Vertex AI Service Agent 的权限改得很低,结果底层组件无法写 Artifact Registry,训练任务报出莫名其妙的 internal error,排查起来非常痛苦。反过来,也有人图省事,所有任务共用一个高权限自定义服务账号,一旦账号泄露,整个项目的数据都暴露了。
正确做法是:Service Agent 是平台组件,默认权限不要乱动;自定义服务账号严格按任务最小化。两者职责分离,训练脚本要什么数据,就给对应的自定义服务账号加什么权限,而不是一味加宽。
6.2 审计日志要提前开启,别等出事再补
Vertex AI 涉及的训练数据和模型工件敏感度很高,建议至少开启 Cloud Audit Logs 里的 Admin Activity 和 Data Access 日志。Admin Activity 默认开启,但 Data Access(特别是对象读取)默认不记录,需要在组织层面单独配置。
很多企业是在合规审核前才想起来开审计日志,结果发现历史操作记录完全缺失,审核无法通过。正确做法是在账号体系搭建的中期就把日志导出到独立的日志存储项目,长期保留。等到真正需要追溯某个模型版本是谁部署的、谁删除过数据集时,你才能拿出可信记录。
6.3 CMEK 与 VPC-SC 是"完整支撑"的另一半
企业账号体系搭建好以后,权限、配额、结算都到位了,还差两块:加密和网络边界。Google Cloud 上可以用 CMEK 给 Vertex AI 的训练数据和模型工件做企业自带密钥加密,密钥由 Cloud KMS 统一管理。VPC Service Controls 则把 Vertex AI 的访问限制在指定服务边界内,防止数据通过公网或非授权路径流出。
很多企业一开始不上这两套方案,等合规审核过不了才补,补的时候牵一发动全身。从账号体系落地第一天就规划好 CMEK 的密钥环和 VPC-SC 的服务边界,后边会少很多麻烦。
6.4 我在实际操作中最大的体会
跑了这么多 Vertex AI 落地项目,最深的体感是:模型训练代码往往不是瓶颈,账号体系、权限边界、结算配额治理才是最容易被低估的部分。哪家团队先把企业账号体系搭对了,后面模型上线基本是水到渠成;哪家贪图方便用个人账号跑,后面一定会在最忙的时候被权限问题卡住。
如果你正在评估 Vertex AI,我的建议很简单:先别急着写训练代码,花两三天把 Organization、Folder、Project、IAM、Billing 这五层铺好,再开始跑第一个 Pipeline。前期多花的时间,会在后面每一次上线、每一次排障、每一次财务对账时加倍还给你。