在单个节点嵌套多个操作时 Tensorflow 的性能差异
Performance differences in Tensorflow when nesting multiple operations at a single node
我对 Tensorflow 有点陌生,想知道在构建图形时应该牢记什么样的性能考虑因素。
我的主要问题是,与将每个操作分配给单独的节点相比,当多个操作嵌套在单个节点时,计算性能是否有任何变化。例如,如果我想使用批量归一化,然后是一个密集层和一个 relu,我可以构造它,以便所有三个操作都在单个节点上执行:
input=tf.placeholder(shape=[None,input_len],dtype=tf.float32
output=tf.nn.relu(tf.matmul(tf.contrib.layers.batch_norm(input),W)+b)
或者我可以将它们分成三个单独的节点:
input=tf.placeholder(shape=[None,input_len],dtype=tf.float32
x1=tf.contrib.layers.batch_norm(input)
x2=tf.matmul(x1,W)+b
ouput=tf.nn.relu(x2)
显然这会影响代码的 compactness/readability,但这是否也会影响 TF 实现图形和运行计算的方式?是否不鼓励在单个节点上进行嵌套操作,如果是这样,是因为性能问题,还是仅仅是风格问题?
如果有影响,我对 运行 我在 gpu 上的计算很感兴趣。
两个代码片段将生成相同的 TensorFlow 图,并且生成的图将具有相同的性能特征。
要验证此断言,您可以查看 TensorFlow 通过在 运行 任一代码片段之后调用 print tf.get_default_graph().as_graph_def()
构建的 tf.GraphDef
协议缓冲区。
我对 Tensorflow 有点陌生,想知道在构建图形时应该牢记什么样的性能考虑因素。
我的主要问题是,与将每个操作分配给单独的节点相比,当多个操作嵌套在单个节点时,计算性能是否有任何变化。例如,如果我想使用批量归一化,然后是一个密集层和一个 relu,我可以构造它,以便所有三个操作都在单个节点上执行:
input=tf.placeholder(shape=[None,input_len],dtype=tf.float32
output=tf.nn.relu(tf.matmul(tf.contrib.layers.batch_norm(input),W)+b)
或者我可以将它们分成三个单独的节点:
input=tf.placeholder(shape=[None,input_len],dtype=tf.float32
x1=tf.contrib.layers.batch_norm(input)
x2=tf.matmul(x1,W)+b
ouput=tf.nn.relu(x2)
显然这会影响代码的 compactness/readability,但这是否也会影响 TF 实现图形和运行计算的方式?是否不鼓励在单个节点上进行嵌套操作,如果是这样,是因为性能问题,还是仅仅是风格问题?
如果有影响,我对 运行 我在 gpu 上的计算很感兴趣。
两个代码片段将生成相同的 TensorFlow 图,并且生成的图将具有相同的性能特征。
要验证此断言,您可以查看 TensorFlow 通过在 运行 任一代码片段之后调用 print tf.get_default_graph().as_graph_def()
构建的 tf.GraphDef
协议缓冲区。