【问题标题】:Can TensorFlow cache (sub-)graph computations?TensorFlow 可以缓存(子)图计算吗?
【发布时间】:2016-03-10 01:14:20
【问题描述】:

如果涉及到计算,TensorFlow 可以自动缓存吗? 多次调用同一个计算(子)图?

例如,我有一个矩阵F,其中每个条目代表一个 基于可训练变量W的计算。我的目标函数 将此矩阵与不同的向量(每个 W 不变的时间)。

TensorFlow 是否会在我访问时重新计算,例如 F[1,2] 它,还是会缓存该值?

理论上,给定一个固定的W,可以预先计算矩阵F, 这样F 中的每个条目都是tf.constant。但这会 防止正确计算W的梯度。

【问题讨论】:

标签: tensorflow


【解决方案1】:

TensorFlow 执行有限数量的缓存,但它可能不涵盖您描述的情况。

如果您使用以下选项创建tf.Session,将启用常量折叠:

config = tf.ConfigProto(graph_options=tf.GraphOptions(
    optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L2)))
sess = tf.Session(config=config)

当您使用此配置调用 sess.run() 时,TensorFlow 将评估要运行的适当节点,然后识别那些输出恒定的节点的子图,评估它们并缓存结果。因此,它将避免重复执行冗余计算。

但是,在您的问题中,您提到 F 是一些可训练变量的函数。从 TensorFlow 的角度来看,这些变量是易失的——它们可能随时更改——因此它不会缓存从这些变量派生的值。如果您想多次重复使用 F 的相同值,可以考虑将其存储在 tf.constant() 中,以便常量折叠优化更有用。

【讨论】:

  • 感谢您的信息。我看到选项tf.OptimizerOptions.L1 执行common_subexpression_eliminationtf.OptimizerOptions.L2 执行constant_folding。但是,如果这些选项不能正确处理渐变,则不适用于我的情况。
  • 这两种优化都应该对程序的语义没有影响,因此应该正确处理渐变。但是,由于绝大多数梯度计算都依赖于当前变量值,因此我预计不会有很大的加速(可能只有几个百分点,因为消除了操作调度开销)。
猜你喜欢
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多