0

code of tensorflow 2.x as below:

import tensorflow as tf

import os

import tensorflow_datasets as tfds

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)

strategy = tf.distribute.experimental.TPUStrategy(resolver)

a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])

b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])

with tf.device('/TPU:0'):

c = tf.matmul(a, b)

print("c device: ", c.device)

print(c)

@tf.function

def matmul_fn(x, y):

z = tf.matmul(x, y)

return z

z = strategy.run(matmul_fn, args=(a, b))

print(z)

My 1.x code as below:

%tensorflow_version 1.x

import tensorflow as tf

import os

import tensorflow_datasets as tfds

tpu_address = 'grpc://' + os.environ['COLAB_TPU_ADDR']

resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu_address)

tf.config.experimental_connect_to_cluster(resolver)

tf.tpu.experimental.initialize_tpu_system(resolver)

strategy = tf.distribute.experimental.TPUStrategy(resolver)

a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])

b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])

with tf.device('/TPU:0'):

c = tf.matmul(a, b)

print(c)

def matmul_fn(x, y):

z = tf.matmul(x, y)

return z

with tf.Session() as sess:

with strategy.scope():

z = strategy.experimental_run_v2(matmul_fn, args=(a, b))

print(sess.run(z))

Finally, I am so confused about to use TPU in tensorlfow 1.x on colab.

Bob Smith
  • 36,107
  • 11
  • 98
  • 91
ZheZhang
  • 21
  • 2

1 Answers1

0

To create variables on the TPU, you can create them in a strategy.scope() context manager. The corrected TensorFlow 2.x code is as follows:

import tensorflow as tf
import os

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)
strategy = tf.distribute.experimental.TPUStrategy(resolver)

with strategy.scope():
  a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])

  @tf.function
  def matmul_fn(x, y):
    z = tf.matmul(x, y)
    return z

  z = strategy.run(matmul_fn, args=(a, b))
  print(z)

This runs the tf.function on all TPU replicas and gives this result:

PerReplica:{
  0: tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32),
  1: tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32),
  2: tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32),
  3: tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32),
  4: tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32),
  5: tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32),
  6: tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32),
  7: tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)
}

To evaluate the same function on the TPU in TF 1.x, you'll need to change strategy.run to strategy.experimental_run_v2, create a tf.Session on the TPU, and call sess.run() on the list of values returned by experimental_run_v2.

The initial setup is the same. Change the with block to the following:

with strategy.scope():
  a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])

  @tf.function
  def matmul_fn(x, y):
    z = tf.matmul(x, y)
    return z

  with tf.Session(tpu_address) as sess:
    z = strategy.experimental_run_v2(matmul_fn, args=(a, b))
    print(sess.run(z.values))

This gives the following result:

(array([[22., 28.],
       [49., 64.]], dtype=float32), array([[22., 28.],
       [49., 64.]], dtype=float32), array([[22., 28.],
       [49., 64.]], dtype=float32), array([[22., 28.],
       [49., 64.]], dtype=float32), array([[22., 28.],
       [49., 64.]], dtype=float32), array([[22., 28.],
       [49., 64.]], dtype=float32), array([[22., 28.],
       [49., 64.]], dtype=float32), array([[22., 28.],
       [49., 64.]], dtype=float32))

I hope this answers your question. For more information about running TensorFlow on TPUs, see the TensorFlow TPU guide. For more information on using distribution strategies without Keras, see the guide on distribution strategies with custom training loops

Will Cromar
  • 179
  • 1
  • 7
  • I have got your answer, it help my work very very much.But,there is another question on this link about how can code work from GPU to TPU,would you like to give me some advice about this? I will appreciaten it for you gengerous. [link](https://stackoverflow.com/questions/62555066/how-to-change-a-code-of-tensorflow-1-15-with-gpu-to-a-code-of-tensorflow-1-15-wi) – ZheZhang Jun 25 '20 at 12:35