运行 Tensorflow 图在不同的输入参数上多次:什么样的循环是有效的?
Running Tensorflow graph multiple times over different input parameters: what kind of loop is efficient?
对于我的特定问题,我需要多次重新运行 一次构建的 Tensorflow 图,每次都将变量重新初始化为新值。图的每次执行都独立于下一个。可以把它想象成建立一个模型,然后对它进行 30 次独立训练,每次模拟都随机初始化。虽然我可以通过将 Session.run() 语句放在 for 循环中来实现上述目标,但我认为这不能保证并行性。
所以问题是:对于 运行 多个独立的 sims,什么是最合适的 Tensorflow 兼容方式?我应该在 python while 循环中执行 session.run() 还是应该使用 Tensorflow while_loop 结构?
您可以做的一件事是像这样构建您的代码:
def build_graph():
[stuffs]
return operations_to_run
operations = []
for graph_no in range(NGRAPHS):
operations.append(build_graph)
with tf.Session() as sess:
sess.run(operations)
这应该允许 tensorflow 负责沿图并行计算。
这是一个有趣的问题,我自己也在研究模型的集合。
首先,循环训练模型是串联的; Python 循环或 tf.while_loop
都不会给你任何跨实例的并行性。话虽这么说,(tf.while_loop
与 tf.slice
相结合可以是处理小批量数据的一种非常有效的方法,尽管是串行的)。
一个起点是查看 "Distributed TensorFlow" 指南 (https://www.tensorflow.org/deploy/distributed)。关于如何生成多个并发(异步)会话有广泛的讨论。您可以在同一台设备上或通过网络创建会话。我认为这能够实现您所想到的那种并行性(作者将 "Between Graph Replication" 与 "Asynchronous Training" 称为 "Between Graph Replication")。
第二个想法是通过向所有张量添加额外的 "instance" 维度,在单个模型中 堆叠 您的实例。您还必须类似地堆叠您的训练数据输入(通过 feed-dict、队列或数据集)。您需要特别注意不要跨单个实例(即新实例维度)交叉 link 个节点,但您可以通过计算共享成本函数和使用标准优化器来同时训练它们。优化后,实例维度中权重和值的每个组件都将代表一个简单的模型。您还可以有一个操作来计算个人成本的向量,以在训练时进行监控。这可能不会加快你的 cpu 的速度(它可能需要实例数 * 单实例时间),但如果你有一个 gpu,它可能有大量额外的并行容量用于这些扩展的矩阵操作与您的单次训练课程相似的周期数。
期待听到适合您的方法!
更新:
在 tf_while_loop
中,我对并行性的理解显然是错误的。来自 (https://www.tensorflow.org/api_docs/python/tf/while_loop:
while_loop implements non-strict semantics, enabling multiple iterations to run in parallel. The maximum number of parallel iterations can be controlled by parallel_iterations, which gives users some control over memory consumption and execution order. For correct programs, while_loop should return the same result for any parallel_iterations > 0.
对于我的特定问题,我需要多次重新运行 一次构建的 Tensorflow 图,每次都将变量重新初始化为新值。图的每次执行都独立于下一个。可以把它想象成建立一个模型,然后对它进行 30 次独立训练,每次模拟都随机初始化。虽然我可以通过将 Session.run() 语句放在 for 循环中来实现上述目标,但我认为这不能保证并行性。
所以问题是:对于 运行 多个独立的 sims,什么是最合适的 Tensorflow 兼容方式?我应该在 python while 循环中执行 session.run() 还是应该使用 Tensorflow while_loop 结构?
您可以做的一件事是像这样构建您的代码:
def build_graph():
[stuffs]
return operations_to_run
operations = []
for graph_no in range(NGRAPHS):
operations.append(build_graph)
with tf.Session() as sess:
sess.run(operations)
这应该允许 tensorflow 负责沿图并行计算。
这是一个有趣的问题,我自己也在研究模型的集合。
首先,循环训练模型是串联的; Python 循环或 tf.while_loop
都不会给你任何跨实例的并行性。话虽这么说,(tf.while_loop
与 tf.slice
相结合可以是处理小批量数据的一种非常有效的方法,尽管是串行的)。
一个起点是查看 "Distributed TensorFlow" 指南 (https://www.tensorflow.org/deploy/distributed)。关于如何生成多个并发(异步)会话有广泛的讨论。您可以在同一台设备上或通过网络创建会话。我认为这能够实现您所想到的那种并行性(作者将 "Between Graph Replication" 与 "Asynchronous Training" 称为 "Between Graph Replication")。
第二个想法是通过向所有张量添加额外的 "instance" 维度,在单个模型中 堆叠 您的实例。您还必须类似地堆叠您的训练数据输入(通过 feed-dict、队列或数据集)。您需要特别注意不要跨单个实例(即新实例维度)交叉 link 个节点,但您可以通过计算共享成本函数和使用标准优化器来同时训练它们。优化后,实例维度中权重和值的每个组件都将代表一个简单的模型。您还可以有一个操作来计算个人成本的向量,以在训练时进行监控。这可能不会加快你的 cpu 的速度(它可能需要实例数 * 单实例时间),但如果你有一个 gpu,它可能有大量额外的并行容量用于这些扩展的矩阵操作与您的单次训练课程相似的周期数。
期待听到适合您的方法!
更新:
在 tf_while_loop
中,我对并行性的理解显然是错误的。来自 (https://www.tensorflow.org/api_docs/python/tf/while_loop:
while_loop implements non-strict semantics, enabling multiple iterations to run in parallel. The maximum number of parallel iterations can be controlled by parallel_iterations, which gives users some control over memory consumption and execution order. For correct programs, while_loop should return the same result for any parallel_iterations > 0.