将 TFRecord 从 Python 输出到 Google 云存储

Output TFRecord to Google Cloud Storage from Python

我知道 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 说 "Anonymous caller does not have storage.objects.create access to my-bucket-name."

但是,在同一台机器上,如果我这样做 gsutil rsync -d r gs://my-bucket-name bucket-backup,它会正确地同步它,所以我已经使用 gcloud 正确地进行了身份验证。

如何授予 TFRecordWriter 写入 GCS 的权限?我现在打算只使用 Google 的 GCP python API,但我确信有一种方法可以单独使用 TF。

当你使用gsutil命令时,你使用的是Cloud SDK中配置的GCP用户(执行:gcloud config list查看)。 您的 python 脚本可能未在 GCP 中进行身份验证。

我相信有更好的方法来解决这个问题(抱歉,我对 TensorFlow 了解不多),但我可以看到 2 个解决方法来解决这个问题:

第一个选项 - 使用Cloud Fuse

Cloud Storage buckets挂载为文件系统

第二个选项 - 在本地写入并稍后移动。在这种方法中,您可以使用此代码:

# Service Account file
JSON_FILE_NAME = '<Service account json file>'


# Imports the Google Cloud client library
from google.cloud import storage

# Instantiates a client
storage_client = storage.Client.from_service_account_json(JSON_FILE_NAME)

#Example file (using the service account)
source_file_path = 'your file path'
destination_blob_name = 'name of file in gcs'
# The name for the new bucket
bucket_name = '<bucket_name>'


bucket = storage_client.get_bucket(bucket_name)

blob = bucket.blob(destination_blob_name)

blob.upload_from_filename(source_file_path)

print('File {} uploaded to {}.'.format(
    source_file_path,
    destination_blob_name))

在系统上设置凭据的常见策略是使用应用程序默认凭据 (ADC)。 ADC 是一种定位 Google 云服务帐户凭据的策略。

如果设置了环境变量 GOOGLE_APPLICATION_CREDENTIALS,ADC 将使用该变量指向的文件名作为服务帐户凭据。此文件是 Google 格式的 Json 云服务帐户凭据文件。以前的 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。

Google Cloud Application Default Credentials

请注意,导出命令在 jupyter notebook 中不起作用。 如果你使用的是 jupyter 笔记本,这应该可以工作

import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/json'