From 617927d589becfcc3b4e8fbf0cb9947a33869fbf Mon Sep 17 00:00:00 2001 From: Yifan Zhao <yifanz16@illinois.edu> Date: Mon, 5 Apr 2021 04:02:02 -0500 Subject: [PATCH] PipedBin tuner handles device of knobs --- predtuner/pipedbin.py | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/predtuner/pipedbin.py b/predtuner/pipedbin.py index b2bdbe5..bfa277c 100644 --- a/predtuner/pipedbin.py +++ b/predtuner/pipedbin.py @@ -37,19 +37,16 @@ class PipedBinaryApp(ModeledApp): self.base_dir = ( self.binary_path.parent if base_dir is None else Path(base_dir).absolute() ) - metadata_file = Path(metadata_path) self.qos_file = self.base_dir / qos_relpath - with metadata_file.open() as f: - ( - self.op_costs, - op_knobs, - self.knob_speedups, - self.baseline_knob, - self.tune_labels, - self.conf_file, - self.fifo_r_file, - self.fifo_w_file, - ) = self._parse_metadata(json.load(f)) + ( + self.op_costs, + op_knobs, + self.knob_speedup, + self.tune_labels, + self.conf_file, + self.fifo_r_file, + self.fifo_w_file, + ) = self._read_metadata(metadata_path) self._op_order = {v: i for i, v in enumerate(op_knobs.keys())} self.model_storage = ( Path(model_storage_folder) if model_storage_folder else None @@ -106,7 +103,7 @@ class PipedBinaryApp(ModeledApp): p1_storage = self.model_storage / "p1.pkl" if self.model_storage else None p2_storage = self.model_storage / "p2.json" if self.model_storage else None return [ - LinearPerfModel(self, self.op_costs, self.knob_speedups), + LinearPerfModel(self, self.op_costs, self.knob_speedup), QoSModelP1( self, lambda conf: self._run_on_knobs(conf, False)[0], @@ -162,15 +159,23 @@ class PipedBinaryApp(ModeledApp): ) @staticmethod - def _parse_metadata(metadata: dict): + def _read_metadata(metadata_path: PathLike): + metadata_file = Path(metadata_path) + with metadata_file.open() as f: + metadata = json.load(f) op_costs = metadata["op_cost"] op_knobs = metadata["op_knobs"] knob_speedup = metadata["knob_speedup"] + knob_devices = metadata["knob_devices"] baseline_knob = metadata["baseline_knob"] # Check sanity if set(op_costs.keys()) != set(op_knobs.keys()): raise ValueError( - "Operators listed in layer_cost and knobs_of_layer don't agree" + "Operators listed in layer_cost and knobs_of_layer mismatch" + ) + if set(knob_speedup.keys()) != set(knob_devices.keys()): + raise ValueError( + "Knobs listed in knob_speedup and knob_devices mismatch" ) knobs_used = set().union(*[set(knobs) for knobs in op_knobs.values()]) knobs_defined = set(knob_speedup.keys()) @@ -183,7 +188,7 @@ class PipedBinaryApp(ModeledApp): raise ValueError(f"baseline_knob {baseline_knob} is undefined") # Create actual knob object from knob names name2knob = { - s: ApproxKnob(s, baseline_priority=(0 if s == baseline_knob else None)) + s: ApproxKnob(s, knob_devices[s], (0 if s == baseline_knob else None)) for s in knobs_used } op_knobs = {op: [name2knob[k] for k in knobs] for op, knobs in op_knobs.items()} @@ -197,7 +202,6 @@ class PipedBinaryApp(ModeledApp): op_costs, op_knobs, knob_speedup, - baseline_knob, tune_labels, conf_file, fifo_r_file, @@ -268,6 +272,8 @@ class HPVMConfigBuilder: knob_name_to_range = { "fp32": range(11, 12), "fp16": range(12, 13), + "perf": range(121, 158 + 1), + "samp": range(231, 239 + 1), "perf_fp16": range(151, 168 + 1), "samp_fp16": range(261, 269 + 1), } -- GitLab