Skip to content
Snippets Groups Projects
Commit ad1fc835 authored by Yifan Zhao's avatar Yifan Zhao
Browse files

Added function for parsing knobs from json file

parent 5251c4d5
No related branches found
No related tags found
No related merge requests found
from .approxes import get_knobs_from_file
"""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
[{
"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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment