我正在使用超参数调整在Google ML Engine上运行TensorFlow应用程序,并且我遇到了一些奇怪的身份验证问题。
我的教练代码支持两种获取模型输入数据的方法:
.csv
文件中读取。对于我的IAM权限,我设置了两个成员:
我的用户帐号:
roles/owner
)roles/bigquery.admin
)gcloud auth application-default login
服务帐户:
roles/bigquery.admin
)roles/storage.admin
)roles/pubsub.admin
).json
文件。当我使用我的用户帐户凭据在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权限问题。
答案 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
的当前实现具有次优的性能特征,我们也在努力改进。