Вывести TFRecord в Google Cloud Storage из 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, в котором говорится: "У анонимного абонента нет доступа к storage.objects.create для my-bucket-name".

Тем не менее, на той же машине, если я делаю gsutil rsync -d r gs://my-bucket-name bucket-backup, он правильно синхронизирует его, поэтому я правильно аутентифицировался с помощью gcloud.

Как я могу дать TFRecordWriter разрешения на запись в GCS? Я собираюсь сейчас использовать Google GCP python API, но я уверен, что есть способ сделать это, используя только TF.

3 ответа

Решение

Распространенной стратегией настройки учетных данных в системах является использование учетных данных приложения по умолчанию (ADC). ADC - это стратегия поиска учетных данных учетной записи облачной службы Google.

Если переменная среды GOOGLE_APPLICATION_CREDENTIALS установлено, ADC будет использовать имя файла, на которое указывает переменная для учетных данных учетной записи службы. Этот файл представляет собой файл учетных данных учетной записи облачной службы Google в формате Json. Предыдущие сертификаты P12 (PFX) устарели.

Если переменная среды не задана, учетная запись службы по умолчанию используется для учетных данных, если приложение работает на Compute Engine, App Engine, Kubernetes Engine или облачных функциях.

Если на предыдущих двух шагах не удалось найти действительные учетные данные, произойдет сбой АЦП и возникнет ошибка.

По этим вопросам 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

Когда вы используете команду gsutil, вы используете пользователя GCP, настроенного в Cloud SDK (выполните:gcloud config list видеть). Вероятно, ваш скрипт на python не аутентифицирован в GCP.

Я полагаю, что есть лучший подход для решения этой проблемы (извините, у меня нет особых знаний о TensorFlow), но я вижу 2 обходных пути, чтобы это исправить:

Первый вариант - монтирование контейнеров Cloud Storage в качестве файловых систем с использованием Cloud Fuse

Второй вариант - писать локально и двигаться позже. В этом подходе вы можете использовать этот код:

# 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))

Обратите внимание, что команда экспорта не будет работать в записной книжке jupyter. если вы используете ноутбук jupyter, это должно сработать

      import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/json'
Другие вопросы по тегам