From 84eb2cfccf2da501e8e8ddf27b2600d6b419b796 Mon Sep 17 00:00:00 2001 From: Zeref996 <825276847@qq.com> Date: Mon, 30 Dec 2024 03:44:20 +0000 Subject: [PATCH 1/2] Plt Support torch test, test=model --- .../e2e/PaddleLT_new/engine/paddle_eval.py | 7 +- .../e2e/PaddleLT_new/engine/paddle_eval_bm.py | 2 +- .../e2e/PaddleLT_new/engine/paddle_export.py | 2 +- .../e2e/PaddleLT_new/engine/paddle_infer.py | 2 +- .../e2e/PaddleLT_new/engine/paddle_train.py | 2 +- .../PaddleLT_new/engine/paddle_train_bm.py | 2 +- .../PaddleLT_new/engine/torch_engine_map.py | 7 +- .../e2e/PaddleLT_new/engine/torch_eval.py | 39 +++-- .../PaddleLT_new/generator/builder_data.py | 17 +- .../PaddleLT_new/generator/builder_layer.py | 8 +- framework/e2e/PaddleLT_new/layertest.py | 34 ++-- framework/e2e/PaddleLT_new/run.py | 9 + .../e2e/PaddleLT_new/strategy/compare.py | 144 +++++++++++++--- .../e2e/PaddleLT_new/strategy/ordered_dict.py | 154 ++++++++++++++++++ .../e2e/PaddleLT_new/torch_case/__init__.py | 1 + .../torch_case/layerApicase/__init__.py | 18 ++ .../nn_sublayer/Conv2D_0_class.py | 48 ++++++ .../layerApicase/nn_sublayer/__init__.py | 15 ++ .../layerApicase/nn_sublayer/conv2d_0_func.py | 46 ++++++ .../yaml/dy_eval^torch_dy_eval.yml | 19 +++ 20 files changed, 514 insertions(+), 62 deletions(-) create mode 100644 framework/e2e/PaddleLT_new/strategy/ordered_dict.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/__init__.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/layerApicase/__init__.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/Conv2D_0_class.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/__init__.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/conv2d_0_func.py create mode 100644 framework/e2e/PaddleLT_new/yaml/dy_eval^torch_dy_eval.yml diff --git a/framework/e2e/PaddleLT_new/engine/paddle_eval.py b/framework/e2e/PaddleLT_new/engine/paddle_eval.py index 1aa3ae69e5..b762e2628a 100644 --- a/framework/e2e/PaddleLT_new/engine/paddle_eval.py +++ b/framework/e2e/PaddleLT_new/engine/paddle_eval.py @@ -17,6 +17,8 @@ from pltools.res_save import save_tensor +from strategy.ordered_dict import OrderedDictProcess + class LayerEval(object): """ @@ -24,7 +26,7 @@ class LayerEval(object): """ # def __init__(self, testing, layerfile, device_id): - def __init__(self, testing, layerfile, device_place_id, upstream_net): + def __init__(self, testing, layerfile, device_place_id, upstream_net, orderdict_usage="None"): """ 初始化 """ @@ -37,6 +39,7 @@ def __init__(self, testing, layerfile, device_place_id, upstream_net): self.testing = testing self.upstream_net = upstream_net + self.orderdict_usage = orderdict_usage self.return_net_instance = self.testing.get("return_net_instance", "False") self.model_dtype = self.testing.get("model_dtype") paddle.set_default_dtype(self.model_dtype) @@ -65,6 +68,8 @@ def _net_instant(self): net = self.upstream_net else: net = BuildLayer(layerfile=self.layerfile).get_layer() + if self.orderdict_usage != "None": + net = OrderedDictProcess(net=net, layerfile=self.layerfile, orderdict_usage=self.orderdict_usage).process() return net def _net_input_and_spec(self): diff --git a/framework/e2e/PaddleLT_new/engine/paddle_eval_bm.py b/framework/e2e/PaddleLT_new/engine/paddle_eval_bm.py index b2e32762c0..7e746d560a 100644 --- a/framework/e2e/PaddleLT_new/engine/paddle_eval_bm.py +++ b/framework/e2e/PaddleLT_new/engine/paddle_eval_bm.py @@ -24,7 +24,7 @@ class LayerEvalBM(object): """ # def __init__(self, testing, layerfile, device_id): - def __init__(self, testing, layerfile, device_place_id, upstream_net): + def __init__(self, testing, layerfile, device_place_id, upstream_net, orderdict_usage="None"): """ 初始化 """ diff --git a/framework/e2e/PaddleLT_new/engine/paddle_export.py b/framework/e2e/PaddleLT_new/engine/paddle_export.py index 37c24af99f..8cf30201f9 100644 --- a/framework/e2e/PaddleLT_new/engine/paddle_export.py +++ b/framework/e2e/PaddleLT_new/engine/paddle_export.py @@ -20,7 +20,7 @@ class LayerExport(object): 构建Layer导出的通用类 """ - def __init__(self, testing, layerfile, device_place_id, upstream_net): + def __init__(self, testing, layerfile, device_place_id, upstream_net, orderdict_usage="None"): """ 初始化 """ diff --git a/framework/e2e/PaddleLT_new/engine/paddle_infer.py b/framework/e2e/PaddleLT_new/engine/paddle_infer.py index 7388b651e6..e2fdb49b86 100644 --- a/framework/e2e/PaddleLT_new/engine/paddle_infer.py +++ b/framework/e2e/PaddleLT_new/engine/paddle_infer.py @@ -22,7 +22,7 @@ class LayerInfer(object): 构建Layer预测的通用类 """ - def __init__(self, testing, layerfile, device_place_id, upstream_net): + def __init__(self, testing, layerfile, device_place_id, upstream_net, orderdict_usage="None"): """ 初始化 """ diff --git a/framework/e2e/PaddleLT_new/engine/paddle_train.py b/framework/e2e/PaddleLT_new/engine/paddle_train.py index 229e84d4b9..85dc3d6d10 100644 --- a/framework/e2e/PaddleLT_new/engine/paddle_train.py +++ b/framework/e2e/PaddleLT_new/engine/paddle_train.py @@ -24,7 +24,7 @@ class LayerTrain(object): """ # def __init__(self, testing, layerfile, device_id): - def __init__(self, testing, layerfile, device_place_id, upstream_net): + def __init__(self, testing, layerfile, device_place_id, upstream_net, orderdict_usage="None"): """ 初始化 """ diff --git a/framework/e2e/PaddleLT_new/engine/paddle_train_bm.py b/framework/e2e/PaddleLT_new/engine/paddle_train_bm.py index 88119604fa..a9ece91d31 100644 --- a/framework/e2e/PaddleLT_new/engine/paddle_train_bm.py +++ b/framework/e2e/PaddleLT_new/engine/paddle_train_bm.py @@ -26,7 +26,7 @@ class LayerTrainBM(object): """ # def __init__(self, testing, layerfile, device_id): - def __init__(self, testing, layerfile, device_place_id, upstream_net): + def __init__(self, testing, layerfile, device_place_id, upstream_net, orderdict_usage="None"): """ 初始化 """ diff --git a/framework/e2e/PaddleLT_new/engine/torch_engine_map.py b/framework/e2e/PaddleLT_new/engine/torch_engine_map.py index 54eef538d8..e7c25e0402 100644 --- a/framework/e2e/PaddleLT_new/engine/torch_engine_map.py +++ b/framework/e2e/PaddleLT_new/engine/torch_engine_map.py @@ -7,12 +7,13 @@ """ from engine.torch_eval import TorchLayerEval -from engine.torch_eval_bm import TorchLayerEvalBM + +# from engine.torch_eval_bm import TorchLayerEvalBM # from interpreter.testing_trans import TrainTrans, EvalTrans torch_engine_map = { - "dy_eval": TorchLayerEval, - "dy_eval_perf": TorchLayerEvalBM, # 动态图评估性能 + "torch_dy_eval": TorchLayerEval, + # "torch_dy_eval_perf": TorchLayerEvalBM, # 动态图评估性能 } diff --git a/framework/e2e/PaddleLT_new/engine/torch_eval.py b/framework/e2e/PaddleLT_new/engine/torch_eval.py index bae3529003..f609c182aa 100644 --- a/framework/e2e/PaddleLT_new/engine/torch_eval.py +++ b/framework/e2e/PaddleLT_new/engine/torch_eval.py @@ -6,12 +6,15 @@ eval 方法 """ import os +import traceback import numpy as np import torch from engine.torch_xtools import reset from generator.builder_layer import BuildLayer from generator.builder_data import BuildData +from strategy.ordered_dict import OrderedDictProcess + class TorchLayerEval(object): """ @@ -19,7 +22,7 @@ class TorchLayerEval(object): """ # def __init__(self, testing, layerfile, device_id): - def __init__(self, testing, layerfile): + def __init__(self, testing, layerfile, device_place_id, upstream_net, orderdict_usage="None"): """ 初始化 """ @@ -27,28 +30,44 @@ def __init__(self, testing, layerfile): reset(self.seed) self.device = os.environ.get("PLT_SET_DEVICE") - torch.device(str(self.device)) + torch.device(f"cuda:{device_place_id}") self.testing = testing + self.upstream_net = upstream_net + self.orderdict_usage = orderdict_usage + self.return_net_instance = self.testing.get("return_net_instance", "False") self.model_dtype = self.testing.get("model_dtype") - # torch.set_default_dtype(self.model_dtype) # torch不支持字符串dtype, 测试框架暂时没兼容 self.layerfile = layerfile - self.data = BuildData(layerfile=self.layerfile).get_single_data() + # self.data = BuildData(layerfile=self.layerfile).get_single_data() + + def _net_input(self): + """get input""" + reset(self.seed) + data = BuildData(layerfile=self.layerfile).get_single_data(framework="torch") + return data def _net_instant(self): - """get net and data""" + """get net""" reset(self.seed) - net = BuildLayer(layerfile=self.layerfile).get_layer() + if self.upstream_net: + net = self.upstream_net + else: + net = BuildLayer(layerfile=self.layerfile).get_layer() + if self.orderdict_usage != "None": + net = OrderedDictProcess(net=net, layerfile=self.layerfile, orderdict_usage=self.orderdict_usage).process() return net - def dy_eval(self): + def torch_dy_eval(self): """dygraph eval""" net = self._net_instant() - # net.eval() - logit = net(*self.data) - return {"logit": logit} + net.eval() + logit = net(*self._net_input()) + if self.return_net_instance == "True": + return {"res": {"logit": logit}, "net": net} + else: + return {"res": {"logit": logit}, "net": None} # def dy2st_eval(self): # """dy2st eval""" diff --git a/framework/e2e/PaddleLT_new/generator/builder_data.py b/framework/e2e/PaddleLT_new/generator/builder_data.py index 919bfee9e4..d00c1aed3e 100644 --- a/framework/e2e/PaddleLT_new/generator/builder_data.py +++ b/framework/e2e/PaddleLT_new/generator/builder_data.py @@ -9,7 +9,7 @@ import itertools import numpy as np -if os.environ.get("FRAMEWORK") == "paddle": +if "paddle" in os.environ.get("FRAMEWORK"): import paddle import diy import layerApicase @@ -21,9 +21,10 @@ elif os.environ.get("USE_PADDLE_MODEL", "None") == "PaddleNLP": import layerNLPcase import paddlenlp -elif os.environ.get("FRAMEWORK") == "torch": + +if "torch" in os.environ.get("FRAMEWORK"): import torch - import layerTorchcase + import torch_case import pltools.np_tool as tool @@ -36,7 +37,7 @@ def __init__(self, layerfile): self.layerfile = layerfile self.layer_module = eval(self.layerfile) - def get_single_data(self): + def get_single_data(self, framework="paddle"): """get data""" if hasattr(self.layer_module, "create_numpy_inputs"): # dataname = self.layerfile + ".create_numpy_inputs()" @@ -46,24 +47,24 @@ def get_single_data(self): if isinstance(i, (tuple, list)): # 为了适配list输入的模型子图 tmp = [] for j in i: - if os.environ.get("FRAMEWORK") == "paddle": + if framework == "paddle": if j.dtype == np.int64 or j.dtype == np.int32: tmp.append(paddle.to_tensor(j, stop_gradient=True)) else: tmp.append(paddle.to_tensor(j, stop_gradient=False)) - elif os.environ.get("FRAMEWORK") == "torch": + elif framework == "torch": if j.dtype == np.int64 or j.dtype == np.int32: tmp.append(torch.tensor(j, requires_grad=False)) else: tmp.append(torch.tensor(j, requires_grad=True)) data.append(tmp) elif isinstance(i, np.ndarray): - if os.environ.get("FRAMEWORK") == "paddle": + if framework == "paddle": if i.dtype == np.int64 or i.dtype == np.int32: data.append(paddle.to_tensor(i, stop_gradient=True)) else: data.append(paddle.to_tensor(i, stop_gradient=False)) - elif os.environ.get("FRAMEWORK") == "torch": + elif framework == "torch": if i.dtype == np.int64 or i.dtype == np.int32: data.append(torch.tensor(i, requires_grad=False)) else: diff --git a/framework/e2e/PaddleLT_new/generator/builder_layer.py b/framework/e2e/PaddleLT_new/generator/builder_layer.py index 95dff660c2..9039ab6891 100644 --- a/framework/e2e/PaddleLT_new/generator/builder_layer.py +++ b/framework/e2e/PaddleLT_new/generator/builder_layer.py @@ -7,7 +7,8 @@ import os -if os.environ.get("FRAMEWORK") == "paddle": +# if os.environ.get("FRAMEWORK") == "paddle": +if "paddle" in os.environ.get("FRAMEWORK"): import paddle import diy import layerApicase @@ -21,9 +22,10 @@ import paddlenlp os.system("cd /root/.paddlenlp && rm -rf models") -elif os.environ.get("FRAMEWORK") == "torch": + +if "torch" in os.environ.get("FRAMEWORK"): import torch - import layerTorchcase + import torch_case class BuildLayer(object): diff --git a/framework/e2e/PaddleLT_new/layertest.py b/framework/e2e/PaddleLT_new/layertest.py index 87cb2734dc..0d5d8eec4f 100644 --- a/framework/e2e/PaddleLT_new/layertest.py +++ b/framework/e2e/PaddleLT_new/layertest.py @@ -10,7 +10,7 @@ import traceback # from engine.engine_map import engine_map -from strategy.compare import base_compare, infer_compare +from strategy.compare import base_compare, infer_compare, torch_compare from pltools.yaml_loader import YamlLoader from pltools.logger import Logger from pltools.res_save import save_tensor, load_tensor, save_pickle @@ -59,17 +59,21 @@ def del_core_dump(self): # 如果删除过程中发生错误(比如文件不存在或没有权限),则打印错误信息 self.logger.get_log().warning(f"Error deleting {filepath}: {e.strerror}") - def _single_run(self, testing, layerfile, device_place_id=0, upstream_net=None): + def _single_run( + self, testing, layerfile, device_place_id=0, upstream_net=None, framework="paddle", orderdict_usage="None" + ): """ 单次执行器测试 :param testing: 'dy_train', 'dy_eval'... :return: """ - if os.environ.get("FRAMEWORK") == "paddle": - from engine.paddle_engine_map import paddle_engine_map as engine_map - elif os.environ.get("FRAMEWORK") == "torch": + if framework == "torch": from engine.torch_engine_map import torch_engine_map as engine_map + layerfile = "torch_case." + layerfile + else: + from engine.paddle_engine_map import paddle_engine_map as engine_map + engine = testing if "layertest_engine_cover" in self.test_config.yml: # 执行器覆盖配置 if testing in self.test_config.yml.get("layertest_engine_cover"): @@ -82,6 +86,7 @@ def _single_run(self, testing, layerfile, device_place_id=0, upstream_net=None): layerfile=layerfile, device_place_id=device_place_id, upstream_net=upstream_net, + orderdict_usage=orderdict_usage, ) res = getattr(layer_test, engine)() return res @@ -103,7 +108,12 @@ def _case_run(self): if self.testings.get(testing).get("use_upstream_net_instance", "False") == "False": net = None res = self._single_run( - testing=testing, layerfile=self.layerfile, device_place_id=self.device_place_id, upstream_net=net + testing=testing, + layerfile=self.layerfile, + device_place_id=self.device_place_id, + upstream_net=net, + framework=self.testings.get(testing).get("framework", "paddle"), + orderdict_usage=self.testings.get(testing).get("orderdict_usage", "None"), ) if isinstance(res, dict): res_dict[testing] = res.get("res", None) @@ -168,10 +178,12 @@ def _case_run(self): else: precision = comparing.get("precision") if comparing.get("compare_method", "base_compare") == "infer_compare": - compare_methon = infer_compare + compare_method = infer_compare + elif comparing.get("compare_method", "base_compare") == "torch_compare": + compare_method = torch_compare else: - compare_methon = base_compare - compare_res = compare_methon( + compare_method = base_compare + compare_res = compare_method( result=result, expect=expect, res_name=latest, @@ -245,8 +257,8 @@ def _perf_unit_case_run(self, plt_exc): if __name__ == "__main__": - # layerfile = "layercase/sublayer1000/Clas_cases/Twins_alt_gvt_base/SIR_136.py" - # testing = "yaml/dy^dy2stcinn_train_inputspec.yml" + # layerfile = "layerApicase/nn_sublayer/Conv2D_0_class.py" + # testing = "yaml/dy_eval^torch_dy_eval.yml" # single_test = LayerTest(title=layerfile, layerfile=layerfile, testing=testing) # single_test._case_run() # exit(0) diff --git a/framework/e2e/PaddleLT_new/run.py b/framework/e2e/PaddleLT_new/run.py index ac34a3e788..4feab89031 100644 --- a/framework/e2e/PaddleLT_new/run.py +++ b/framework/e2e/PaddleLT_new/run.py @@ -89,6 +89,15 @@ def __init__(self): f"&& {self.py_cmd} -m pip install emoji && {self.py_cmd} -m pip install ftfy " f"&& {self.py_cmd} -m pip install unidecode " ) + elif os.environ.get("FRAMEWORK") == "torch": + self.logger.get_log().info("开始安转torch release版本") + os.system( + f"{self.py_cmd} -m pip install torch torchvision torchaudio " + "--index-url https://download.pytorch.org/whl/cu118" + ) + import torch + + self.logger.get_log().info(f"Torch框架版本: {torch.__version__}") # 下载ground truth用于跨硬件测试 plt_gt_download_url = os.environ.get("PLT_GT_DOWNLOAD_URL") diff --git a/framework/e2e/PaddleLT_new/strategy/compare.py b/framework/e2e/PaddleLT_new/strategy/compare.py index 0abf243a8d..a7d12b6ba7 100644 --- a/framework/e2e/PaddleLT_new/strategy/compare.py +++ b/framework/e2e/PaddleLT_new/strategy/compare.py @@ -15,15 +15,15 @@ from pltools.logger import Logger -framework = "" -if os.environ.get("FRAMEWORK") == "paddle": +# framework = "" +if "paddle" in os.environ.get("FRAMEWORK"): import paddle - framework = "paddle" -elif os.environ.get("FRAMEWORK") == "torch": + # framework = "paddle" +if "torch" in os.environ.get("FRAMEWORK"): import torch - framework = "torch" + # framework = "torch" def base_compare(result, expect, res_name, exp_name, logger, delta=1e-10, rtol=1e-10, exc_dict={}): @@ -46,21 +46,11 @@ def base_compare(result, expect, res_name, exp_name, logger, delta=1e-10, rtol=1 if result is None: Logger("PLT_compare").get_log().info(f"{res_name} 结果为None, 所以跳过 {exp_name} 和 {res_name} 精度对比") pass - elif isinstance(expect, eval(f"{framework}.Tensor")) or isinstance(expect, np.ndarray): - if isinstance(result, eval(f"{framework}.Tensor")): - if framework == "torch": - result = result.detach().numpy() - elif framework == "paddle": - result = result.numpy() - else: - result = result.numpy() - if isinstance(expect, eval(f"{framework}.Tensor")): - if framework == "torch": - expect = expect.detach().numpy() - elif framework == "paddle": - expect = expect.numpy() - else: - expect = expect.numpy() + elif isinstance(expect, eval("paddle.Tensor")) or isinstance(expect, np.ndarray): + if isinstance(result, eval("paddle.Tensor")): + result = result.numpy() + if isinstance(expect, eval("paddle.Tensor")): + expect = expect.numpy() # res = np.allclose(result, expect, atol=delta, rtol=rtol, equal_nan=True) # # 出错打印错误数据 # if res is False: @@ -116,7 +106,7 @@ def base_compare(result, expect, res_name, exp_name, logger, delta=1e-10, rtol=1 Logger("PLT_compare").get_log().info(f"{exp_name} 有 {k}, 但是 {res_name} 没有 {k}, 所以跳过 {k} 精度对比") elif isinstance(expect, list) or isinstance(expect, tuple): for i, element in enumerate(expect): - if isinstance(result, (np.generic, np.ndarray)) or isinstance(result, eval(f"{framework}.Tensor")): + if isinstance(result, (np.generic, np.ndarray)) or isinstance(result, eval("paddle.Tensor")): if i > 0: break base_compare( @@ -185,6 +175,118 @@ def infer_compare(result, expect, res_name, exp_name, logger, delta=1e-10, rtol= return exc_dict +def torch_compare(result, expect, res_name, exp_name, logger, delta=1e-10, rtol=1e-10, exc_dict={}): + """ + 比较函数 + :param result: 待测值 + :param expect: 基线值 + :param delta: 误差值 + :param rtol: 相对误差 + :return: + """ + if isinstance(result, str): + raise Exception("result is exception !!!") + if isinstance(expect, str): + raise Exception("expect is exception !!!") + + if expect is None or result is None: + if expect is None: + Logger("PLT_compare").get_log().info(f"{exp_name} 结果为None, 所以跳过 {exp_name} 和 {res_name} 精度对比") + if result is None: + Logger("PLT_compare").get_log().info(f"{res_name} 结果为None, 所以跳过 {exp_name} 和 {res_name} 精度对比") + pass + elif torch.is_tensor(expect) or isinstance(expect, np.ndarray): + if isinstance(result, eval("paddle.Tensor")): + result = result.numpy() + if torch.is_tensor(expect): + expect = expect.detach().numpy() + # res = np.allclose(result, expect, atol=delta, rtol=rtol, equal_nan=True) + # # 出错打印错误数据 + # if res is False: + # diff = abs(result - expect) + # # logger.error("{} is: {}".format(exp_name, expect)) + # # logger.error("{} is: {}".format(res_name, result)) + # logger.error("{} and {} has diff! max diff: {}".format(exp_name, res_name, np.amax(diff))) + + try: + np.testing.assert_allclose(actual=result, desired=expect, atol=delta, rtol=rtol, equal_nan=True) + + if result.dtype != expect.dtype: + logger.warn( + "Different output data types! res type is: {}, and expect type is: {}".format( + result.dtype, expect.dtype + ) + ) + # assert res + assert result.shape == expect.shape + assert result.dtype == expect.dtype + except Exception: + exc_dict[res_name] = traceback.format_exc() + logger.warn(traceback.format_exc()) + + elif isinstance(expect, dict): + if "multi_result" in result: + # 专用于多个结果比较, 例如多种inputspec. 只有result会有多个结果, 想法expect固定为一个 + for i, logit_dict in enumerate(result["multi_result"]): + torch_compare( + result=logit_dict, + expect=expect, + res_name=res_name + f"multi_result[{i}]", + exp_name=exp_name, + logger=logger, + delta=delta, + rtol=rtol, + exc_dict=exc_dict, + ) + else: + for k, v in expect.items(): + if k in result: + torch_compare( + result=result[k], + expect=expect[k], + res_name=res_name + "[{}]".format(str(k)), + exp_name=exp_name + "[{}]".format(str(k)), + logger=logger, + delta=delta, + rtol=rtol, + exc_dict=exc_dict, + ) + else: + Logger("PLT_compare").get_log().info(f"{exp_name} 有 {k}, 但是 {res_name} 没有 {k}, 所以跳过 {k} 精度对比") + elif isinstance(expect, list) or isinstance(expect, tuple): + for i, element in enumerate(expect): + if isinstance(result, (np.generic, np.ndarray)) or isinstance(result, eval("paddle.Tensor")): + if i > 0: + break + torch_compare( + result=result, + expect=expect[i], + res_name=res_name + "[{}]".format(str(i)), + exp_name=exp_name + "[{}]".format(str(i)), + logger=logger, + delta=delta, + rtol=rtol, + exc_dict=exc_dict, + ) + else: + torch_compare( + result=result[i], + expect=expect[i], + res_name=res_name + "[{}]".format(str(i)), + exp_name=exp_name + "[{}]".format(str(i)), + logger=logger, + delta=delta, + rtol=rtol, + exc_dict=exc_dict, + ) + elif isinstance(expect, (bool, int, float)): + assert expect == result + else: + raise Exception("expect is unknown data struction in compare_tool!!!") + + return exc_dict + + def perf_compare_legacy(baseline, latest): """ 比较函数 diff --git a/framework/e2e/PaddleLT_new/strategy/ordered_dict.py b/framework/e2e/PaddleLT_new/strategy/ordered_dict.py new file mode 100644 index 0000000000..aa17844ba6 --- /dev/null +++ b/framework/e2e/PaddleLT_new/strategy/ordered_dict.py @@ -0,0 +1,154 @@ +#!/bin/env python3 +# -*- coding: utf-8 -*- +# @author Zeref996 +# encoding=utf-8 vi:ts=4:sw=4:expandtab:ft=python +""" +模型OrderedDict处理工具 +""" +import os +import traceback +import numpy as np + +from pltools.res_save import save_pickle, load_pickle + +if "paddle" in os.environ.get("FRAMEWORK"): + import paddle + + # import layerApicase + # import layercase + + if os.environ.get("USE_PADDLE_MODEL", "None") == "PaddleOCR": + import layerOCRcase + import PaddleOCR + elif os.environ.get("USE_PADDLE_MODEL", "None") == "PaddleNLP": + import layerNLPcase + import paddlenlp + +if "torch" in os.environ.get("FRAMEWORK"): + import torch + + # import torch_case + + +class OrderedDictProcess(object): + """ + 用于处理OrderedDict + """ + + # def __init__(self, testing, layerfile, device_id): + def __init__(self, net, layerfile, orderdict_usage): + """ + 初始化 + """ + self.net = net + self.orderdict_usage = orderdict_usage + self.layerfile = layerfile + # self.modelpath = self.layerfile.replace(".py", "").rsplit(".", 1)[0].replace(".", "/") + self.layername = self.layerfile.replace(".py", "").rsplit(".", 1)[1].replace(".", "/") + + if isinstance(self.net, torch.nn.Module): + self.framework = "torch" + self.modelpath = ( + self.layerfile.replace(".py", "").rsplit(".", 1)[0].replace(".", "/").replace("torch_case/", "") + ) + elif isinstance(self.net, paddle.nn.Layer): + self.framework = "paddle" + self.modelpath = self.layerfile.replace(".py", "").rsplit(".", 1)[0].replace(".", "/") + else: + raise ValueError("Unknown framework model in OrderedDictProcess") + + # self.path = os.path.join(os.getcwd(), "orderdict_save", self.framework, self.modelpath, self.layername) + # os.makedirs(os.path.join(os.getcwd(), "orderdict_save", self.framework, self.modelpath), exist_ok=True) + + self.path = os.path.join(os.getcwd(), "orderdict_save", self.modelpath, self.layername) + os.makedirs(os.path.join(os.getcwd(), "orderdict_save", self.modelpath), exist_ok=True) + + def save_ordered_dict(self): + """ + 保存OrderedDict到文件 + """ + pickle_dict = {} + # print('self.net.state_dict() is: ', self.net.state_dict()) + for key, value in self.net.state_dict().items(): + pickle_dict[key] = value.numpy() + # print('save pickle_dict[key] is: ', pickle_dict[key]) + save_pickle(pickle_dict, self.path) + # eval(f"{self.framework}.save")(self.net.state_dict(), self.path) + + def load_ordered_dict(self): + """ + 加载文件中的OrderedDict + """ + ordered_dict = {} + loaded_data = load_pickle(self.path + ".pickle") + if self.framework == "paddle": + for key, value in loaded_data.items(): + ordered_dict[key] = paddle.to_tensor(value) + # print('load ordered_dict[key] is: ', ordered_dict[key]) + # save_pickle(pickle_dict, self.path) + elif self.framework == "torch": + for key, value in loaded_data.items(): + ordered_dict[key] = torch.tensor(value) + # print('load ordered_dict[key] is: ', ordered_dict[key]) + # ordered_dict = eval(f"{self.framework}.load")(self.path) + # print('ordered_dict is: ', ordered_dict) + return ordered_dict + + def set_ordered_dict(self): + """ + 保存OrderedDict到文件 + :param path: 路径 + """ + loaded_ordered_dict = self.load_ordered_dict() + # net_ordered_dict = self.net.state_dict() + # for key, value in loaded_ordered_dict.items(): + # net_ordered_dict[key] = paddle.to_tensor(value.numpy()) + + if self.framework == "torch": + self.net.load_state_dict(loaded_ordered_dict) + elif self.framework == "paddle": + self.net.set_state_dict(loaded_ordered_dict) + + return self.net + + def process(self): + """ + 处理OrderedDict + """ + if self.orderdict_usage == "save": + self.save_ordered_dict() + elif self.orderdict_usage == "load": + self.net = self.set_ordered_dict() + return self.net + + +if __name__ == "__main__": + + class LayerCase(paddle.nn.Layer): + """ + demo + """ + + def __init__(self): + super().__init__() + self.conv = paddle.nn.Conv2D( + in_channels=1, out_channels=1, kernel_size=3, padding=0, weight_attr=None, bias_attr=None + ) + + def forward(self, x): + """ + forward + """ + return self.conv(x) + + # class LayerCase(torch.nn.Module): + # def __init__(self): + # super().__init__() + # self.conv = torch.nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, padding=0, bias=False) + + # def forward(self, x): + # return self.conv(x) + + net = LayerCase() + odp = OrderedDictProcess(net, "layerApicase.nn_sublayer.Conv1D_2_class") + odp.save_ordered_dict() diff --git a/framework/e2e/PaddleLT_new/torch_case/__init__.py b/framework/e2e/PaddleLT_new/torch_case/__init__.py new file mode 100644 index 0000000000..1bb04bce98 --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/__init__.py @@ -0,0 +1 @@ +import torch_case.layerApicase diff --git a/framework/e2e/PaddleLT_new/torch_case/layerApicase/__init__.py b/framework/e2e/PaddleLT_new/torch_case/layerApicase/__init__.py new file mode 100644 index 0000000000..73e4148f4c --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/layerApicase/__init__.py @@ -0,0 +1,18 @@ +import os +import glob + +# 获取当前文件所在目录 +current_dir = os.path.dirname(__file__) + +# 获取当前目录下所有的文件夹路径(注意:这里不需要尾随的斜杠) +folders = glob.glob(os.path.join(current_dir, '*')) + +# 过滤出文件夹(排除文件) +folders = [folder for folder in folders if os.path.isdir(folder) and not os.path.basename(folder) == '__pycache__'] + +# 动态导入所有 .py 文件 +for folder in folders: + # 获取文件名(不含扩展名) + module_name = os.path.basename(folder) + # 导入模块 + __import__('torch_case.layerApicase.' + module_name, globals(), locals(), []) diff --git a/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/Conv2D_0_class.py b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/Conv2D_0_class.py new file mode 100644 index 0000000000..c09877a5b0 --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/Conv2D_0_class.py @@ -0,0 +1,48 @@ +import numpy as np +from pkg_resources import require +import torch + + +class LayerCase(torch.nn.Module): + """ + case名称: Conv2D_0 + api简介: 2维卷积 + """ + + def __init__(self): + super(LayerCase, self).__init__() + self.func = torch.nn.Conv2d(kernel_size=[3, 3], in_channels=3, out_channels=1, ) + + def forward(self, data, ): + """ + forward + """ + + torch.manual_seed(33) + np.random.seed(33) + out = self.func(data, ) + return out + + + +# def create_inputspec(): +# inputspec = ( +# torch.static.InputSpec(shape=(-1, 3, -1, -1), dtype=torch.float32, stop_gradient=False), +# ) +# return inputspec + +def create_tensor_inputs(): + """ + torch tensor + """ + inputs = (torch.tensor(-1 + (1 - -1) * np.random.random([2, 3, 4, 4]).astype('float32'), dtype='float32', requires_grad=True), ) + return inputs + + +def create_numpy_inputs(): + """ + numpy array + """ + inputs = (-1 + (1 - -1) * np.random.random([2, 3, 4, 4]).astype('float32'), ) + return inputs + diff --git a/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/__init__.py b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/__init__.py new file mode 100644 index 0000000000..7c2afee424 --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/__init__.py @@ -0,0 +1,15 @@ +import os +import glob + +# 获取当前文件所在目录 +current_dir = os.path.dirname(__file__) + +# 获取当前目录下所有的 .py 文件路径 +py_files = glob.glob(os.path.join(current_dir, "*.py")) + +# 动态导入所有 .py 文件 +for py_file in py_files: + # 获取文件名(不含扩展名) + module_name = os.path.basename(py_file)[:-3] + # 导入模块 + __import__('torch_case.layerApicase.nn_sublayer.' + module_name, globals(), locals(), []) diff --git a/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/conv2d_0_func.py b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/conv2d_0_func.py new file mode 100644 index 0000000000..f9ce0782be --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/conv2d_0_func.py @@ -0,0 +1,46 @@ +import numpy as np +import torch + + +class LayerCase(torch.nn.Module): + """ + case名称: conv2d_0 + api简介: 2维卷积 + """ + + def __init__(self): + super(LayerCase, self).__init__() + + def forward(self, x, ): + """ + forward + """ + + torch.manual_seed(33) + np.random.seed(33) + out = torch.nn.functional.conv2d(x, weight=torch.tensor(-1 + (1 - -1) * np.random.random([3, 1, 2, 2]).astype('float32'), dtype=torch.float32, requires_grad=True), padding=0, groups=1, ) + return out + + + +# def create_inputspec(): +# inputspec = ( +# torch.static.InputSpec(shape=(-1, 1, -1, -1), dtype=torch.float32, stop_gradient=False), +# ) +# return inputspec + +def create_tensor_inputs(): + """ + torch tensor + """ + inputs = (torch.tensor(-1 + (1 - -1) * np.random.random([3, 1, 3, 3]).astype('float32'), dtype=torch.float32, requires_grad=True), ) + return inputs + + +def create_numpy_inputs(): + """ + numpy array + """ + inputs = (-1 + (1 - -1) * np.random.random([3, 1, 3, 3]).astype('float32'), ) + return inputs + diff --git a/framework/e2e/PaddleLT_new/yaml/dy_eval^torch_dy_eval.yml b/framework/e2e/PaddleLT_new/yaml/dy_eval^torch_dy_eval.yml new file mode 100644 index 0000000000..cf366c8292 --- /dev/null +++ b/framework/e2e/PaddleLT_new/yaml/dy_eval^torch_dy_eval.yml @@ -0,0 +1,19 @@ +testings: + torch_dy_eval: + framework: "torch" + orderdict_usage: "save" + model_dtype: "float32" + + dy_eval: + framework: "paddle" + orderdict_usage: "load" + model_dtype: "float32" + +compare: + - + baseline: 'torch_dy_eval' + latest: 'dy_eval' + compare_method: "torch_compare" + precision: + delta: 0.00001 + rtol: 0.000001 From 6882db6337d96907c3ee2f2c5e63b438b1404d6c Mon Sep 17 00:00:00 2001 From: Zeref996 <825276847@qq.com> Date: Mon, 30 Dec 2024 09:36:20 +0000 Subject: [PATCH 2/2] Plt Support torch test, test=model --- .../e2e/PaddleLT_new/layerApicase/__init__.py | 2 + .../math_extreme_size/__init__.py | 15 ++++++ .../math_extreme_size/abs_giant_size_func.py | 46 ++++++++++++++++++ .../Conv2D_giant_size_class.py | 47 +++++++++++++++++++ .../layerApicase/nn_extreme_size/__init__.py | 15 ++++++ .../math_extreme_size/__init__.py | 15 ++++++ .../math_extreme_size/abs_giant_size_func.py | 39 +++++++++++++++ .../Conv2D_giant_size_class.py | 39 +++++++++++++++ .../layerApicase/nn_extreme_size/__init__.py | 15 ++++++ .../nn_sublayer/AdaptiveAvgPool3D_8_class.py | 39 +++++++++++++++ 10 files changed, 272 insertions(+) create mode 100644 framework/e2e/PaddleLT_new/layerApicase/math_extreme_size/__init__.py create mode 100644 framework/e2e/PaddleLT_new/layerApicase/math_extreme_size/abs_giant_size_func.py create mode 100644 framework/e2e/PaddleLT_new/layerApicase/nn_extreme_size/Conv2D_giant_size_class.py create mode 100644 framework/e2e/PaddleLT_new/layerApicase/nn_extreme_size/__init__.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/layerApicase/math_extreme_size/__init__.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/layerApicase/math_extreme_size/abs_giant_size_func.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_extreme_size/Conv2D_giant_size_class.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_extreme_size/__init__.py create mode 100644 framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/AdaptiveAvgPool3D_8_class.py diff --git a/framework/e2e/PaddleLT_new/layerApicase/__init__.py b/framework/e2e/PaddleLT_new/layerApicase/__init__.py index 2a1899ce9a..337073fcca 100644 --- a/framework/e2e/PaddleLT_new/layerApicase/__init__.py +++ b/framework/e2e/PaddleLT_new/layerApicase/__init__.py @@ -1,3 +1,5 @@ import layerApicase.perf_monitor import layerApicase.nn_sublayer +import layerApicase.nn_extreme_size import layerApicase.math_sublayer +import layerApicase.math_extreme_size diff --git a/framework/e2e/PaddleLT_new/layerApicase/math_extreme_size/__init__.py b/framework/e2e/PaddleLT_new/layerApicase/math_extreme_size/__init__.py new file mode 100644 index 0000000000..7f0cb86fe7 --- /dev/null +++ b/framework/e2e/PaddleLT_new/layerApicase/math_extreme_size/__init__.py @@ -0,0 +1,15 @@ +import os +import glob + +# 获取当前文件所在目录 +current_dir = os.path.dirname(__file__) + +# 获取当前目录下所有的 .py 文件路径 +py_files = glob.glob(os.path.join(current_dir, "*.py")) + +# 动态导入所有 .py 文件 +for py_file in py_files: + # 获取文件名(不含扩展名) + module_name = os.path.basename(py_file)[:-3] + # 导入模块 + __import__('layerApicase.math_extreme_size.' + module_name, globals(), locals(), []) diff --git a/framework/e2e/PaddleLT_new/layerApicase/math_extreme_size/abs_giant_size_func.py b/framework/e2e/PaddleLT_new/layerApicase/math_extreme_size/abs_giant_size_func.py new file mode 100644 index 0000000000..c4585dca0b --- /dev/null +++ b/framework/e2e/PaddleLT_new/layerApicase/math_extreme_size/abs_giant_size_func.py @@ -0,0 +1,46 @@ +import numpy as np +import paddle + + +class LayerCase(paddle.nn.Layer): + """ + case名称: abs_base + api简介: 求绝对值 + """ + + def __init__(self): + super(LayerCase, self).__init__() + + def forward(self, x, ): + """ + forward + """ + + paddle.seed(33) + np.random.seed(33) + out = paddle.abs(x, ) + return out + + + +def create_inputspec(): + inputspec = ( + paddle.static.InputSpec(shape=(-1, -1, -1, -1, -1), dtype=paddle.float32, stop_gradient=False), + ) + return inputspec + +def create_tensor_inputs(): + """ + paddle tensor + """ + inputs = (paddle.to_tensor(-1 + (1 - -1) * np.random.random([1024, 256, 128, 100, 2]).astype('float32'), dtype='float32', stop_gradient=False), ) + return inputs + + +def create_numpy_inputs(): + """ + numpy array + """ + inputs = (-1 + (1 - -1) * np.random.random([1024, 256, 128, 100, 2]).astype('float32'), ) + return inputs + diff --git a/framework/e2e/PaddleLT_new/layerApicase/nn_extreme_size/Conv2D_giant_size_class.py b/framework/e2e/PaddleLT_new/layerApicase/nn_extreme_size/Conv2D_giant_size_class.py new file mode 100644 index 0000000000..2d1178d84b --- /dev/null +++ b/framework/e2e/PaddleLT_new/layerApicase/nn_extreme_size/Conv2D_giant_size_class.py @@ -0,0 +1,47 @@ +import numpy as np +import paddle + + +class LayerCase(paddle.nn.Layer): + """ + case名称: Conv2D_giant_size_class + api简介: 2维卷积 + """ + + def __init__(self): + super(LayerCase, self).__init__() + self.func = paddle.nn.Conv2D(kernel_size=[3, 3], in_channels=256, out_channels=1, ) + + def forward(self, data, ): + """ + forward + """ + + paddle.seed(33) + np.random.seed(33) + out = self.func(data, ) + return out + + + +def create_inputspec(): + inputspec = ( + paddle.static.InputSpec(shape=(-1, 256, -1, -1), dtype=paddle.float32, stop_gradient=False), + ) + return inputspec + +def create_tensor_inputs(): + """ + paddle tensor + """ + inputs = (paddle.to_tensor(-1 + (1 - -1) * np.random.random([1024, 256, 128, 200]).astype('float32'), dtype='float32', stop_gradient=False), ) + return inputs + + +def create_numpy_inputs(): + """ + numpy array + """ + inputs = (-1 + (1 - -1) * np.random.random([1024, 256, 128, 200]).astype('float32'), ) + return inputs + diff --git a/framework/e2e/PaddleLT_new/layerApicase/nn_extreme_size/__init__.py b/framework/e2e/PaddleLT_new/layerApicase/nn_extreme_size/__init__.py new file mode 100644 index 0000000000..394a91e57c --- /dev/null +++ b/framework/e2e/PaddleLT_new/layerApicase/nn_extreme_size/__init__.py @@ -0,0 +1,15 @@ +import os +import glob + +# 获取当前文件所在目录 +current_dir = os.path.dirname(__file__) + +# 获取当前目录下所有的 .py 文件路径 +py_files = glob.glob(os.path.join(current_dir, "*.py")) + +# 动态导入所有 .py 文件 +for py_file in py_files: + # 获取文件名(不含扩展名) + module_name = os.path.basename(py_file)[:-3] + # 导入模块 + __import__('layerApicase.nn_extreme_size.' + module_name, globals(), locals(), []) diff --git a/framework/e2e/PaddleLT_new/torch_case/layerApicase/math_extreme_size/__init__.py b/framework/e2e/PaddleLT_new/torch_case/layerApicase/math_extreme_size/__init__.py new file mode 100644 index 0000000000..69d1f390c9 --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/layerApicase/math_extreme_size/__init__.py @@ -0,0 +1,15 @@ +import os +import glob + +# 获取当前文件所在目录 +current_dir = os.path.dirname(__file__) + +# 获取当前目录下所有的 .py 文件路径 +py_files = glob.glob(os.path.join(current_dir, "*.py")) + +# 动态导入所有 .py 文件 +for py_file in py_files: + # 获取文件名(不含扩展名) + module_name = os.path.basename(py_file)[:-3] + # 导入模块 + __import__('torch_case.layerApicase.math_extreme_size.' + module_name, globals(), locals(), []) diff --git a/framework/e2e/PaddleLT_new/torch_case/layerApicase/math_extreme_size/abs_giant_size_func.py b/framework/e2e/PaddleLT_new/torch_case/layerApicase/math_extreme_size/abs_giant_size_func.py new file mode 100644 index 0000000000..7979082a97 --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/layerApicase/math_extreme_size/abs_giant_size_func.py @@ -0,0 +1,39 @@ +import numpy as np +import torch +import torch.nn as nn + + +class LayerCase(nn.Module): + """ + case名称: abs_base + api简介: 求绝对值 + """ + + def __init__(self): + super(LayerCase, self).__init__() + + def forward(self, x): + """ + forward + """ + torch.manual_seed(33) + np.random.seed(33) + out = torch.abs(x) + return out + + +def create_tensor_inputs(): + """ + PyTorch tensor + """ + inputs = (torch.tensor((-1 + 2 * np.random.random([1024, 256, 128, 100, 2])).astype(np.float32), dtype=torch.float32, requires_grad=True), ) + return inputs + + +def create_numpy_inputs(): + """ + numpy array + """ + # 生成一个形状为[1024, 256, 128, 100, 2]的随机numpy数组,数据范围在[-1, 1) + inputs = ((-1 + 2 * np.random.random([1024, 256, 128, 100, 2])).astype('float32'),) + return inputs diff --git a/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_extreme_size/Conv2D_giant_size_class.py b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_extreme_size/Conv2D_giant_size_class.py new file mode 100644 index 0000000000..59f6dce5f7 --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_extreme_size/Conv2D_giant_size_class.py @@ -0,0 +1,39 @@ +import numpy as np +import torch +import torch.nn as nn + + +class LayerCase(nn.Module): + """ + case名称: Conv2D_giant_size_class + api简介: 2维卷积 + """ + + def __init__(self): + super(LayerCase, self).__init__() + self.func = nn.Conv2d(in_channels=256, out_channels=1, kernel_size=3, stride=1, padding=1) + + def forward(self, data): + """ + forward + """ + torch.manual_seed(33) + np.random.seed(33) + out = self.func(data) + return out + + +def create_tensor_inputs(): + """ + PyTorch tensor + """ + inputs = (torch.tensor((-1 + 2 * np.random.random([1024, 256, 128, 200])).astype(np.float32), dtype=torch.float32, requires_grad=True), ) + return inputs + + +def create_numpy_inputs(): + """ + numpy array + """ + inputs = ((-1 + 2 * np.random.random([1024, 256, 128, 200])).astype('float32'),) + return inputs diff --git a/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_extreme_size/__init__.py b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_extreme_size/__init__.py new file mode 100644 index 0000000000..fc4b3d089e --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_extreme_size/__init__.py @@ -0,0 +1,15 @@ +import os +import glob + +# 获取当前文件所在目录 +current_dir = os.path.dirname(__file__) + +# 获取当前目录下所有的 .py 文件路径 +py_files = glob.glob(os.path.join(current_dir, "*.py")) + +# 动态导入所有 .py 文件 +for py_file in py_files: + # 获取文件名(不含扩展名) + module_name = os.path.basename(py_file)[:-3] + # 导入模块 + __import__('torch_case.layerApicase.nn_extreme_size.' + module_name, globals(), locals(), []) diff --git a/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/AdaptiveAvgPool3D_8_class.py b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/AdaptiveAvgPool3D_8_class.py new file mode 100644 index 0000000000..8e8221eb47 --- /dev/null +++ b/framework/e2e/PaddleLT_new/torch_case/layerApicase/nn_sublayer/AdaptiveAvgPool3D_8_class.py @@ -0,0 +1,39 @@ +import numpy as np +import torch +import torch.nn as nn + + +class LayerCase(nn.Module): + """ + case名称: AdaptiveAvgPool3D_8 + api简介: 3维自适应池化 + """ + + def __init__(self): + super(LayerCase, self).__init__() + self.func = nn.AdaptiveAvgPool3d(output_size=(1, 1, 1)) + + def forward(self, data): + """ + forward + """ + torch.manual_seed(33) + np.random.seed(33) + out = self.func(data) + return out + + +def create_tensor_inputs(): + """ + PyTorch tensor + """ + inputs = (torch.tensor(-10 + (10 - -10) * np.random.random([2, 3, 8, 32, 32]).astype('float32'), dtype=torch.float32, requires_grad=True), ) + return inputs + + +def create_numpy_inputs(): + """ + numpy array + """ + inputs = (-10 + (10 - -10) * np.random.random([2, 3, 8, 32, 32]).astype('float32'), ) + return inputs