Схема файловой системы "[локальная]" не реализована в Google Colab TPU

Я использую среду выполнения TPU в Google Colab, но испытываю проблемы с чтением файлов (не уверен). Я инициализировал TPU, используя:

import tensorflow as tf
import os
import tensorflow_datasets as tfds

resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
tf.config.experimental_connect_to_cluster(resolver)
# This is the TPU initialization code that has to be at the beginning.
tf.tpu.experimental.initialize_tpu_system(resolver)
print("All devices: ", tf.config.list_logical_devices('TPU'))

У меня много изображений в папке в хранилище Google Colab (например, '/content/train2017/000000000009.jpg'). Я запускаю следующий код:

import tensorflow as tf
def load_image(image_path):
    img = tf.io.read_file(image_path)
    img = tf.image.decode_jpeg(img, channels=3)
    img = tf.image.resize(img, (299, 299))
    img = tf.keras.applications.inception_v3.preprocess_input(img)
    return img, image_path
load_image('/content/train2017/000000000009.jpg')

Но я получаю следующую ошибку:

---------------------------------------------------------------------------
UnimplementedError                        Traceback (most recent call last)
<ipython-input-33-a7fbb45f3b76> in <module>()
----> 1 load_image('/content/train2017/000000000009.jpg')

5 frames
<ipython-input-7-862c73d29b96> in load_image(image_path)
      2     img = tf.io.read_file(image_path)
      3     img = tf.image.decode_jpeg(img, channels=3)
----> 4     img = tf.image.resize(img, (299, 299))
      5     img = tf.keras.applications.inception_v3.preprocess_input(img)
      6     return img, image_path

/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/image_ops_impl.py in resize_images_v2(images, size, method, preserve_aspect_ratio, antialias, name)
   1515       preserve_aspect_ratio=preserve_aspect_ratio,
   1516       name=name,
-> 1517       skip_resize_if_same=False)
   1518 
   1519 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/image_ops_impl.py in _resize_images_common(images, resizer_fn, size, preserve_aspect_ratio, name, skip_resize_if_same)
   1183   with ops.name_scope(name, 'resize', [images, size]):
   1184     images = ops.convert_to_tensor(images, name='images')
-> 1185     if images.get_shape().ndims is None:
   1186       raise ValueError('\'images\' contains no shape.')
   1187     # TODO(shlens): Migrate this functionality to the underlying Op's.

/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py in get_shape(self)
   1071   def get_shape(self):
   1072     """Alias of Tensor.shape."""
-> 1073     return self.shape
   1074 
   1075   def _shape_as_list(self):

/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py in shape(self)
   1065         self._tensor_shape = tensor_shape.TensorShape(self._shape_tuple())
   1066       except core._NotOkStatusException as e:
-> 1067         six.raise_from(core._status_to_exception(e.code, e.message), None)
   1068 
   1069     return self._tensor_shape

/usr/local/lib/python3.6/dist-packages/six.py in raise_from(value, from_value)

UnimplementedError: File system scheme '[local]' not implemented (file: '/content/train2017/000000000009.jpg')

Как мне решить эту проблему? Нашел что-то вроде ведра gs, но оно платное. Есть ли другой способ решить эту проблему?


person Rahul Vishwakarma    schedule 13.07.2020    source источник


Ответы (2)


Для загрузки файла из локального файла при использовании TPU - читайте их как обычный python file.read () (не tf.io). В твоем случае:

def load_image(image_path):
    with open(image_path, "rb") as local_file: # <= change here
      img = local_file.read()
    img = tf.image.decode_jpeg(img, channels=3)
    img = tf.image.resize(img, (299, 299))
    img = tf.keras.applications.inception_v3.preprocess_input(img)
    return img, image_path
load_image('/content/train2017/000000000009.jpg')
person Andrey    schedule 29.07.2020
comment
Что здесь "размер_порции"? - person Rahul Vishwakarma; 29.07.2020
comment
размер в байтах (например, если весь файл не может быть прочитан в память). Я обновил ответ соответственно - person Andrey; 29.07.2020
comment
На самом деле у меня есть папка примерно из 8100 изображений, и я хочу передавать ее партиями для обучения модели. - person Rahul Vishwakarma; 29.07.2020
comment
Итак, как мне сказать ему прочитать папку. Извините, я не получаю ваш код. - person Rahul Vishwakarma; 29.07.2020
comment
Мое изображение встроено в TFRecords, и я получаю ту же ошибку. Итак, как мне это исправить? - person Prateek Jain; 13.02.2021

Облачные TPU могут получать доступ только к данным в GCS, поскольку зарегистрирована только файловая система GCS. См.: https://cloud.google.com/tpu/docs/troubleshooting#cannot_use_local_filesystem для более подробной информации.

Хотя для контрольных точек, начиная с версии TF 2.3, вы должны иметь возможность использовать параметр experimental_io_device='/job:localhost' (https://www.tensorflow.org/api_docs/python/tf/train/CheckpointOptions) для хранения / загрузки контрольных точек в среду выполнения Colab и из нее. Даже с этим API вам нужно будет загружать данные из GCS.

Пример:

checkpoint = tf.train.Checkpoint(model=model)
local_device_option = tf.train.CheckpointOptions(experimental_io_device="/job:localhost")
checkpoint.write(checkpoint_path, options=local_device_option)
person jysohn    schedule 13.07.2020