将 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。
请注意,导出命令在 jupyter notebook 中不起作用。
如果你使用的是 jupyter 笔记本,这应该可以工作
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/json'
我知道 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。
请注意,导出命令在 jupyter notebook 中不起作用。 如果你使用的是 jupyter 笔记本,这应该可以工作
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/json'