【问题标题】:403 Forbidden when creating a new version in Google Cloud Platform ML Engine在 Google Cloud Platform ML Engine 中创建新版本时出现 403 Forbidden
【发布时间】:2019-05-15 19:40:57
【问题描述】:

使用来自 AppEngine flex 的 Python Google API 客户端库,我正在调用 GCP ML Engine API。 当我列出不同的模型、获取它们的默认版本和所有“只读”操作时,它工作正常,但是当我尝试为模型创建新版本时,它不起作用。我收到“拒绝访问模型”的 403 禁止错误。

我使用服务帐户拨打电话。在 IAM 中,我的服务帐号拥有“ML Engine 管理员”权限。

这就是我打电话的方式

from google.oauth2.service_account import Credentials

credentials = Credentials.from_service_account_file(PATH_TO_MY_JSON)
ml_client = discovery.build(u'ml', u'v1', credentials=credentials)

body = {
        u"name": version_name,
        u"description": description,
        u"runtimeVersion": current_default_version.get(u"runtimeVersion"),
        u"framework": current_default_version.get(u"framework"),
        u"pythonVersion": current_default_version.get(u"pythonVersion"),
        u"deploymentUri": deployment_uri
    }
request = ml_client.projects().models().versions().create(parent=get_query_name(model_name), body=body)
request.execute()

错误

 <HttpError 403 when requesting https://ml.googleapis.com/v1/projects/XXX/models/YYY/versions?alt=json returned "Access to model denied.">

它与服务帐户有关,因为当我在 Cloud Shell 中运行此代码并在没有凭据 (ml_client = discovery.build(u'ml', u'v1')) 的情况下构建我的 ml_client 时,它可以正常工作。

【问题讨论】:

  • 你是gcloud auth logingcloud auth application-default login 吗?
  • 不确定这会如何影响已部署的版本,但无论如何,我没有
  • 可能是服务帐号没有读取桶的权限。即使帐户是 Cloud ML 管理员,部署/创建模型也需要存储权限,因为 Cloud ML 需要读取存储在此类存储桶中的训练文件。您能否确认您是否按照文档中的说明设置了the storage permissions

标签: google-cloud-platform google-cloud-ml google-app-engine-python app-engine-flexible


【解决方案1】:

我的服务帐户 IAM 角色:

  • 机器学习引擎开发人员
  • 存储对象查看器

对我来说,如果我通过 UI 创建模型资源,我似乎无法从 python 客户端库创建模型版本。但是,如果我通过 python 客户端创建了一个模型资源,那么创建一个模型版本就可以了。

credentials = Credentials.from_service_account_file('./service_account.json')
ml = discovery.build('ml', 'v1', credentials=credentials)
request_dict = {
   'name': 'model_resource_name',
   'description': 'your_model_description'}

project_id = 'projects/{}'.format('YOUR_PROJECT_ID')
request = ml.projects().models().create(parent=project_id, body=request_dict)
request.execute()

body = {
   u"name": "test_version",
   u"description": "description",
   u"runtimeVersion": "1.13",
   u"framework": "TENSORFLOW",
   u"pythonVersion": "3.5",
   u"deploymentUri": "gs://BUCKET_ID/directory_path_to_your_model/"
        }

request = ml.projects().models().versions().create(
    parent='projects/{}/models/{}'.format(
          'YOUR_PROJECT_ID', 
          'model_resource'), 
    body=body)

response = request.execute()

仍在调查为什么通过 UI 创建模型资源不允许 python 客户端创建模型版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多