GCP AI Platform训练脚本部署新模型版本时的权限问题
你遇到的这个403问题,核心原因其实是训练实例默认使用的是Compute Engine默认服务账号,而不是你配置了权限的Cloud ML Engine Service Agent,而且这个默认账号的认证范围(scopes)不足以完成模型部署操作。下面是几个实用的解决方案:
1. 提交训练作业时显式指定服务账号与权限范围
这是最直接的解决方式——在提交AI Platform训练作业的命令里,强制指定使用你配置好权限的Cloud ML Engine Service Agent,同时赋予足够的OAuth scopes:
gcloud ai-platform jobs submit training YOUR_JOB_NAME \ --service-account=service-xxxxxxxxx@cloud-ml.google.com.iam.gserviceaccount.com \ --scopes=https://www.googleapis.com/auth/cloud-platform
这里--scopes用cloud-platform是因为它覆盖了AI Platform部署所需的所有权限,如果你需要更细粒度的控制,也可以换成https://www.googleapis.com/auth/ml.admin。这样训练实例就会用你指定的服务账号运行,而不是默认的Compute Engine账号。
2. 为训练实例的默认服务账号补充权限
如果你不想修改训练作业的提交参数,可以找到训练实例实际使用的Compute Engine默认服务账号(格式一般是[你的项目编号]-compute@developer.gserviceaccount.com),给它添加模型部署所需的权限:
- 推荐添加
roles/ml.admin角色(覆盖所有AI Platform管理操作),或者更细的roles/ml.modelCreator+roles/ml.versionManager组合权限 - 同时要确保训练作业提交时的scopes包含
https://www.googleapis.com/auth/ml.admin或者cloud-platform,否则即使权限够了,认证范围不足还是会报错
3. 在训练脚本内显式加载服务账号密钥
如果上面两种方式都不适合你的场景,你可以在训练脚本里直接加载服务账号的JSON密钥,强制用指定账号完成部署:
- 先把你的Cloud ML Engine Service Agent的JSON密钥上传到GCS存储桶
- 训练脚本启动时,把密钥文件下载到本地路径
- 在调用部署代码(不管是
discovery.build还是gcloud命令)前,设置环境变量:
import os os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/tmp/your-service-account-key.json'
这样代码会忽略训练实例的默认账号,直接用你指定的服务账号进行认证。
4. 检查训练与模型的区域一致性
有时候跨区域调用也会触发权限校验问题,确保你的训练作业所在的区域和要部署的模型区域完全一致,避免因为跨区域导致的权限限制。
另外你提到discovery.build('ml', 'v1')._http.credentials._service_account返回default,这正好验证了训练实例用的是默认服务账号,不是你配置的那个Cloud ML Engine Service Agent,所以调整训练作业的服务账号参数应该能最快解决问题。
内容的提问来源于stack exchange,提问作者shuaiyuancn

