TPU работает так же медленно, как и процессор, при использовании keras_to_tpu_model в colab - PullRequest
0 голосов
/ 15 ноября 2018

Я использую tf.contrib.tpu.keras_to_tpu_model, чтобы мой код мог работать на TPU, но завершение эпохи заняло 170 часов, в то время как процессор занимал столько же времени, а GPU - только 40 часов на одну эпоху. Я пытался настроить размер пакета, ноничего не изменилось. И я проверял, что функция ввода может занимать 20% времени работы при работе на GPU, поэтому я думаю, что это, возможно, не главная причина.

Вот мой код: https://github.com/WangHexie/DHNE/blob/master/src/hypergraph_embedding.py

Запуск на colab:

  1. ТПУ: https://colab.research.google.com/gist/WangHexie/30c385509f9cd93be747f04c39f039a4/tpu-error.ipynb
  2. GPU: https://colab.research.google.com/gist/WangHexie/5bfac53bf92ef0ad527f15ddbf8705e1/-gpu-ipynb.ipynb

Модель:

def build_model(self):
    self.inputs = [Input(shape=(self.options.dim_feature[i], ), name='input_{}'.format(i), dtype='float') for i in range(3)]

    self.encodeds = [Dense(self.options.embedding_size[i], activation='tanh', name='encode_{}'.format(i))(self.inputs[i]) for i in range(3)]
    self.decodeds = [Dense(self.options.dim_feature[i], activation='sigmoid', name='decode_{}'.format(i),
                    activity_regularizer = regularizers.l2(0.0))(self.encodeds[i]) for i in range(3)]

    self.merged = concatenate(self.encodeds, axis=1)
    self.hidden_layer = Dense(self.options.hidden_size, activation='tanh', name='full_connected_layer')(self.merged)
    self.ouput_layer = Dense(1, activation='sigmoid', name='classify_layer')(self.hidden_layer)

    self.model = Model(inputs=self.inputs, outputs=self.decodeds+[self.ouput_layer])

    self.model.compile(optimizer=tf.train.AdamOptimizer(learning_rate=self.options.learning_rate),
            loss=[self.sparse_autoencoder_error]*3+['binary_crossentropy'],
                          loss_weights=[self.options.alpha]*3+[1.0],
                          metrics=dict([('decode_{}'.format(i), 'mse') for i in range(3)]+[('classify_layer', 'accuracy')]))
    self.model = tf.contrib.tpu.keras_to_tpu_model(
        self.model,
        strategy=tf.contrib.tpu.TPUDistributionStrategy(
            tf.contrib.cluster_resolver.TPUClusterResolver(
                tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
        )
    )
    self.model.summary()

1 Ответ

0 голосов
/ 12 августа 2019

По состоянию на 2019-02-20 функция tf.contrib.tpu.keras_to_tpu_model устарела.Поэтому вам следует повторить попытку преобразования вашей модели с помощью новой функции Distribution Strategy .Подробное руководство по распределенному обучению можно найти здесь .

Я также заметил, что вы используете тип данных float в качестве входных значений.В CPython значение бита по умолчанию составляет 64 бита.В настоящее время TPU функционирует наиболее оптимально с 16-разрядными числами с плавающей запятой, поэтому вам следует сократить входные данные до 8-разрядных или 16-разрядных.Чем ниже значение бита, тем быстрее будет обработана ваша модель.

Поэтому также рекомендуется использовать квантование, преобразовывая веса с плавающей запятой в 8-битные целые числа.Существует два типа квантованного обучения: квантование после обучения и обучение с учетом квантования .

Для получения дополнительной информации о TPU на Google Cloud Platform вы можете обратиться к Cloud TPU документации , а для получения дополнительной информации об архитектуре системы TPU вы можете обратиться к этой документацииGoogle, так как он правильно объясняет, как устроены TPU.

...