我知道 tf.python_io.TFRecordWriter
有 GCS 的概念,但它似乎没有写入权限。
如果我执行以下操作:
output_path = 'gs://my-bucket-name/{}/{}.tfrecord'.format(object_name, record_name)
writer = tf.python_io.TFRecordWriter(output_path)
# write to writer
writer.close()
然后我收到 401,提示“匿名调用者没有 storage.objects.create 对我的存储桶名称的访问权限。”
但是,在同一台机器上,如果我执行 gsutil rsync -d r gs://my-bucket-name bucket-backup
,它会正确地同步它,所以我已经使用 gcloud 正确地进行了身份验证.
如何授予 TFRecordWriter
写入 GCS 的权限?我现在打算只使用 Google 的 GCP python API,但我确信有一种方法可以单独使用 TF 来完成此操作。
最佳答案
在系统上设置凭证的常见策略是使用应用程序默认凭证 (ADC)。 ADC 是一种定位 Google 云服务帐户凭据的策略。
如果设置了环境变量 GOOGLE_APPLICATION_CREDENTIALS
,ADC 将使用该变量指向的文件名作为服务帐户凭据。此文件是 Json 格式的 Google 云服务帐户凭据文件。以前的 P12 (PFX) 证书已弃用。
如果未设置环境变量,如果应用程序在 Compute Engine、App Engine、Kubernetes Engine 或 Cloud Functions 上运行,则默认服务帐户将用于凭据。
如果前两个步骤未能找到有效凭证,ADC 将失败,并发生错误。
对于这个问题,ADC 找不到凭证,TensorFlow 写入 GCS 失败。
解决方法是设置环境变量GOOGLE_APPLICATION_CREDENTIALS
指向服务账号Json文件。
对于 Linux:
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
对于 Windows
set GOOGLE_APPLICATION_CREDENTIALS=C:\path\to\service-account.json
我写了一篇文章,更详细地介绍了 ADC。
关于python - 从 Python 将 TFRecord 输出到 Google Cloud Storage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54697451/