TensorFlow — матричное умножение матриц, приведенных к типу float, занимает очень много времени, почему?

#python-3.x #tensorflow #keras #tensorflow2.0 #tensor

#python-3.x #tensorflow #keras #tensorflow2.0 #тензор

Вопрос:

Выполнение следующего матричного умножения в tensorflow 2.x занимает очень много времени

     a = tf.random.uniform(shape=(9180, 3049))
    b = tf.random.uniform(shape=(3049, 1913))
    a = tf.cast(a ,tf.float16)
    b = tf.cast(b ,tf.float16)
    tf.matmul(a,b)
  

но если я просто использую приведенный ниже метод, это быстро

     a = tf.random.uniform(shape=(9180, 3049))
    b = tf.random.uniform(shape=(3049, 1913))
    tf.matmul(a,b)
  

Почему это так? и мне нужно преобразовать тензор в float для какой-то цели.

Ответ №1:

На самом деле, в обоих ваших случаях вы пытаетесь матричное умножение плавающих значений. В первом случае вы используете float16, а во втором случае вы используете float32.

 import tensorflow as tf
import time
a = tf.random.uniform(shape=(9180, 3049), seed = 10)
b = tf.random.uniform(shape=(3049, 1913), seed = 10)
  

1-й запуск

 x2 = a
y2 = b
s = time.time()
r2 = tf.matmul(x2,y2)
e = time.time()
print((e-s)*1000)

x1 = tf.cast(a ,tf.float16)
y1 = tf.cast(b ,tf.float16)
s = time.time()
r1 = tf.matmul(x1,y1)
e = time.time()
print((e-s)*1000)
  

Вывод:

 184.76319313049316
0.0
  

2-й запуск после перезапуска моего ядра.

 x1 = tf.cast(a ,tf.float16)
y1 = tf.cast(b ,tf.float16)
s = time.time()
r1 = tf.matmul(x1,y1)
e = time.time()
print((e-s)*1000)

x2 = a
y2 = b
s = time.time()
r2 = tf.matmul(x2,y2)
e = time.time()
print((e-s)*1000)
  

Вывод:

 183.03942680358887
1.0335445404052734
  

Теперь, если я снова запущу тот же код без повторного запуска ядра, даже после изменения значений a и b .

 x1 = tf.cast(a ,tf.float16)
y1 = tf.cast(b ,tf.float16)
s = time.time()
r1 = tf.matmul(x1,y1)
e = time.time()
print((e-s)*1000)

x2 = a
y2 = b
s = time.time()
r2 = tf.matmul(x2,y2)
e = time.time()
print((e-s)*1000)
  

Вывод:

 0.0
0.0
  

Так что, по сути, это не проблема TensorFlow. Tensorflow выполняется в виде графика. Когда вы запускаете его в первый раз, он инициализирует график с указанной структурой данных и оптимизирует его для дальнейших вычислений. Взгляните на заключительный комментарий в этом.

Поэтому ваше второе выполнение операции будет быстрее

Комментарии:

1. Если решение сработало, не могли бы вы принять и поддержать.