Модель Tensorflow 2.0 с использованием tf.function работает очень медленно и перекомпилируется каждый раз, когда изменяется количество поездов. Eager работает примерно в 4 раза быстрее

#keras #tensorflow2.0

#keras #tensorflow2.0

Вопрос:

У меня есть модели, построенные из некомпилированного кода keras, и я пытаюсь запустить их через пользовательский цикл обучения.

Код TF 2.0 eager (по умолчанию) выполняется около 30 секунд на процессоре (ноутбуке). Когда я создаю модель keras с обернутыми методами вызова tf.function, она работает намного, намного медленнее и, похоже, запускается очень долго, особенно в «первый» раз.

Например, в коде tf.function начальная последовательность из 10 выборок занимает 40 секунд, а последующая последовательность из 10 выборок занимает 2 секунды.

Для 20 выборок начальная занимает 50 секунд, а последующая — 4 секунды.

Первый поезд на 1 выборке занимает 2 секунды, а последующие — 200 мс.

Таким образом, похоже, что каждый вызов train создает новый график, где сложность масштабируется с количеством поездов !?

Я просто делаю что-то вроде этого:

 @tf.function
def train(n=10):
    step = 0
    loss = 0.0
    accuracy = 0.0
    for i in range(n):
        step  = 1
        d, dd, l = train_one_step(model, opt, data)
        tf.print(dd)
        with tf.name_scope('train'):
            for k in dd:
                tf.summary.scalar(k, dd[k], step=step)
        if tf.equal(step % 10, 0):
            tf.print(dd)
    d.update(dd)
    return d
  

Где модель keras.model.Model с @tf.function call методом декорирования в соответствии с примерами.

Ответ №1:

Я проанализировал это поведение @tf.function здесь, используя собственный тип Python.

Короче говоря: дизайн tf.function не выполняет автоматическую привязку собственных типов Python к tf.Tensor объектам с четко определенным dtype .

Если ваша функция принимает tf.Tensor объект, при первом вызове функция анализируется, строится график и связывается с этой функцией. При каждом не первом вызове, если dtype из tf.Tensor объекта совпадает, график используется повторно.

Но в случае использования собственного типа Python graphg создается каждый раз, когда функция вызывается с другим значением.

Короче говоря: разработайте свой код для использования tf.Tensor везде вместо переменных Python, если вы планируете использовать @tf.function .

tf.function это не оболочка, которая волшебным образом ускоряет функцию, которая хорошо работает в режиме ожидания; это оболочка, которая требует разработки нетерпеливой функции (тело, входные параметры, dytpes), понимая, что произойдет после создания графика, чтобы получить реальное ускорение.

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

1. Это здорово … я думаю, в документах должно быть большое предупреждение. Если он есть, я определенно пропустил его.

2. Одна вещь, которую я просто не понимаю, — это почему у них есть примеры tf.function здесь tensorflow.org/alpha/guide/effective_tf2 … которые включают модель и т. Д. В аргументы, Если это известная проблема с autograph.

3. передача модели (то есть объекта keras), tf.data.dataset или любого tf. * obejct вообще не является проблемой. Производительность снижается, только если вы передаете собственный тип Python

4. Я рад помочь!

5. Спасибо, @nessuno. Я знаю, что вы имели в виду собственные числовые типы, но я также хотел бы добавить, что список тензоров работает нормально, хотя списки также считаются собственными типами в python.