#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.