静态图很快。动态图很慢。有没有具体的基准证明这一点?
Static graph is fast. Dynamic graph is slow. Is there any specific benchmark demonstrating this?
我看到了一些关于 tensorflow
和 pytorch
的基准测试。 Tensorflow
可能更快,但似乎没那么快,有时甚至更慢。
是否有专门测试静态图和动态图的基准来证明静态图比动态图快得多?
更准确地说,速度优势来自"deferred execution with graph rewriting."
它通常与显式图框架 (Theano/TF) 相关联,但如果有足够的工程,您可以将它添加到 numpy/PyTorch 等没有显式图的执行模型中。请参阅 Bohrium,了解 example 黑客攻击 numpy 以进行重写。
请注意,此功能的存在会使框架对原型设计不太友好,因此如果将此功能添加到 PyTorch,您将遇到人们在 TensorFlow 中抱怨的相同问题
- 延迟执行意味着可以在很久以后触发异常,而不是在您输入有问题的行时
- 重写意味着现在可以在您未创建的节点中抛出错误,这会给出无意义的错误消息
就性能而言,TensorFlow 中的 toy benchmark 显示当您打开图形重写时速度提高了 5 倍。
我精心设计了这个示例,使其受到内存带宽的瓶颈,因此图形重写(cwise 融合)将在那里显着提高速度是显而易见的。对于生产 LSTM 模型 Google 在打开图形优化(通过 XLA)时报告了 1.8 的加速
静态图允许进行几种类型的优化,这取决于图的类型和您 运行 所处的环境。
静态图优化的简单示例是重用现有变量内存的选项,因此节省了昂贵的内存分配(有关使用 MXNet 的更多详细信息,请参见此处:https://mxnet.incubator.apache.org/architecture/note_memory.html)。
另一个简单的例子是将多个运算符组合成一个运算符的能力,尤其是在允许 "compilation" 代码使用硬件加速选项的 GPU 或其他特定硬件优化环境中。在这种情况下,考虑在 "compilation" 时间上多付出一点并加快执行时间,在深度学习训练中通常是不二之选。当您 运行 在许多 epocha 上训练大量数据时,这种权衡是没有意义的,因为执行时间(小时和天)比额外的编译时间(秒或分钟)长得多。
但最强大的是当您允许并行和分布式处理时。如果您有多个 GPU 或实例来加速您的训练,那么能够实现线性缩放对于允许您缩放模型以获得更多数据进行训练、使用更多层和参数以及传递更多时期至关重要。拥有静态图可以让深度学习框架更有效地优化它在您的资源中的执行。请在此处查看 MXNet 对多个 GPU 实例的支持:http://gluon.mxnet.io/chapter07_distributed-learning/training-with-multiple-machines.html.
我看到了一些关于 tensorflow
和 pytorch
的基准测试。 Tensorflow
可能更快,但似乎没那么快,有时甚至更慢。
是否有专门测试静态图和动态图的基准来证明静态图比动态图快得多?
更准确地说,速度优势来自"deferred execution with graph rewriting."
它通常与显式图框架 (Theano/TF) 相关联,但如果有足够的工程,您可以将它添加到 numpy/PyTorch 等没有显式图的执行模型中。请参阅 Bohrium,了解 example 黑客攻击 numpy 以进行重写。
请注意,此功能的存在会使框架对原型设计不太友好,因此如果将此功能添加到 PyTorch,您将遇到人们在 TensorFlow 中抱怨的相同问题
- 延迟执行意味着可以在很久以后触发异常,而不是在您输入有问题的行时
- 重写意味着现在可以在您未创建的节点中抛出错误,这会给出无意义的错误消息
就性能而言,TensorFlow 中的 toy benchmark 显示当您打开图形重写时速度提高了 5 倍。
我精心设计了这个示例,使其受到内存带宽的瓶颈,因此图形重写(cwise 融合)将在那里显着提高速度是显而易见的。对于生产 LSTM 模型 Google 在打开图形优化(通过 XLA)时报告了 1.8 的加速
静态图允许进行几种类型的优化,这取决于图的类型和您 运行 所处的环境。
静态图优化的简单示例是重用现有变量内存的选项,因此节省了昂贵的内存分配(有关使用 MXNet 的更多详细信息,请参见此处:https://mxnet.incubator.apache.org/architecture/note_memory.html)。
另一个简单的例子是将多个运算符组合成一个运算符的能力,尤其是在允许 "compilation" 代码使用硬件加速选项的 GPU 或其他特定硬件优化环境中。在这种情况下,考虑在 "compilation" 时间上多付出一点并加快执行时间,在深度学习训练中通常是不二之选。当您 运行 在许多 epocha 上训练大量数据时,这种权衡是没有意义的,因为执行时间(小时和天)比额外的编译时间(秒或分钟)长得多。
但最强大的是当您允许并行和分布式处理时。如果您有多个 GPU 或实例来加速您的训练,那么能够实现线性缩放对于允许您缩放模型以获得更多数据进行训练、使用更多层和参数以及传递更多时期至关重要。拥有静态图可以让深度学习框架更有效地优化它在您的资源中的执行。请在此处查看 MXNet 对多个 GPU 实例的支持:http://gluon.mxnet.io/chapter07_distributed-learning/training-with-multiple-machines.html.