#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. Если решение сработало, не могли бы вы принять и поддержать.