在 colab 中使用 keras_to_tpu_model 时,TPU 运行速度与 CPU 一样慢
TPU runs as slow as CPU when using keras_to_tpu_model in colab
我使用 tf.contrib.tpu.keras_to_tpu_model
使我的代码能够在 TPU 上 运行,但是完成一个纪元需要 170 小时,而 CPU 花费了相同的时间,而 GPU 只花费了每个 epoch.I 40 小时尝试调整批量大小但没有 changed.And 我测试过输入函数可能占用 运行 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
- 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()
自 2019-02-20 起,函数 tf.contrib.tpu.keras_to_tpu_model
已被弃用。因此,您应该重新尝试使用新的 Distribution Strategy function. An in depth guide on distributed training can be found here.
转换您的模型
我还注意到您使用数据类型 float 作为输入值。在 CPython 中,默认位值为 64 位。目前,TPU 的功能最适合 16 位浮点数,因此您应该将输入减少到 8 位或 16 位。位值越低,模型的处理速度就越快。
因此也推荐利用Quantization,将浮点权重转换为8位整数。量化训练有两种类型:post-training quantization and quantization-aware training。
有关 Google Cloud Platform 上 TPU 的更多信息,您可以参考 Google 的 Cloud TPU documentation, and for more information on TPU system architecture you may refer to this 文档,因为它正确解释了 TPU 的设计方式。
我使用 tf.contrib.tpu.keras_to_tpu_model
使我的代码能够在 TPU 上 运行,但是完成一个纪元需要 170 小时,而 CPU 花费了相同的时间,而 GPU 只花费了每个 epoch.I 40 小时尝试调整批量大小但没有 changed.And 我测试过输入函数可能占用 运行 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
- 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()
自 2019-02-20 起,函数 tf.contrib.tpu.keras_to_tpu_model
已被弃用。因此,您应该重新尝试使用新的 Distribution Strategy function. An in depth guide on distributed training can be found here.
我还注意到您使用数据类型 float 作为输入值。在 CPython 中,默认位值为 64 位。目前,TPU 的功能最适合 16 位浮点数,因此您应该将输入减少到 8 位或 16 位。位值越低,模型的处理速度就越快。
因此也推荐利用Quantization,将浮点权重转换为8位整数。量化训练有两种类型:post-training quantization and quantization-aware training。
有关 Google Cloud Platform 上 TPU 的更多信息,您可以参考 Google 的 Cloud TPU documentation, and for more information on TPU system architecture you may refer to this 文档,因为它正确解释了 TPU 的设计方式。