gpt4 book ai didi

python - 为什么 TensorFlow 2 比 TensorFlow 1 慢得多?

转载 作者:行者123 更新时间:2023-12-03 04:49:18 24 4
gpt4 key购买 nike

许多用户都引用它作为切换到 Pytorch 的原因,但我还没有找到理由/解释来牺牲最重要的实用质量、速度来急切执行。
下面是代码基准性能,TF1 与 TF2 - TF1 在任何地方运行 速度提高 47% 到 276% .
我的问题是:在图形或硬件级别,是什么导致了如此显着的放缓?

寻找详细的答案 - 我已经熟悉广泛的概念。 Relevant Git
规范 :CUDA 10.0.130、cuDNN 7.4.2、Python 3.7.4、Windows 10、GTX 1070

基准测试结果 :


更新 :按照以下代码禁用 Eager Execution 无济于事。然而,这种行为是不一致的:有时在图形模式下运行有很大帮助,有时它相对于 Eager 运行得更慢。

基准代码 :

# use tensorflow.keras... to benchmark tf.keras; used GPU for all above benchmarks
from keras.layers import Input, Dense, LSTM, Bidirectional, Conv1D
from keras.layers import Flatten, Dropout
from keras.models import Model
from keras.optimizers import Adam
import keras.backend as K
import numpy as np
from time import time

batch_shape = (32, 400, 16)
X, y = make_data(batch_shape)

model_small = make_small_model(batch_shape)
model_small.train_on_batch(X, y) # skip first iteration which builds graph
timeit(model_small.train_on_batch, 200, X, y)

K.clear_session() # in my testing, kernel was restarted instead

model_medium = make_medium_model(batch_shape)
model_medium.train_on_batch(X, y) # skip first iteration which builds graph
timeit(model_medium.train_on_batch, 10, X, y)

使用的函数 :
def timeit(func, iterations, *args):
t0 = time()
for _ in range(iterations):
func(*args)
print("Time/iter: %.4f sec" % ((time() - t0) / iterations))

def make_small_model(batch_shape):
ipt = Input(batch_shape=batch_shape)
x = Conv1D(128, 400, strides=4, padding='same')(ipt)
x = Flatten()(x)
x = Dropout(0.5)(x)
x = Dense(64, activation='relu')(x)
out = Dense(1, activation='sigmoid')(x)
model = Model(ipt, out)
model.compile(Adam(lr=1e-4), 'binary_crossentropy')
return model

def make_medium_model(batch_shape):
ipt = Input(batch_shape=batch_shape)
x = Bidirectional(LSTM(512, activation='relu', return_sequences=True))(ipt)
x = LSTM(512, activation='relu', return_sequences=True)(x)
x = Conv1D(128, 400, strides=4, padding='same')(x)
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(128, activation='relu')(x)
x = Dense(64, activation='relu')(x)
out = Dense(1, activation='sigmoid')(x)
model = Model(ipt, out)
model.compile(Adam(lr=1e-4), 'binary_crossentropy')
return model

def make_data(batch_shape):
return np.random.randn(*batch_shape), np.random.randint(0, 2, (batch_shape[0], 1))

最佳答案

更新 8/1730/2020 :TF 2.3 终于做到了:所有案例的运行速度都与之前的任何版本一样快,或者明显更快。
此外,我之前的更新对 TF 不公平;我的 GPU 是罪魁祸首,最近一直过热。如果您看到迭代时间的上升茎图,则这是一个可靠的症状。最后,请参阅关于 Eager vs Graph 的开发人员说明.
这可能是我对这个答案的最后一次更新。模型速度的真实统计数据只能由您在您的设备上找到。

2020 年 5 月 19 日更新 :TF 2.2,使用相同的测试:Eager 速度仅略有提高。大型 Numpy 的绘图 train_on_batch下面的情况,x 轴是连续拟合迭代;我的 GPU 还没有接近其全部容量,所以怀疑它正在节流,但随着时间的推移迭代确实会变慢。
enter image description here
如上所述,Graph 和 Eager 是 1.56x 1.97 倍 分别比它们的 TF1 对应物慢。不确定我会进一步调试这个,因为我正在考虑切换到 Pytorch,因为 TensorFlow 对自定义/低级功能的支持很差。然而,我确实打开了一个 Issue以获得开发人员的反馈。

2020 年 2 月 18 日更新 :我每晚都有 2.1 和 2.1 的板凳;结果喜忧参半。除了一个配置(模型和数据大小)之外的所有配置都与最好的 TF2 和 TF1 一样快或快得多。较慢且显着较慢的是大-大 - 尤其是。在图形执行中( 慢 1.6 倍到 2.5 倍 )。
此外,对于我测试的大型模型,Graph 和 Eager 之间存在极大的可重复性差异 - 无法通过随机性/计算并行性来解释。我目前无法针对每个时间限制为这些声明提供可重现的代码,因此我强烈建议您针对您自己的模型进行测试。
尚未针对这些打开 Git 问题,但我确实对 original 发表了评论。 - 还没有回应。一旦取得进展,我将更新答案。

判决 : 不是,如果你知道你在做什么。但是如果你不这样做,它可能会花费你很多 - 平均需要升级几个 GPU,最坏的情况是多个 GPU。

这个答案 :旨在提供对该问题的高级描述,以及有关如何决定特定于您的需求的培训配置的指南。有关详细的低级描述,包括所有基准测试结果 + 使用的代码,请参阅我的其他答案。
如果我学到了任何信息,我将更新我的答案(s)和更多信息 - 可以为这个问题添加书签/“加星标”以供引用。

问题摘要 :如 confirmed由 TensorFlow 开发人员 Q. Scott Zhu 撰写,TF2 将开发重点放在 Eager 执行和与 Keras 的紧密集成上,其中涉及 TF 源的彻底更改 - 包括图形级别。好处:大大扩展了处理、分发、调试和部署能力。然而,其中一些的代价是速度。
然而,事情要复杂得多。不仅仅是 TF1 与 TF2 - 导致列车速度显着差异的因素包括:

  • TF2 与 TF1
  • Eager vs. Graph 模式
  • keras对比 tf.keras
  • numpy对比 tf.data.Dataset与 ...
  • train_on_batch()对比 fit()
  • GPU 与 CPU
  • model(x)对比 model.predict(x)与 ...

  • 不幸的是,上述几乎没有一个是相互独立的,并且每个相对于另一个至少可以增加一倍的执行时间。幸运的是,您可以通过一些捷径来系统地确定什么最有效 - 正如我将展示的那样。

    我该怎么办? 目前,唯一的方法是 - 针对您的特定模型、数据和硬件进行试验。没有单一的配置总是最好的 - 但是有一些可以简化您的搜索的方法:
    >> 办:
  • train_on_batch() + numpy + tf.keras + TF1 + Eager/Graph
  • train_on_batch() + numpy + tf.keras + TF2 + 图
  • fit() + numpy + tf.keras + TF1/TF2 + 图 + 大模型和数据

  • >> 不要:
  • fit() + numpy + keras适用于中小型模型和数据
  • fit() + numpy + tf.keras + TF1/TF2 + 渴望
  • train_on_batch() + numpy + keras + TF1 + 渴望
  • 【专业】 tf.python.keras ;它的运行速度可以慢 10-100 倍,并且有很多错误; more info
  • 这包括 layers , models , optimizers , & 相关的“开箱即用”用法导入; ops、utils 和相关的“私有(private)”导入很好 - 但可以肯定的是,检查 alt,以及它们是否用于 tf.keras


  • 有关示例基准测试设置,请参阅我的其他答案底部的代码。上面的列表主要基于另一个答案中的“基准”表。

    限制 以上该做与不该做的:
  • 这个问题的标题是“为什么 TF2 比 TF1 慢得多?”,虽然它的主体明确涉及训练,但问题不仅限于此;即使在相同的 TF 版本、导入、数据格式等中,推理也受主要速度差异的影响 - 参见 this answer .
  • RNN 可能会显着改变另一个答案中的数据网格,因为它们在 TF2
  • 中得到了改进。
  • 主要使用的型号 Conv1DDense - 无 RNN、稀疏数据/目标、4/5D 输入和其他配置
  • 输入数据限制为 numpytf.data.Dataset ,而存在许多其他格式;查看其他答案
  • 使用了 GPU; CPU 上的结果会有所不同。其实我问这个问题的时候,我的CUDA没有正确配置,有的结果是基于CPU的。

  • 为什么 TF2 牺牲了最实用的质量和速度,以换取急切的执行力? 显然,它没有 - 图形仍然可用。但如果问题是“为什么渴望”:
  • 高级调试 :您可能会遇到许多问题,询问“我如何获得中间层输出”或“我如何检查权重”;有了渴望,它(几乎)就像 .__dict__ 一样简单.相比之下,Graph 需要熟悉特殊的后端功能——这使调试和内省(introspection)的整个过程变得非常复杂。
  • 更快的原型(prototype)制作 :根据与上述类似的想法;更快的理解 = 更多的时间留给实际的深度学习。

  • 如何启用/禁用 EAGER?
    tf.enable_eager_execution()  # TF1; must be done before any model/tensor creation
    tf.compat.v1.disable_eager_execution() # TF2; above holds
    TF2 中的误导;见 here .

    附加信息 :
  • 小心 _on_batch() TF2 中的方法;根据 TF dev 的说法,他们仍然使用较慢的实现,但不是故意的 - 即它需要修复。有关详细信息,请参阅其他答案。

  • 对 TENSORFLOW DEVS 的请求 :
  • 请修复train_on_batch() ,以及调用 fit() 的性能方面迭代地;定制火车循环对很多人都很重要,尤其是对我来说。
  • 添加文档/文档字符串提及这些性能差异以供用户了解。
  • 提高总体执行速度以防止窥视者跳到 Pytorch。

  • 致谢 : 感谢
  • Q. Scott Zhu,TensorFlow 开发人员,感谢他的 detailed clarification在这件事上。
  • P. Andrey 分享 useful testing ,和讨论。

  • 更新 :
  • 2019 年 11 月 14 日 - 找到了一个模型(在我的实际应用程序中),它在 TF2 上运行速度较慢,适用于所有带有 Numpy 输入数据的配置。差异范围为 13-19%,平均为 17%。 keras之间的差异和 tf.keras然而,更具戏剧性: 18-40% ,平均。 32%(TF1 和 2)。 (* - 除了 Eager, TF2 OOM'd)
  • 2019 年 11 月 17 日 - 开发人员更新 on_batch() recent commit 中的方法,声明速度有所提高 - 将在 TF 2.1 中发布,或者现在可用 tf-nightly .由于我无法让后者跑起来,将把替补推迟到 2.1。
  • 2/20/20 - 预测性能也值得一试;例如,在 TF2 中,CPU 预测时间可能涉及 periodic spikes
  • 关于python - 为什么 TensorFlow 2 比 TensorFlow 1 慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58441514/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com