代码路径:tensorflow/core/grappler/optimizers
其中meta_optimizer.cc中的RunMetaOptimizer方法的调用触发对图的不同类型的优化操作.
优化操作分为一下几类:
1. pruning.裁剪,比如移除一些无用的操作(一旦图建立之后不再使用的stop gradient节点以及Identity节点),优化梯度计算.
2. constfold.常量打包.
3. layout. 对tensor的layout针对计算库以及设备进行调整.比如cudnn使用NCHW比较高效.
4. memory.
5. arithmetic.
6. autoparallel.
以上optimizer均可以同时使用.
下面我们对以上六种图优化手段逐一进行代码级剖析.
pruning
ModelPruner类有三个成员函数, name()方法返回名称, Optimize方法负责具体的优化操作. Feedback方法.
目的: 将所有不会被执行的节点都裁剪掉. 也就是那些不会被fanin的节点.如果没有指定fetch节点,将假设整个图都将被执行.
不能移除必须被保留的节点(在nodes_to_prserve中);
不能移除驱动control依赖的节点;
不能移除无法确定移除后是否会新增control依赖的节点(比如,移除一个10条control edge同时驱动10条control edge,将新建100条edge);
不能移除与function链接的节点,因为会导致后面内联失败;
不能移除被其它设备驱动的节点,因为使用这些节点能够降低通信开销;
不能移除接收引用值的节点,将引用转换成非引用也不行(可能理解的不大对).
const folding
对图中常量进行合并优化.遍历图中节点,找出完全能够静态计算的节点,也就是说完全依赖于constants输入的.在CPU上将这些节点计算出来,并替换这些节点