什么是Scope融合
为了实现高性能的计算,往往需要对子图中的小算子进行融合,使得融合后的大算子(多对一场景)或小算子组合(多对多场景)可以充分利用硬件加速资源。
在TensorFlow框架中,通过TensorFlow的作用域函数tf.name_scope(),可以将不同的对象及操作放在由tf.name_scope()指定的作用域中,便于在tensorboard中展示清晰的逻辑关系图:
import tensorflow as tf; tf.reset_default_graph() #定义一块名为xx_name_scope的区域,并在其中工作 with tf.name_scope('xx_name_scope'): a = tf.constant(1,name='my_a') b = tf.Variable(2,name='my_b') c = tf.add(a,b,name='my_add') print("a.name = "+a.name) print("b.name = "+b.name) print("c.name = "+c.name) # 保存graph用于tensorboard绘图 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) writer = tf.summary.FileWriter("./test",sess.graph) print(sess.run(c)) writer.close()
输出结果:
a.name = xx_name_scope/my_a:0 b.name = xx_name_scope/my_b:0 c.name = xx_name_scope/my_add:0
从输出结果可以看出,在tf.name_scope()下的所有对象和操作,其name属性前都加了xx_name_scope,用以表示这些内容全在其范围下。
从tensorboard中也可以看到Scope信息:
Scope融合是一种基于Scope来进行融合的能力,把Scope内的多个小算子替换为一个大算子或多个算子组合,以实现效率的提升。例如将tf.layernorm生成的layernorm/batchnorm和layernorm/moments这两个Scope,融合为LayerNorm算子。
当前除了支持基本的Scope内所有算子融合外,还支持更加灵活的融合配置, 例如嵌套式识别、并列式识别、Scope+普通算子识别,如图1所示。
父主题: 概述