# Inference Analysis The `inference/analysis` module is used to analyze and optimize the inference program, it references some philosophy from `LLVM/analysis`, and make the various optimization features be pluggable and co-exist in a pipeline. We borrowed some concepts from LLVM, such as - [Pass](../../framework/ir/pass.h)es to implement optimization that traverse the inference program, - [Graph](../../framework/ir/graph.h) to represent the data flow graph built from a program, - [PassManager](./ir_pass_manager.h) to manage a sequence of `Pass`es over a graph. There are some other basic concepts here - [Node](../../framework/ir/node.h), the node in a `Graph`, - `Function`, the Operator in Fluid, - `Value`, the Variable in Fluid; - [Argument](./argument.h), the argument that treat as the input and output of all `Pass`es in the pipeline, ## How it works The `inference/analysis` module make all the passes in a pipeline, and works in such way: 1. Build a `Graph` from a Fluid inference ProgramDesc, 2. Call the middle passes one by one, the same `Graph` is passed across all the passes, 3. Transform a new ProgramDesc from the modified `Graph`. The new optimization features can be added as an independent `Pass` and controlled by gflags, each pass will generate unified debug information or visualization for better debugging. ## Supported Passes ### `FluidToDataFlowGraphPass` Transform the fluid `ProgramDesc` to a `DataFlowGraph` to give an abstract representation for all the middle passes, this should be the first pass of the pipeline. ### `DataFlowGraphToFluidPass` Generate a final `ProgramDesc` from a data flow graph, this should be the last pass of the pipeline. ### `TensorRTSubgraphNodeMarkPass` Mark the `Node` that are supported by TensorRT, this pass will generate a visualization file which can be used for debugging. ### `TensorRTSubGraphPass` Split the sub-graph that are can be accelerated by TensorRT. ### `DFG_GraphvizDrawPass` This pass is just for debug, it will visualize the `DataFlowGraph` using the [graphviz](http://www.graphviz.org) tool. It can be used as a helper class that draws the modified graph after each pass. ## Utilities There is some helper legacy/function/class for analysis. - [dot.h](./dot.h) give a easy to use interface for generating `DOT` codes, - [graph_traits.h](../../framework/ir/graph_traits.h) contains the interfaces of the graph traversal algorithms, it uses `iterator`to make the algorithms easy to share across different passes, there are some implementations in [graph_helper.cc](../../framework/ir/graph_helper.cc) , such as BFS and DFS..