@@ -103,108 +103,74 @@ void GetOneBatch(std::vector<PaddleTensor> *input_slots, DataRecord *data,
103
103
input_slots->assign ({input_tensor});
104
104
}
105
105
106
- const int64_t lac_ref_data[] = {24 , 25 , 25 , 25 , 38 , 30 , 31 , 14 , 15 , 44 , 24 , 25 ,
107
- 25 , 25 , 25 , 25 , 44 , 24 , 25 , 25 , 25 , 36 , 42 , 43 ,
108
- 44 , 14 , 15 , 44 , 14 , 15 , 44 , 14 , 15 , 44 , 38 , 39 ,
109
- 14 , 15 , 44 , 22 , 23 , 23 , 23 , 23 , 23 , 23 , 23 };
110
-
111
- void TestLACPrediction (const std::string &model_path,
112
- const std::string &data_file, const int batch_size,
113
- const int repeat, bool use_analysis = false ) {
114
- AnalysisConfig cfg;
115
- cfg.model_dir = model_path;
116
- cfg.use_gpu = false ;
117
- cfg.device = 0 ;
118
- cfg.specify_input_name = true ;
119
- cfg.enable_ir_optim = true ;
106
+ void SetConfig (AnalysisConfig *cfg) {
107
+ cfg->model_dir = FLAGS_infer_model;
108
+ cfg->use_gpu = false ;
109
+ cfg->device = 0 ;
110
+ cfg->specify_input_name = true ;
111
+ cfg->enable_ir_optim = true ;
112
+ }
120
113
121
- std::vector<PaddleTensor> input_slots, outputs_slots;
122
- DataRecord data (data_file, batch_size);
123
- GetOneBatch (&input_slots, &data, batch_size);
124
- std::unique_ptr<PaddlePredictor> predictor;
125
- if (use_analysis) {
126
- predictor =
127
- CreatePaddlePredictor<AnalysisConfig, PaddleEngineKind::kAnalysis >(cfg);
128
- } else {
129
- predictor =
130
- CreatePaddlePredictor<NativeConfig, PaddleEngineKind::kNative >(cfg);
131
- }
132
- for (int i = 0 ; i < FLAGS_burning; i++) {
133
- predictor->Run (input_slots, &outputs_slots);
114
+ void SetInput (std::vector<std::vector<PaddleTensor>> *inputs) {
115
+ DataRecord data (FLAGS_infer_data, FLAGS_batch_size);
116
+ std::vector<PaddleTensor> input_slots;
117
+ int epoch = FLAGS_test_all_data ? data.batched_datas .size () : 1 ;
118
+ LOG (INFO) << " number of samples: " << epoch;
119
+ for (int bid = 0 ; bid < epoch; ++bid) {
120
+ GetOneBatch (&input_slots, &data, FLAGS_batch_size);
121
+ (*inputs).emplace_back (input_slots);
134
122
}
135
- Timer timer;
136
- if (FLAGS_test_all_data) {
137
- LOG (INFO) << " test all data" ;
138
- std::vector<std::vector<PaddleTensor>> input_slots_all;
139
- for (size_t bid = 0 ; bid < data.batched_datas .size (); ++bid) {
140
- GetOneBatch (&input_slots, &data, batch_size);
141
- input_slots_all.emplace_back (input_slots);
142
- }
143
- LOG (INFO) << " total number of samples: " << data.datasets .size ();
144
- TestPrediction (cfg, input_slots_all, &outputs_slots, FLAGS_num_threads);
145
- return ;
146
- }
147
- timer.tic ();
148
- for (int i = 0 ; i < repeat; i++) {
149
- predictor->Run (input_slots, &outputs_slots);
150
- }
151
- PrintTime (batch_size, repeat, 1 , 0 , timer.toc () / repeat);
123
+ }
152
124
153
- // check result
154
- EXPECT_EQ (outputs_slots.size (), 1UL );
155
- auto &out = outputs_slots[0 ];
156
- size_t size = std::accumulate (out.shape .begin (), out.shape .end (), 1 ,
157
- [](int a, int b) { return a * b; });
158
- size_t batch1_size = sizeof (lac_ref_data) / sizeof (int64_t );
159
- PADDLE_ENFORCE_GT (size, 0 );
160
- EXPECT_GE (size, batch1_size);
161
- int64_t *pdata = static_cast <int64_t *>(out.data .data ());
162
- for (size_t i = 0 ; i < batch1_size; ++i) {
163
- EXPECT_EQ (pdata[i], lac_ref_data[i]);
164
- }
125
+ // Easy for profiling independently.
126
+ TEST (Analyzer_LAC, profile) {
127
+ AnalysisConfig cfg;
128
+ SetConfig (&cfg);
129
+ std::vector<PaddleTensor> outputs;
165
130
166
- if (use_analysis) {
167
- // run once for comparion as reference
168
- auto ref_predictor =
169
- CreatePaddlePredictor<NativeConfig, PaddleEngineKind::kNative >(cfg);
170
- std::vector<PaddleTensor> ref_outputs_slots;
171
- ref_predictor->Run (input_slots, &ref_outputs_slots);
172
- CompareResult (ref_outputs_slots, outputs_slots);
131
+ std::vector<std::vector<PaddleTensor>> input_slots_all;
132
+ SetInput (&input_slots_all);
133
+ TestPrediction (cfg, input_slots_all, &outputs, FLAGS_num_threads);
173
134
174
- AnalysisPredictor *analysis_predictor =
175
- dynamic_cast <AnalysisPredictor *>(predictor.get ());
176
- auto &fuse_statis = analysis_predictor->analysis_argument ()
177
- .Get <std::unordered_map<std::string, int >>(
178
- framework::ir::kFuseStatisAttr );
179
- for (auto &item : fuse_statis) {
180
- LOG (INFO) << " fused " << item.first << " " << item.second ;
181
- }
182
- int num_ops = 0 ;
183
- for (auto &node :
184
- analysis_predictor->analysis_argument ().main_dfg ->nodes .nodes ()) {
185
- if (node->IsFunction ()) {
186
- ++num_ops;
187
- }
135
+ if (FLAGS_num_threads == 1 && !FLAGS_test_all_data) {
136
+ // the first inference result
137
+ const int64_t lac_ref_data[] = {
138
+ 24 , 25 , 25 , 25 , 38 , 30 , 31 , 14 , 15 , 44 , 24 , 25 , 25 , 25 , 25 , 25 ,
139
+ 44 , 24 , 25 , 25 , 25 , 36 , 42 , 43 , 44 , 14 , 15 , 44 , 14 , 15 , 44 , 14 ,
140
+ 15 , 44 , 38 , 39 , 14 , 15 , 44 , 22 , 23 , 23 , 23 , 23 , 23 , 23 , 23 };
141
+ PADDLE_ENFORCE_EQ (outputs.size (), 1UL );
142
+ size_t size = GetSize (outputs[0 ]);
143
+ size_t batch1_size = sizeof (lac_ref_data) / sizeof (int64_t );
144
+ PADDLE_ENFORCE_GE (size, batch1_size);
145
+ int64_t *pdata = static_cast <int64_t *>(outputs[0 ].data .data ());
146
+ for (size_t i = 0 ; i < batch1_size; ++i) {
147
+ EXPECT_EQ (pdata[i], lac_ref_data[i]);
188
148
}
189
- LOG (INFO) << " has num ops: " << num_ops;
190
- ASSERT_TRUE (fuse_statis.count (" fc_fuse" ));
191
- ASSERT_TRUE (fuse_statis.count (" fc_gru_fuse" ));
192
- EXPECT_EQ (fuse_statis.at (" fc_fuse" ), 1 );
193
- EXPECT_EQ (fuse_statis.at (" fc_gru_fuse" ), 4 );
194
- EXPECT_EQ (num_ops, 11 );
195
149
}
196
150
}
197
151
198
- TEST (Analyzer_LAC, native) {
199
- LOG (INFO) << " LAC with native" ;
200
- TestLACPrediction (FLAGS_infer_model, FLAGS_infer_data, FLAGS_batch_size,
201
- FLAGS_repeat);
152
+ // Check the fuse status
153
+ TEST (Analyzer_LAC, fuse_statis) {
154
+ AnalysisConfig cfg;
155
+ SetConfig (&cfg);
156
+
157
+ int num_ops;
158
+ auto fuse_statis = GetFuseStatis (cfg, &num_ops);
159
+ ASSERT_TRUE (fuse_statis.count (" fc_fuse" ));
160
+ ASSERT_TRUE (fuse_statis.count (" fc_gru_fuse" ));
161
+ EXPECT_EQ (fuse_statis.at (" fc_fuse" ), 1 );
162
+ EXPECT_EQ (fuse_statis.at (" fc_gru_fuse" ), 4 );
163
+ EXPECT_EQ (num_ops, 11 );
202
164
}
203
165
204
- TEST (Analyzer_LAC, analysis) {
205
- LOG (INFO) << " LAC with analysis" ;
206
- TestLACPrediction (FLAGS_infer_model, FLAGS_infer_data, FLAGS_batch_size,
207
- FLAGS_repeat, true );
166
+ // Compare result of NativeConfig and AnalysisConfig
167
+ TEST (Analyzer_LAC, compare) {
168
+ AnalysisConfig cfg;
169
+ SetConfig (&cfg);
170
+
171
+ std::vector<std::vector<PaddleTensor>> input_slots_all;
172
+ SetInput (&input_slots_all);
173
+ CompareNativeAndAnalysis (cfg, input_slots_all);
208
174
}
209
175
210
176
} // namespace analysis
0 commit comments