analyzer.h 3.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

G
gongweibao 已提交
15 16
#pragma once

17 18
/*
 * This file contains Analyzer, an class that exposed as a library that analyze
Y
Yan Chunwei 已提交
19 20 21
 * and optimize Fluid ProgramDesc for inference. Similar to LLVM, it has
 * multiple flags to
 * control whether an process is applied on the program.
22 23
 *
 * The processes are called Passes in analysis, the Passes are placed in a
Y
Yan Chunwei 已提交
24 25 26 27 28 29
 * pipeline, the first Pass is the FluidToDataFlowGraphPass which transforms a
 * Fluid ProgramDesc to
 * a data flow graph, the last Pass is DataFlowGraphToFluidPass which transforms
 * a data flow graph to a Fluid ProgramDesc. The passes in the middle of the
 * pipeline can be any Passes
 * which take a node or data flow graph as input.
30 31
 *
 * The Analyzer can be used in two methods, the first is a executable file which
Y
Yan Chunwei 已提交
32 33
 * can be used to pre-process the inference model and can be controlled by
 * passing difference command flags;
34
 * the other way is to compose inside the inference API as a runtime pre-process
Y
Yan Chunwei 已提交
35
 * phase in the inference service.
36 37 38
 */

#include <gflags/gflags.h>
T
tensor-tang 已提交
39 40
#include <string>
#include <vector>
X
Xin Pan 已提交
41
#include "paddle/fluid/inference/analysis/analysis_pass.h"
42
#include "paddle/fluid/inference/analysis/flags.h"
43 44
#include "paddle/fluid/inference/analysis/pass_manager.h"

45
namespace paddle {
46 47 48
namespace inference {
namespace analysis {

49 50 51 52 53 54 55
class Analyzer : public OrderedRegistry<PassManager> {
 public:
  // Register all the pass-managers.
  Analyzer();

  void Run(Argument* argument);

56
  Analyzer& DisableIrPasses(const std::vector<std::string>& passes);
W
Wojciech Uss 已提交
57 58 59
  Analyzer& IncludeIrPasses(const std::vector<std::string>& passes);
  Analyzer& IncludeAllIrPasses();
  Analyzer& SetUseMkldnn(bool use_mkldnn);
60

61
  DISABLE_COPY_AND_ASSIGN(Analyzer);
62 63 64 65 66 67 68 69

 private:
  // All avaiable IR passes.
  // The bigger fuse comes first, so that the small operators prefer to be
  // merged in a larger fuse op. The small fusion will not break the pattern of
  // larger fusion.
  const std::vector<std::string> all_ir_passes_{{
      // Manual update the passes here.
T
tensor-tang 已提交
70 71 72 73 74 75 76 77 78 79 80
      "attention_lstm_fuse_pass",       //
      "seqconv_eltadd_relu_fuse_pass",  //
      "embedding_fc_lstm_fuse_pass",    //
      "fc_lstm_fuse_pass",              //
      "mul_lstm_fuse_pass",             //
      "fc_gru_fuse_pass",               //
      "mul_gru_fuse_pass",              //
      "seq_concat_fc_fuse_pass",        //
      "fc_fuse_pass",                   //
      "conv_bn_fuse_pass",              //
      "conv_eltwiseadd_bn_fuse_pass",   //
S
Sylwester Fraczek 已提交
81
#ifdef PADDLE_WITH_MKLDNN
S
Sylwester Fraczek 已提交
82
      "depthwise_conv_mkldnn_pass",             //
83
      "conv_bias_mkldnn_fuse_pass",             //
84 85
      "conv_relu_mkldnn_fuse_pass",             //
      "conv_elementwise_add_mkldnn_fuse_pass",  //
S
Sylwester Fraczek 已提交
86
#endif
87 88 89
  }};

  std::unordered_set<std::string> disabled_ir_passes_;
W
Wojciech Uss 已提交
90 91 92
  // Ir passes to run
  std::vector<std::string> ir_passes_;
  bool use_mkldnn_;
93 94 95 96 97
};

}  // namespace analysis
}  // namespace inference
}  // namespace paddle