我使用tf.contrib.tpu.keras_to_tpu_model使我的代码能够在TPU上运行,但完成一个epoch需要170个小时,而CPU占用相同的时间,GPU每个epoch只占用40个小时。我试图调整批处理大小,但没有任何变化。我测试过输入函数在GPU上运行时可能占用20%的运行时间,所以我认为这可能不是主要原因。
这是我的代码:https://github.com/WangHexie/DHNE/blob/master/src/hypergraph_embedding.py
在colab上运行:
TPU:https://colab.research.google.com/gist/WangHexie/30c385509f9cd93be747f04c39f039a4/tpu-error.ipynb
平均绩点: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()

最佳答案

截至2019-02-20,功能tf.contrib.tpu.keras_to_tpu_model已被弃用。因此,您应该使用新的Distribution Strategy函数重新尝试转换模型。分布式训练的深入指导可以找到here
我还注意到您正在使用数据类型float作为输入值。在CPython中,默认的位值是64位。目前,TPU的功能最理想的16位浮动,因此您应该减少您的输入到8位或16位。比特值越低,处理模型的速度就越快。
因此,还建议利用量化,将浮点权重转换为8位整数。量化训练有两种类型:post-training quantizationquantization-aware training
有关谷歌云平台上TPU的更多信息,您可以参考Cloud TPU documentation,有关TPU系统架构的更多信息,您可以参考谷歌的this文档,因为它正确地解释了TPU是如何设计的。

关于python - 在colab中使用keras_to_tpu_model时,TPU的运行速度与CPU一样慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53311962/

10-09 07:24