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

时间:2019-10-03 18:34:47

标签: python tensorflow google-colaboratory tensorflow2.0 tpu

我正在尝试使用 Google Colab 来使用张量处理单元(TPU)来训练神经网络。 Tensorflow刚刚发布了一个主要版本2.0,因此我正在尝试在Tensorflow 2.0中做到这一点。我尝试了以下三个指南,但是所有指南都是为Tensorflow 1.14-编写的,但在Tensorflow 2.0中失败了:

1):按照指南TPUs in Colab,我收到了错误消息:

var dir1 = './screenshots';
var dir2 = './pdfs';
const fs = require('fs');

if (!fs.existsSync(dir1)) {
    fs.mkdirSync(dir1);
}

if (!fs.existsSync(dir2)) {
    fs.mkdirSync(dir2);
}

function readURLFile(path) {
    return fs.readFileSync(path, 'utf-8')
        .split('\n')
        .map((elt) => {
            const url = elt.split(',')[1].replace('\r', '');
            return `http://${url.toLowerCase()}`;
        });
}

const puppeteer = require('puppeteer');

(async () => {
    const startDate = new Date().getTime();
    const USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3239.108 Safari/537.36';
    const urls = readURLFile('./UNVurls.csv');
    const browser = await puppeteer.launch({
        headless: true
    });

    for (let url of urls) {
        console.log(`Visiting url: ${url}`);
        let page = await browser.newPage();

        try {
            await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 2 });

            await page.goto('http://www.oldwestbury.edu')

            // await page.goto(url, {
                // waitUntil: 'networkidle2',
                // timeout: 0
            // });


            let fileName = url.replace(/(\.|\/|:|%|#)/g, "_");
            if (fileName.length > 100) {
                fileName = fileName.substring(0, 100);
            }

            await page.waitForSelector('title');
            await page.screenshot({
                path: `./screenshots/${fileName}.jpeg`,
                omitBackground: true
            });

            await page.emulateMedia('screen');

            await page.pdf({
                path: `./pdfs/${fileName}.pdf`,
                pageRanges: "1",
                format: 'A4',
                printBackground: true
            });

        } catch (err) {
            console.log(`An error occured on url: ${url}`);
        } finally {
            await page.close();
        }
    }

    await browser.close();
    console.log(`Time elapsed ${Math.round((new Date().getTime() - startDate) / 1000)} s`);

})();

(参考文献:,其中tf.Session(tpu_address)为会话:

2)根据指南Simple Classification Model using Keras on Colab TPU,我遇到相同的错误

3),按照指南cloud_tpu_custom_training,我收到了错误消息:

input = [1,3,1,2,1,7]                                
num = 3
count = 0

for i in range(1,len(input)):
    while input[i] <= input[i-1]:
        input[i] += num
        count +=1
print (count) # returns 5
print (input) # returns [1, 3, 4, 5, 7, 10]

(参考文献: 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

4 个答案:

答案 0 :(得分:1)

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

  1. 您需要在colab中选择运行时作为TPU,才能在TPU中执行代码
  2. 针对错误

      

    AttributeError:模块'tensorflow'没有属性'Session'

    由于不推荐使用tf.compat.v1.Session(),因此您需要使用tf.session

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

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

答案 1 :(得分:0)

在运行代码之前,

转到

Edit --> Notebook Settings

在该选择下

Hardware Accelerator --> TPU

答案 2 :(得分:0)

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

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

我会说,自动转换脚本尽管在技术上取得了成功,但仅将我的代码更改为Tensorflow 1.X代码的兼容版本-如果您想使用任何实际的Tensorflow 2.0功能,则可能需要更改手动编写代码。

答案 3 :(得分:0)

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

Keras .compile,.fit,.evaluate和.predict的实验支持适用于Cloud TPU,Cloud TPU,适用于所有类型的Keras模型(顺序模型,功能模型和子类模型)。

该教程位于此处:https://www.tensorflow.org/guide/tpu

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

  1. 转到Google Colab并在此处创建新的Python 3笔记本: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:无法从数据中推断出步数,请传递steps_per_epoch参数。