Google ML 引擎 - 由于异常 <HttpError 403>,无法记录 objective 指标

Google ML Engine - Unable to log objective metric due to exception <HttpError 403>

我正在 运行在 Google 机器学习引擎上使用超参数调整来构建一个 TensorFlow 应用程序,我 运行 遇到了一些奇怪的身份验证问题。

我的数据和权限设置

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

  1. 正在从 BigQuery 获取 table。
  2. 正在读取 .csv 文件。

对于我的 IAM 权限,我设置了两个成员:

  1. 我的用户帐号:

    • 分配给以下 IAM 角色:
      1. 项目负责人(roles/owner
      2. BigQuery 管理员(roles/bigquery.admin
    • 凭据是在我使用 gcloud auth application-default login
    • 时自动创建的
  2. 一个服务账号:

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

问题

当我 运行 我的培训师代码在 Google 机器学习引擎上使用我的用户帐户凭据并从 .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.">.

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

问题

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

当我在本地 运行 时,我的培训师代码在任何情况下都有效(尽管在本地 运行 时显然没有使用 PubSub),所以我相当确定这不是错误代码。

有什么建议吗?

备注

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

感谢您提出非常详细的问题。

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

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

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

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

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

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