Тензорное умножение производительности констант медленнее, чем tf.random

Я использую Tensorflow для некоторых вычислений без DL, и я сталкиваюсь с поведением, которое я не понимаю. Я проверяю умножение квадратной матрицы само по себе: tf.matmul(a,a):

  1. когда матрица создается с помощью tf.constant
  2. когда матрица случайно инициализируется при каждом запуске

Я ожидаю, что в первом случае должны быть некоторые издержки для передачи исходных данных, 100 МБ (матрица 5000x5000 с использованием float32), но тогда выполнение второго случая должно быть немного медленнее из-за случайной инициализации при каждом запуске.

Однако я вижу, что умножение константы происходит намного медленнее даже при последовательных запусках в одном сеансе.

Код

import tensorflow as tf
import numpy as np
from timeit import timeit
import os

os.environ["TF_CPP_MIN_LOG_LEVEL"]="2"  # nospam
SIZE = 5000
NUM_RUNS = 10

a = np.random.random((SIZE, SIZE))
_const_a = tf.constant(a, dtype=tf.float32, name="Const_A")
_mul_const_a = tf.matmul(_const_a, _const_a, name="Mul_Const")

_random_a = tf.random_uniform((SIZE, SIZE), dtype=tf.float32, name="Random_A")
_mul_random_a = tf.matmul(_random_a, _random_a, name="Mul_Random")

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as s:
    # Run once to make sure everything is initialised
    s.run((_const_a, _mul_const_a, _random_a, _mul_random_a))

    # timeit
    print("TF with const\t", timeit(lambda: s.run((_mul_const_a.op)), number=NUM_RUNS))
    print("TF with random\t", timeit(lambda: s.run((_mul_random_a.op)), number=NUM_RUNS))

Выход

Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0, compute capability: 6.1
Random_A/sub: (Sub): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/RandomUniform: (RandomUniform): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/mul: (Mul): /job:localhost/replica:0/task:0/device:GPU:0
Random_A: (Add): /job:localhost/replica:0/task:0/device:GPU:0
Mul_Random: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
Mul_Const: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/max: (Const): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/min: (Const): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/shape: (Const): /job:localhost/replica:0/task:0/device:GPU:0
Const_A: (Const): /job:localhost/replica:0/task:0/device:GPU:0
TF with const    2.9953213009994215
TF with random   0.513827863998813

2 ответа

Первый вызов метода session.run() в тензорном потоке неоправданно дорог. Если вы хотите что-то сравнить, не забудьте позвонить несколько раз.

Однако, в вашем случае, если вы не отключите постоянное сворачивание, вы, скорее всего, не увидите почти никакого времени, потраченного в постоянном случае, поскольку ваш график просто извлечет константу.

YMMV, я получаю противоположные результаты на своем скромном K1100M.

Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Quadro K1100M, pci bus id: 0000:01:00.0, compute capability: 3.0
Random_A/sub: (Sub): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/RandomUniform: (RandomUniform): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/mul: (Mul): /job:localhost/replica:0/task:0/device:GPU:0
Random_A: (Add): /job:localhost/replica:0/task:0/device:GPU:0
Mul_Random: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
Mul_Const: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/max: (Const): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/min: (Const): /job:localhost/replica:0/task:0/device:GPU:0
Random_A/shape: (Const): /job:localhost/replica:0/task:0/device:GPU:0
Const_A: (Const): /job:localhost/replica:0/task:0/device:GPU:0
TF with const    4.3167382130868175
TF with random   9.889055849542306
Другие вопросы по тегам