如何在 Tensorflow 2.0 中使用来自 Google Colab 的 TPU?

How can you use TPU from Google Colab in Tensorflow 2.0?

我正在尝试利用 Google Colab 来使用张量处理单元 (TPU) 来训练神经网络。 Tensorflow 刚刚发布了一个主要版本 2.0,所以我正在尝试在 Tensorflow 2.0 中执行此操作。我已尝试遵循三个指南,但所有指南都是为 Tensorflow 1.14 编写的,但在 Tensorflow 2.0 中失败了:

1) 按照指南 TPUs in Colab,我得到错误:

AttributeError: module 'tensorflow' has no attribute 'Session'

(来自参考:with tf.Session(tpu_address) as session:)

2) 按照指南 Simple Classification Model using Keras on Colab TPU,我得到了同样的错误

3) 按照指南 cloud_tpu_custom_training,我得到错误:

AttributeError: module 'tensorflow' has no attribute 'contrib'

(来自参考:resolver = tf.contrib.cluster_resolver.TPUClusterResolver(tpu=TPU_WORKER)

有没有人有在 Tensorflow 2.0 中使用 TPU 训练神经网络的例子?

编辑:这个问题似乎也在 github 上提出:InvalidArgumentError: Unable to find a context_id matching the specified one #1

在 运行 代码之前,

前往,

Edit --> Notebook Settings

在那之下select

Hardware Accelerator --> TPU

Tensorflow 2.0 并不真正向后兼容 Tensorflow 1.X 代码。 Tensorflow 在这些版本之间的工作方式有相当多的变化,因此我强烈建议阅读有关如何迁移代码的官方指南:

https://www.tensorflow.org/guide/migrate#estimators

我会说,自动转换脚本虽然在技术上是成功的,但只是将我的代码更改为 Tensorflow 1.X 代码的兼容版本 - 如果您想使用任何实际的 Tensorflow 2.0 功能,您将可能需要手动更改代码。

首先教程中给出的代码不2.x兼容

  1. 您需要在 colab 中选择 runtime 作为 TPU 才能在 TPU 中执行代码
  2. 对于错误

    AttributeError: module 'tensorflow' has no attribute 'Session'

    您需要使用 tf.compat.v1.Session(),因为 tf.session 已弃用。

  3. 代替tf.contrib.cluster_resolver请使用tf.distribute.cluster_resolver

请参考 Tensorflow Addon-repo 将代码从 1.x 转换为 2.x 兼容。

Tensorflow 2.1.0 终于添加了对 TPU 的支持(截至 2020 年 1 月 8 日)。从此处的发行说明 https://github.com/tensorflow/tensorflow/releases/tag/v2.1.0:

Experimental support for Keras .compile, .fit, .evaluate, and .predict is available for Cloud TPUs, Cloud TPU, for all types of Keras models (sequential, functional and subclassing models).

教程可在此处获取:https://www.tensorflow.org/guide/tpu

为了完整起见,我将在此处添加演练:

  1. 转到 Google Colab 并在此处创建一个新的 Python 3 Notebook:https://colab.research.google.com/
  2. 在工具栏中,单击运行时/更改运行时间类型,然后在硬件加速器下选择"TPU"。
  3. 将以下代码复制并粘贴到笔记本中,然后单击 运行 单元格(播放按钮)。
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
import os
import tensorflow_datasets as tfds

# Distribution strategies
resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
tf.config.experimental_connect_to_cluster(resolver)
tf.tpu.experimental.initialize_tpu_system(resolver)

# MNIST model
def create_model():
  return tf.keras.Sequential(
      [tf.keras.layers.Conv2D(32, 3, activation='relu', input_shape=(28, 28, 1)),
       tf.keras.layers.Flatten(),
       tf.keras.layers.Dense(128, activation='relu'),
       tf.keras.layers.Dense(10)])

# Input datasets
def get_dataset(batch_size=200):
  datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True,
                             try_gcs=True)
  mnist_train, mnist_test = datasets['train'], datasets['test']

  def scale(image, label):
    image = tf.cast(image, tf.float32)
    image /= 255.0

    return image, label

  train_dataset = mnist_train.map(scale).shuffle(10000).batch(batch_size)
  test_dataset = mnist_test.map(scale).batch(batch_size)

  return train_dataset, test_dataset

# Create and train a model
strategy = tf.distribute.experimental.TPUStrategy(resolver)
with strategy.scope():
  model = create_model()
  model.compile(optimizer='adam',
                loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=['sparse_categorical_accuracy'])

train_dataset, test_dataset = get_dataset()

model.fit(train_dataset,
          epochs=5,
          validation_data=test_dataset,steps_per_epoch=50)

请注意,当我按原样 运行 来自 tensorflow 教程的代码时,出现以下错误。我已通过在 model.fit()

中添加 steps_per_epoch 参数来更正此问题

ValueError: Number of steps could not be inferred from the data, please pass the steps_per_epoch argument.

“tf”的升级版本将解决上述问题。

!pip install tensorflow==2.7.0