Google ML 引擎 - 由于异常 <HttpError 403>,无法记录 objective 指标
Google ML Engine - Unable to log objective metric due to exception <HttpError 403>
我正在 运行在 Google 机器学习引擎上使用超参数调整来构建一个 TensorFlow 应用程序,我 运行 遇到了一些奇怪的身份验证问题。
我的数据和权限设置
我的训练代码支持两种获取模型输入数据的方法:
- 正在从 BigQuery 获取 table。
- 正在读取
.csv
文件。
对于我的 IAM 权限,我设置了两个成员:
我的用户帐号:
- 分配给以下 IAM 角色:
- 项目负责人(
roles/owner
)
- BigQuery 管理员(
roles/bigquery.admin
)
- 凭据是在我使用
gcloud auth application-default login
时自动创建的
一个服务账号:
- 分配给以下 IAM 角色:
- BigQuery 管理员(
roles/bigquery.admin
)
- 存储管理员(
roles/storage.admin
)
- 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
的当前实现具有次优的性能特征,我们也在努力改进。
我正在 运行在 Google 机器学习引擎上使用超参数调整来构建一个 TensorFlow 应用程序,我 运行 遇到了一些奇怪的身份验证问题。
我的数据和权限设置
我的训练代码支持两种获取模型输入数据的方法:
- 正在从 BigQuery 获取 table。
- 正在读取
.csv
文件。
对于我的 IAM 权限,我设置了两个成员:
我的用户帐号:
- 分配给以下 IAM 角色:
- 项目负责人(
roles/owner
) - BigQuery 管理员(
roles/bigquery.admin
)
- 项目负责人(
- 凭据是在我使用
gcloud auth application-default login
时自动创建的
- 分配给以下 IAM 角色:
一个服务账号:
- 分配给以下 IAM 角色:
- BigQuery 管理员(
roles/bigquery.admin
) - 存储管理员(
roles/storage.admin
) - PubSub 管理员 (
roles/pubsub.admin
)
- BigQuery 管理员(
- 当我在 Google Cloud Platform 界面中创建凭证时,凭证已下载到
.json
文件。
- 分配给以下 IAM 角色:
问题
当我 运行 我的培训师代码在 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
的当前实现具有次优的性能特征,我们也在努力改进。