From ad1fc8350037b042ad76f4a5e8cfc0262198f631 Mon Sep 17 00:00:00 2001 From: Yifan Zhao <yifanz16@illinois.edu> Date: Fri, 22 Jan 2021 19:56:04 -0600 Subject: [PATCH] Added function for parsing knobs from json file --- predtuner/approxes/__init__.py | 1 + predtuner/approxes/approxes.py | 46 +- predtuner/approxes/default_approx_params.json | 472 ++++++++++++++++++ 3 files changed, 517 insertions(+), 2 deletions(-) create mode 100644 predtuner/approxes/__init__.py create mode 100644 predtuner/approxes/default_approx_params.json diff --git a/predtuner/approxes/__init__.py b/predtuner/approxes/__init__.py new file mode 100644 index 0000000..4a254d4 --- /dev/null +++ b/predtuner/approxes/__init__.py @@ -0,0 +1 @@ +from .approxes import get_knobs_from_file diff --git a/predtuner/approxes/approxes.py b/predtuner/approxes/approxes.py index 217e25e..6f4c9c3 100644 --- a/predtuner/approxes/approxes.py +++ b/predtuner/approxes/approxes.py @@ -1,11 +1,14 @@ """Approximation techniques for torch.nn layers.""" -from typing import Iterable, List, Optional, Type +from pathlib import Path +from typing import Dict, Iterable, List, Optional, Set, Type, Union import torch from torch.nn import Conv2d, Linear, Module, Parameter -from ._copy import module_only_deepcopy from ..torchapp import TorchApproxKnob +from ._copy import module_only_deepcopy + +PathLike = Union[Path, str] def _interpolate_first_dim(tensor: torch.Tensor, interp_indices: Iterable[int]): @@ -370,3 +373,42 @@ class FP16Approx(TorchApproxKnob): def apply(self, module: Module) -> FP16ApproxModule: return self.FP16ApproxModule(module) + + +default_name_to_class = { + k.__name__: k + for k in [FP16Approx, PromiseSim, PerforateConv2dStride, Conv2dSampling] +} +default_knob_file = Path(__file__).parent / "default_approx_params.json" + + +def get_knobs_from_file( + filepath: PathLike = default_knob_file, + extra_name_to_class: Dict[str, Type[TorchApproxKnob]] = None, +) -> Set[TorchApproxKnob]: + import json + + extra_name_to_class = extra_name_to_class or {} + default_names = set(list(default_name_to_class)) + extra_names = set(list(extra_name_to_class)) + if default_names.intersection(extra_names): + raise ValueError( + f"Provided extra class names clash with default class names; \n" + f"Default: {default_names}\n" + f"Extra: {extra_names}" + ) + name_to_class = {**default_name_to_class, **extra_name_to_class} + filepath = Path(filepath) + with filepath.open() as f: + knobs_json = json.load(f) + ret = set() + for knob_dict in knobs_json: + if not isinstance(knob_dict, dict): + raise ValueError(f"JSON file for knob initialization contains non-dict") + # 'class' is not a valid argument name in Python, so we can use this key. + class_name = knob_dict.pop("class") + if class_name not in name_to_class: + raise KeyError(f"{class_name} not found among knob class names") + class_ty = name_to_class[class_name] + ret.add(class_ty(**knob_dict)) + return ret diff --git a/predtuner/approxes/default_approx_params.json b/predtuner/approxes/default_approx_params.json new file mode 100644 index 0000000..5cb5fb5 --- /dev/null +++ b/predtuner/approxes/default_approx_params.json @@ -0,0 +1,472 @@ +[{ + "class": "FP16Approx", + "name": "12", + "exp_speedup": 1.5 +}, { + "direction_is_row": false, + "stride": 2, + "offset": 0, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "121", + "exp_speedup": 2.0 +}, { + "direction_is_row": false, + "stride": 2, + "offset": 1, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "122", + "exp_speedup": 2.0 +}, { + "direction_is_row": true, + "stride": 2, + "offset": 0, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "123", + "exp_speedup": 2.0 +}, { + "direction_is_row": true, + "stride": 2, + "offset": 1, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "124", + "exp_speedup": 2.0 +}, { + "direction_is_row": false, + "stride": 3, + "offset": 0, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "125", + "exp_speedup": 1.5 +}, { + "direction_is_row": false, + "stride": 3, + "offset": 1, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "126", + "exp_speedup": 1.5 +}, { + "direction_is_row": false, + "stride": 3, + "offset": 2, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "127", + "exp_speedup": 1.5 +}, { + "direction_is_row": true, + "stride": 3, + "offset": 0, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "128", + "exp_speedup": 1.5 +}, { + "direction_is_row": true, + "stride": 3, + "offset": 1, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "129", + "exp_speedup": 1.5 +}, { + "direction_is_row": true, + "stride": 3, + "offset": 2, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "130", + "exp_speedup": 1.5 +}, { + "direction_is_row": false, + "stride": 4, + "offset": 0, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "131", + "exp_speedup": 1.33 +}, { + "direction_is_row": false, + "stride": 4, + "offset": 1, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "132", + "exp_speedup": 1.33 +}, { + "direction_is_row": false, + "stride": 4, + "offset": 2, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "133", + "exp_speedup": 1.33 +}, { + "direction_is_row": false, + "stride": 4, + "offset": 3, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "134", + "exp_speedup": 1.33 +}, { + "direction_is_row": true, + "stride": 4, + "offset": 0, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "135", + "exp_speedup": 1.33 +}, { + "direction_is_row": true, + "stride": 4, + "offset": 1, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "136", + "exp_speedup": 1.33 +}, { + "direction_is_row": true, + "stride": 4, + "offset": 2, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "137", + "exp_speedup": 1.33 +}, { + "direction_is_row": true, + "stride": 4, + "offset": 3, + "use_fp16": false, + "class": "PerforateConv2dStride", + "name": "138", + "exp_speedup": 1.33 +}, { + "direction_is_row": false, + "stride": 2, + "offset": 0, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "151", + "exp_speedup": 3.0 +}, { + "direction_is_row": false, + "stride": 2, + "offset": 1, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "152", + "exp_speedup": 3.0 +}, { + "direction_is_row": true, + "stride": 2, + "offset": 0, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "153", + "exp_speedup": 3.0 +}, { + "direction_is_row": true, + "stride": 2, + "offset": 1, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "154", + "exp_speedup": 3.0 +}, { + "direction_is_row": false, + "stride": 3, + "offset": 0, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "155", + "exp_speedup": 2.25 +}, { + "direction_is_row": false, + "stride": 3, + "offset": 1, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "156", + "exp_speedup": 2.25 +}, { + "direction_is_row": false, + "stride": 3, + "offset": 2, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "157", + "exp_speedup": 2.25 +}, { + "direction_is_row": true, + "stride": 3, + "offset": 0, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "158", + "exp_speedup": 2.25 +}, { + "direction_is_row": true, + "stride": 3, + "offset": 1, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "159", + "exp_speedup": 2.25 +}, { + "direction_is_row": true, + "stride": 3, + "offset": 2, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "160", + "exp_speedup": 2.25 +}, { + "direction_is_row": false, + "stride": 4, + "offset": 0, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "161", + "exp_speedup": 2.0 +}, { + "direction_is_row": false, + "stride": 4, + "offset": 1, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "162", + "exp_speedup": 2.0 +}, { + "direction_is_row": false, + "stride": 4, + "offset": 2, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "163", + "exp_speedup": 2.0 +}, { + "direction_is_row": false, + "stride": 4, + "offset": 3, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "164", + "exp_speedup": 2.0 +}, { + "direction_is_row": true, + "stride": 4, + "offset": 0, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "165", + "exp_speedup": 2.0 +}, { + "direction_is_row": true, + "stride": 4, + "offset": 1, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "166", + "exp_speedup": 2.0 +}, { + "direction_is_row": true, + "stride": 4, + "offset": 2, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "167", + "exp_speedup": 2.0 +}, { + "direction_is_row": true, + "stride": 4, + "offset": 3, + "use_fp16": true, + "class": "PerforateConv2dStride", + "name": "168", + "exp_speedup": 2.0 +}, { + "skip_every": 2, + "skip_offset": 0, + "interp_rate": 1.0, + "use_fp16": false, + "class": "Conv2dSampling", + "name": "231", + "exp_speedup": 2.0 +}, { + "skip_every": 2, + "skip_offset": 1, + "interp_rate": 1.0, + "use_fp16": false, + "class": "Conv2dSampling", + "name": "232", + "exp_speedup": 2.0 +}, { + "skip_every": 3, + "skip_offset": 0, + "interp_rate": 1.0, + "use_fp16": false, + "class": "Conv2dSampling", + "name": "233", + "exp_speedup": 1.5 +}, { + "skip_every": 3, + "skip_offset": 1, + "interp_rate": 1.0, + "use_fp16": false, + "class": "Conv2dSampling", + "name": "234", + "exp_speedup": 1.5 +}, { + "skip_every": 3, + "skip_offset": 2, + "interp_rate": 1.0, + "use_fp16": false, + "class": "Conv2dSampling", + "name": "235", + "exp_speedup": 1.5 +}, { + "skip_every": 4, + "skip_offset": 0, + "interp_rate": 1.0, + "use_fp16": false, + "class": "Conv2dSampling", + "name": "236", + "exp_speedup": 1.33 +}, { + "skip_every": 4, + "skip_offset": 1, + "interp_rate": 1.0, + "use_fp16": false, + "class": "Conv2dSampling", + "name": "237", + "exp_speedup": 1.33 +}, { + "skip_every": 4, + "skip_offset": 2, + "interp_rate": 1.0, + "use_fp16": false, + "class": "Conv2dSampling", + "name": "238", + "exp_speedup": 1.33 +}, { + "skip_every": 4, + "skip_offset": 3, + "interp_rate": 1.0, + "use_fp16": false, + "class": "Conv2dSampling", + "name": "239", + "exp_speedup": 1.33 +}, { + "skip_every": 2, + "skip_offset": 0, + "interp_rate": 1.0, + "use_fp16": true, + "class": "Conv2dSampling", + "name": "261", + "exp_speedup": 3.0 +}, { + "skip_every": 2, + "skip_offset": 1, + "interp_rate": 1.0, + "use_fp16": true, + "class": "Conv2dSampling", + "name": "262", + "exp_speedup": 3.0 +}, { + "skip_every": 3, + "skip_offset": 0, + "interp_rate": 1.0, + "use_fp16": true, + "class": "Conv2dSampling", + "name": "263", + "exp_speedup": 2.25 +}, { + "skip_every": 3, + "skip_offset": 1, + "interp_rate": 1.0, + "use_fp16": true, + "class": "Conv2dSampling", + "name": "264", + "exp_speedup": 2.25 +}, { + "skip_every": 3, + "skip_offset": 2, + "interp_rate": 1.0, + "use_fp16": true, + "class": "Conv2dSampling", + "name": "265", + "exp_speedup": 2.25 +}, { + "skip_every": 4, + "skip_offset": 0, + "interp_rate": 1.0, + "use_fp16": true, + "class": "Conv2dSampling", + "name": "266", + "exp_speedup": 2.0 +}, { + "skip_every": 4, + "skip_offset": 1, + "interp_rate": 1.0, + "use_fp16": true, + "class": "Conv2dSampling", + "name": "267", + "exp_speedup": 2.0 +}, { + "skip_every": 4, + "skip_offset": 2, + "interp_rate": 1.0, + "use_fp16": true, + "class": "Conv2dSampling", + "name": "268", + "exp_speedup": 2.0 +}, { + "skip_every": 4, + "skip_offset": 3, + "interp_rate": 1.0, + "use_fp16": true, + "class": "Conv2dSampling", + "name": "269", + "exp_speedup": 2.0 +}, { + "noise_level": 1, + "class": "PromiseSim", + "name": "1", + "exp_speedup": 12.0 +}, { + "noise_level": 2, + "class": "PromiseSim", + "name": "2", + "exp_speedup": 10.0 +}, { + "noise_level": 3, + "class": "PromiseSim", + "name": "3", + "exp_speedup": 9.0 +}, { + "noise_level": 4, + "class": "PromiseSim", + "name": "4", + "exp_speedup": 8.0 +}, { + "noise_level": 5, + "class": "PromiseSim", + "name": "5", + "exp_speedup": 6.0 +}, { + "noise_level": 6, + "class": "PromiseSim", + "name": "6", + "exp_speedup": 5.0 +}, { + "noise_level": 7, + "class": "PromiseSim", + "name": "7", + "exp_speedup": 4.0 +}] \ No newline at end of file -- GitLab