Files
2026-07-13 12:40:42 +08:00

133 lines
4.3 KiB
Python

# Copyright (c) 2023 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 site
import sys
import unittest
import numpy as np
from utils import check_output_allclose
import paddle
from paddle.utils.cpp_extension.extension_utils import run_cmd
class GapTestNet(paddle.nn.Layer):
def __init__(self, gap_op):
super().__init__()
self.test_attr1 = [1, 2, 3]
self.test_attr2 = 1
self.linear = paddle.nn.Linear(96, 1)
self.conv1 = paddle.nn.Conv2D(3, 6, kernel_size=3)
self.conv2 = paddle.nn.Conv2D(6, 3, kernel_size=3)
self.gap = gap_op
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = self.gap(x, self.test_attr1, self.test_attr2)
x = paddle.flatten(x)
x = self.linear(x)
return x
class TestNewCustomOpSetUpInstall(unittest.TestCase):
def setUp(self):
# TODO(ming1753): skip window CI because run_cmd(cmd) filed
if os.name != 'nt':
cur_dir = os.path.dirname(os.path.abspath(__file__))
# compile, install the custom op egg into site-packages under background
cmd = f'cd {cur_dir} && {sys.executable} inference_gap_setup.py install'
run_cmd(cmd)
site_dir = site.getsitepackages()[0]
custom_install_path = [
x for x in os.listdir(site_dir) if 'gap_op_setup' in x
]
assert len(custom_install_path) == 2, (
f"Matched egg number is {len(custom_install_path)}."
)
sys.path.append(os.path.join(site_dir, custom_install_path[0]))
# usage: import the package directly
import gap_op_setup
# `custom_relu_dup` is same as `custom_relu_dup`
self.custom_op = gap_op_setup.gap
# config seed
SEED = 2021
paddle.seed(SEED)
paddle.framework.random._manual_program_seed(SEED)
def test_all(self):
if paddle.is_compiled_with_cuda() and os.name != 'nt':
self._test_static_save_and_run_inference_predictor()
def _test_static_save_and_run_inference_predictor(self):
np_data = np.ones((32, 3, 7, 7)).astype("float32")
path_prefix = "custom_op_inference/inference_gap_op"
model = GapTestNet(self.custom_op)
x = paddle.to_tensor(np_data)
y = model(x)
paddle.jit.save(
model,
path_prefix,
input_spec=[
paddle.static.InputSpec(shape=[32, 3, 7, 7], dtype='float32')
],
)
from paddle.inference import Config, create_predictor
# load inference model
config = Config(path_prefix + ".pdmodel", path_prefix + ".pdiparams")
config.enable_use_gpu(500, 0)
config.enable_tensorrt_engine(
workspace_size=1 << 30,
max_batch_size=1,
min_subgraph_size=0,
precision_mode=paddle.inference.PrecisionType.Float32,
use_static=True,
use_calib_mode=False,
)
config.set_trt_dynamic_shape_info(
{"x": [32, 3, 7, 7]},
{"x": [32, 3, 7, 7]},
{"x": [32, 3, 7, 7]},
)
predictor = create_predictor(config)
input_tensor = predictor.get_input_handle(
predictor.get_input_names()[0]
)
input_tensor.reshape(np_data.shape)
input_tensor.copy_from_cpu(np_data.copy())
predictor.run()
output_tensor = predictor.get_output_handle(
predictor.get_output_names()[0]
)
predict_infer = output_tensor.copy_to_cpu()
predict = y.numpy().flatten()
predict_infer = np.array(predict_infer).flatten()
check_output_allclose(predict, predict_infer, "predict")
if __name__ == '__main__':
unittest.main()