Google ML Engine - 由于异常<httperror 403 =“”>

时间:2017-07-26 20:48:48

标签: google-bigquery google-cloud-pubsub google-cloud-ml-engine google-iam

我正在使用超参数调整在Google ML Engine上运行TensorFlow应用程序,并且我遇到了一些奇怪的身份验证问题。

我的数据和权限设置

我的教练代码支持两种获取模型输入数据的方法:

  1. 从BigQuery获取表格。
  2. .csv文件中读取。
  3. 对于我的IAM权限,我设置了两个成员:

    1. 我的用户帐号:

      • 分配给以下IAM角色:
        1. 项目所有者(roles/owner
        2. BigQuery Admin(roles/bigquery.admin
      • 我使用gcloud auth application-default login
      • 时会自动创建凭据
    2. 服务帐户:

      • 分配给以下IAM角色:
        1. BigQuery Admin(roles/bigquery.admin
        2. 存储管理员(roles/storage.admin
        3. PubSub管理员(roles/pubsub.admin
      • 当我在Google Cloud Platform界面中创建凭证时,凭据已下载到.json文件。
    3. 问题

      当我使用我的用户帐户凭据在Google ML引擎上运行我的教练代码并阅读.csv文件时,一切正常。

      但是,如果我尝试从BigQuery获取数据,则会收到以下错误:

          Forbidden: 403 Insufficient Permission (GET https://www.googleapis.com/bigquery/v2/projects/MY-PROJECT-ID/datasets/MY-DATASET-ID/tables/MY-TABLE-NAME)
      

      这就是我创建服务帐户的原因,但服务帐户有一组单独的问题。使用服务帐户时,我可以从.csv文件和BigQuery中读取,但在这两种情况下,我都会在每次试用结束时收到以下错误:

          Unable to log objective metric due to exception <HttpError 403 when requesting https://pubsub.googleapis.com/v1/projects/MY-PROJECT-ID/topics/ml_MY-JOB-ID:publish?alt=json returned "User not authorized to perform this action.">.
      

      这不会导致作业失败,但会阻止记录客观指标,因此超参数调整不会提供任何有用的输出。

      问题

      当我的IAM成员被分配到我非常确定的正确角色时,我不确定为什么我会收到这些权限错误。

      当我在本地运行时,我的教练代码适用于所有情况(尽管PubSub在本地运行时显然没有被使用),所以我很确定它不是代码中的错误。

      有什么建议吗?

      备注

      在尝试访问BigQuery时,我的服务帐户有一点与我的用户帐户出现相同的错误。我偶然发现的解决方案很奇怪。我决定从我的服务帐户中删除所有角色并再次添加它们,这解决了该成员的BigQuery权限问题。

1 个答案:

答案 0 :(得分:3)

感谢非常详细的问题。

为了解释此处发生的情况,在第一种情况下,Cloud ML Engine使用了一个内部服务帐户(以Cloud ML Service Agent角色添加到项目中的帐户)。由于某些内部安全考虑因素,该服务帐户被限制访问BigQuery,因此您看到了第一个403错误。

现在,当您使用.json凭据文件用自己的服务帐户替换计算机凭据时,该限制就消失了。但是,您的服务帐户没有对内部系统的所有访问权限,例如内部用于Hyperparameter调整机制的pubsub服务。因此第二种情况下的pubsub错误。

这个问题有几个可能的解决方案:

  • 在Cloud ML Engine方面,我们正在开发更好的BigQuery支持,尽管我们目前还没有ETA。

  • 只要您不使用超参数调整,使用自定义服务帐户的方法可能只是短期解决方案。然而,这显然是脆弱的,因为它取决于Cloud ML Engine中的实现细节,所以我不建议依赖这个长期的

  • 最后,考虑首先将数据从BigQuery导出到GCS,然后使用GCS读取训练数据。 Cloud ML Engine可以很好地支持这种情况。此外,与直接读取BigQuery相比,您将获得大型数据集的性能提升:TensorFlow中BigQueryReader的当前实现具有次优的性能特征,我们也在努力改进。