verify correctness of dy2static model by using paddle-inference api (#26372)
* verify correctness of dy2static model by using paddle-inference api * update python doc stylerevert-24895-update_cub
parent
d12ac984bf
commit
6e13e86ab3
@ -0,0 +1,103 @@
|
|||||||
|
# Copyright (c) 2020 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.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import paddle
|
||||||
|
import paddle.fluid as fluid
|
||||||
|
|
||||||
|
from paddle.fluid.core import AnalysisConfig
|
||||||
|
from paddle.fluid.core import create_paddle_predictor
|
||||||
|
|
||||||
|
|
||||||
|
class PredictorTools(object):
|
||||||
|
'''
|
||||||
|
Paddle-Inference predictor
|
||||||
|
'''
|
||||||
|
|
||||||
|
def __init__(self, model_path, params_file, feeds_var):
|
||||||
|
'''
|
||||||
|
__init__
|
||||||
|
'''
|
||||||
|
self.model_path = model_path
|
||||||
|
self.params_file = params_file
|
||||||
|
|
||||||
|
self.feeds_var = feeds_var
|
||||||
|
|
||||||
|
def _load_model_and_set_config(self):
|
||||||
|
'''
|
||||||
|
load model from file and set analysis config
|
||||||
|
'''
|
||||||
|
if os.path.exists(os.path.join(self.model_path, self.params_file)):
|
||||||
|
config = AnalysisConfig(
|
||||||
|
os.path.join(self.model_path, "__model__"),
|
||||||
|
os.path.join(self.model_path, self.params_file))
|
||||||
|
else:
|
||||||
|
config = AnalysisConfig(os.path.join(self.model_path))
|
||||||
|
|
||||||
|
if fluid.is_compiled_with_cuda():
|
||||||
|
config.enable_use_gpu(100, 0)
|
||||||
|
else:
|
||||||
|
config.disable_gpu()
|
||||||
|
config.switch_specify_input_names(True)
|
||||||
|
config.switch_use_feed_fetch_ops(False)
|
||||||
|
config.enable_memory_optim()
|
||||||
|
config.disable_glog_info()
|
||||||
|
config.switch_ir_optim(True)
|
||||||
|
|
||||||
|
return config
|
||||||
|
|
||||||
|
def _get_analysis_outputs(self, config):
|
||||||
|
'''
|
||||||
|
Return outputs of paddle inference
|
||||||
|
Args:
|
||||||
|
config (AnalysisConfig): predictor configs
|
||||||
|
Returns:
|
||||||
|
outs (numpy array): forward netwrok prediction outputs
|
||||||
|
'''
|
||||||
|
predictor = create_paddle_predictor(config)
|
||||||
|
tensor_shapes = predictor.get_input_tensor_shape()
|
||||||
|
names = predictor.get_input_names()
|
||||||
|
for i, name in enumerate(names):
|
||||||
|
#assert name in self.feeds_var, '{} not in feeded dict'.format(name)
|
||||||
|
shape = tensor_shapes[name]
|
||||||
|
tensor = predictor.get_input_tensor(name)
|
||||||
|
feed_data = self.feeds_var[i]
|
||||||
|
tensor.copy_from_cpu(np.array(feed_data))
|
||||||
|
if type(feed_data) == fluid.LoDTensor:
|
||||||
|
tensor.set_lod(feed_data.lod())
|
||||||
|
|
||||||
|
# ensure no diff in multiple repeat times
|
||||||
|
repeat_time = 10
|
||||||
|
for i in range(repeat_time):
|
||||||
|
predictor.zero_copy_run()
|
||||||
|
|
||||||
|
output_names = predictor.get_output_names()
|
||||||
|
outs = [
|
||||||
|
predictor.get_output_tensor(out_name).copy_to_cpu()
|
||||||
|
for out_name in output_names
|
||||||
|
]
|
||||||
|
|
||||||
|
return outs
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
'''
|
||||||
|
__call__
|
||||||
|
'''
|
||||||
|
config = self._load_model_and_set_config()
|
||||||
|
outputs = self._get_analysis_outputs(config)
|
||||||
|
|
||||||
|
return outputs
|
Loading…
Reference in new issue