我正在尝试使用gcloud提交一份要在ML-Engine中进行培训的工作,但是遇到我无法弄清的服务帐户权限错误。该模型代码存在于我作为bash脚本一部分运行gcloud ml-engine jobs submit
的Compute Engine实例上。我已经在VM实例上创建了一个用于gcloud身份验证的服务帐户(ai-platform-developer @ .... iam.gserviceaccount.com),并为作业和模型数据创建了存储桶。服务帐户已被授予存储桶的存储对象查看器角色和存储对象创建者角色,并且虚拟机和存储桶均属于同一项目。
当我尝试按this tutorial提交工作时,将执行以下操作:
time_stamp=`date +"%Y%m%d_%H%M"`
job_name='ObjectDetection_'${time_stamp}
gsutil cp object_detection/samples/configs/faster_rcnn_resnet50.config
gs://[bucket-name]/training_configs/faster-rcnn-resnet50.${job_name}.config
gcloud ml-engine jobs submit training ${job_name} \
--project [project-name] \
--runtime-version 1.12 \
--job-dir=gs://[bucket-name]/jobs/${job_name} \
--packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz,/tmp/pycocotools/pycocotools-2.0.tar.gz \
--module-name object_detection.model_main \
--region us-central1 \
--config object_detection/training-config.yml \
-- \
--model_dir=gs://[bucket-name]/output/${job_name}} \
--pipeline_config_path=gs://[bucket-name]/training_configs/faster-rcnn-resnet50.${job_name}.config
其中[bucket-name]和[project-name]是上面创建的存储桶的占位符,其中包含该存储桶和VM的项目。
配置文件已成功上传到存储桶,我可以确认其在云控制台中存在。但是,作业提交失败,出现以下错误:
ERROR: (gcloud.ml-engine.jobs.submit.training) User [ai-platform-developer@....iam.gserviceaccount.com] does not have permission to access project [project-name] (or it may not exist): Field: job_dir Error: You don't have the permission to access the provided directory 'gs://[bucket-name]/jobs/ObjectDetection_20190709_2001'
- '@type': type.googleapis.com/google.rpc.BadRequest
fieldViolations:
- description: You don't have the permission to access the provided directory 'gs://[bucket-name]/jobs/ObjectDetection_20190709_2001'
field: job_dir
如果我在云控制台中查看,则由--packages
指定的文件存在于该位置,并且我已确保为服务帐户ai-platform-developer@....iam.gserviceaccount.com
授予了存储对象查看器和存储对象创建者角色存储桶,其中设置了存储桶级别权限。确保已激活服务帐户并将其设置为默认帐户后,我也可以运行
gsutil ls gs://[bucket-name]/jobs/ObjectDetection_20190709_2001
成功返回文件夹的内容,而没有权限错误。在该项目中,存在一个托管服务帐户service-[project-number]@cloud-ml.google.com.iam.gserviceaccount.com
,并且我还向该帐户授予了存储桶中的Storage Object Viewer和Storage Object Creator角色。
要确认此VM能够提交作业,我可以将gcloud用户切换到我的个人帐户,脚本运行并提交作业,没有任何错误。但是,由于它存在于共享VM中,因此我想依靠服务帐户授权而不是我自己的用户帐户。
答案 0 :(得分:2)
我有一个完全相同的错误,也有类似的问题。
我发现解决这些错误的最简单方法是转到“日志记录”并搜索“ PERMISSION DENIED”文本。
在我的情况下,服务帐户缺少权限“ storage.buckets.get”。然后,您将需要找到具有此权限的角色。您可以从IAM-> Roles执行此操作。在该视图中,您可以按权限名称过滤角色。事实证明,只有以下角色具有所需的权限:
我向存储桶中的服务帐户添加了“存储旧版存储桶作家”角色,然后能够提交作业。
答案 1 :(得分:0)
您是否尝试查看Compute Engine范围?
关闭实例,编辑Cloud API access scopes
并将其更改为:
Allow full access to all Cloud APIs