Вывести TFRecord в Google Cloud Storage из Python - PullRequest
0 голосов
/ 14 февраля 2019

Я знаю, 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 Python API GCP, но я уверен, что есть способ сделать это, используя только TF.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

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

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

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

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

По этим вопросам АЦП не смог найти учетные данные, и запись 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

0 голосов
/ 14 февраля 2019

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

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

Первый вариант - Монтирование Облачное хранилище корзин в качестве файловых систем с использованием Облачный предохранитель

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

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