TRANSIENT_ERROR для TPU в Google Colab - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь запустить модель lrcn keras на TPU с tenorflow 2.0. Модель и генератор работают на CPU / GPU, но я включил их для справки. Я также инициализирую TPU, и он виден, и все выглядит хорошо, за исключением случаев, когда я запускаю .fit ():

def frame_generator(self, batch_size, train_test, data_type):
    """Return a generator that we can use to train on. There are
    a couple different things we can return:
    data_type: 'features', 'images'
    """
    # Get the right dataset for the generator.
    train, test = self.split_train_test()
    data = train if train_test == 'train' else test

    #print("Creating %s generator with %d samples." % (train_test, len(data)))

    while 1:
        X, y = [], []

        # Generate batch_size samples.
        for _ in range(batch_size):
            if random.random() < .5:
                # real
                while True:
                    # Get a random sample.
                    sample = random.choice(data)

                    # Get the sequence from disk.
                    (_x,_y) = self.get_extracted_sequence(data_type, sample)

                    if _y==[0,1]:
                        break
            else:
                 # fake
                while True:
                    # Get a random sample.
                    sample = random.choice(data)

                    # Get the sequence from disk.
                    (_x,_y) = self.get_extracted_sequence(data_type, sample)

                    if _y==[1,0]:
                        break

            if _x is None:
                raise ValueError("Can't find sequence. Did you generate them?", sample)

            X.append(_x)
            y.append(_y)

        #yield [np.array(X), np.array(y)], np.array(y)
        yield np.array(X), np.array(y)

train_generator = data.frame_generator(batch_size, 'train', 'images')
val_generator = data.frame_generator(batch_size, 'test', 'images')

optimizer = Adam(lr=1e-5)

with tpu_strategy.scope():
  model = lrcn()
  model.add(tf.keras.layers.Dense(2, activation='softmax'))

  model.compile(loss='binary_crossentropy',
      optimizer=optimizer,
      metrics=['accuracy', tf.compat.v1.losses.log_loss])
  model.summary() 

train_data = tf.data.Dataset.from_generator(lambda:next(train_generator),
                                        (tf.float32, tf.int64),
                                        ([4, 32,299,299,3], [4,2])     
                                      )

val_data = tf.data.Dataset.from_generator(lambda:next(val_generator),
                                        (tf.float32, tf.int64),
                                      ([4, 32,299,299,3], [4,2]) 
                                      )


model.fit(x=train_data, steps_per_epoch=train_steps, validation_steps=test_steps,
      validation_data=val_data,
        epochs=30,
        callbacks=callbacks,
        verbose=1)

На model.fit я получаю:

Поезд на 6421.0 шагах, проверить на 1605.0 шагах

Эпоха 1/30

UnavailableError Traceback (последний последний вызов) в () 15 эпох = 30, 16 обратных вызовов = обратных вызовов, ---> 17 подробных = 1)

11 кадров /usr/local/lib/python3.6/dist-packages/six.py в повышение_значения (значение, из_значения)

UnavailableError: канал находится в состоянии TRANSIENT_FAILURE Дополнительная GRP C информация об ошибке: {"созданный": "@ 1584561754.347859160", "описание": "канал находится в состоянии TRANSIENT_FAILURE", "файл": "external / grpc / src / core / ext / filters / client_channel / client_channel. cc "," file_line ": 2294," grpc_status ": 14} [Op: __inference_distributed_function_24182 канал находится в состоянии TRANSIENT_FAILURE", "file": "external / grpc / src / core / ext / filters / client_channel / client_channel. cc "," file_line ": 2294," grpc_status ": 14} [Op: __ inference_distributed_function_1057 7]

Есть идеи как исправить? Похоже, это на стороне сети Google.

ОБНОВЛЕНИЕ:

Часть решения заключается в том, что вам не следует устанавливать tenorflow2.1 с pip в блокноте colab - вы должны использовать его в своей собственной ячейке, прежде чем " import tenorflow "

%tensorflow_version 2.x

Это изменит версию TPU с 1.15 на> = 2.1

Теперь, когда я запускаю ноутбук, я получаю больше деталей:

Поезд для 6902.0 шаги, подтвердите 1725.0 шагов Эпоха 1/30

1/6902 [.............................. ] - ETA: 20: 04: 55

NotFoundError Traceback (последний последний вызов) /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_v2. py в on_epoch (self, epoch, mode) 766 try: -> 767 yield epoch_logs 768 окончательно:

18 кадров NotFoundError: {{function_node __inference_distributed_function_20824}} нет зарегистрированного 'PyFun c' OpKernel для 'CPU 'устройства, совместимые с узлом {{node PyFunc}}. Зарегистрировано:

 [[PyFunc]]
 [[MultiDeviceIteratorGetNextFromShard]]
 [[RemoteCall]]
 [[IteratorGetNextAsOptional]]

Во время обработки вышеупомянутого исключения произошло другое исключение:

KeyError Traceback (последний последний вызов) /usr/local/lib/python3.6/dist -packages / tenorflow_core / python / keras / callbacks.py в _get_file_path (self, epoch, logs) 1053, если не self.model._in_multi_worker_mode (1054) или multi_worker_util.should_save_checkpoint (): -> 1055, возвращают self.filepath для. = эпоха + 1, ** журналы) 1056 остальное: 1057 # Если это обучение для нескольких работников, и этот работник не должен

KeyError: 'val_accuracy'

1 Ответ

0 голосов
/ 19 марта 2020

TL / DR

Вам необходимо установить более новую сборку, которая будет выполнять функцию python перед отправкой ее в TPU. Загрузка новых сборок через

import requests
import os
url = 'http://' + os.environ['COLAB_TPU_ADDR'].split(':')[0] + ':8475/requestversion/2.2.0-dev20200311'
resp = requests.post(url)
print(resp)
%pip install tf-nightly==2.2.0-dev20200311

С https://github.com/tensorflow/tensorflow/issues/34346

Когда вы используете Dataset.from_generator (или передаете генератор в Keras, который вызовет его под капотом) , набор данных встраивает генератор в операцию PyFun c в своем графике, и каждый раз, когда эта операция вызывается, он вызывает следующий генератор и получает результирующие байты. (По сути, Python трактуется как черный ящик.)

Когда все работает на одной машине, это нормально, но проблема в том, что способы работы TPU состоят в том, что существует отдельная машина, управляющая TPU ( образно назвал хост-контроллер TPU. ^^), и вы запускаете вещи на TPU, отправляя ему график TensorFlow для выполнения. Таким образом, граф, содержащий этот PyFun c, отправляется в TPU, и TPU не может выполнить его, поскольку на хост-компьютере TPU нет Python. (И даже если бы это было так, это не был бы тот же интерпретатор с тем же состоянием, что и на вашем локальном компьютере.) Поэтому он не может сказать вам, что не может выполнить PyFun c op, но не очень понятно. к сожалению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...