diff options
Diffstat (limited to 'compiler/visq/visq')
-rw-r--r-- | compiler/visq/visq | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/compiler/visq/visq b/compiler/visq/visq index 02f63abed..6c3b94d11 100644 --- a/compiler/visq/visq +++ b/compiler/visq/visq @@ -34,7 +34,7 @@ from shutil import copyfile from pathlib import Path from visqlib.Palette import YLORRD9Palette -from visqlib.QErrorComputer import MPEIRComputer, MSEComputer, TAEComputer +from visqlib.QErrorComputer import MPEIRComputer, MSEComputer, TAEComputer, SRMSEComputer from visqlib.Util import valid_attr, pretty_float from visqlib.DotBuilder import DotBuilder @@ -77,6 +77,11 @@ def _get_parser(): help="Path to the output json file (qerror metric = TAE).", required=False) parser.add_argument( + "--srmse_output", + type=str, + help="Path to the output json file (qerror metric = SRMSE).", + required=False) + parser.add_argument( "--dump_dot_graph", action="store_true", help="Dump dot graph.", required=False) parser.add_argument( "-b", @@ -91,7 +96,7 @@ def _get_parser(): def _verify_args(args): """Verify the given arguments""" - valid_outputs = ['mpeir_output', 'mse_output', 'tae_output'] + valid_outputs = ['mpeir_output', 'mse_output', 'tae_output', 'srmse_output'] # Check if at least one output option is given num_outputs = 0 @@ -114,22 +119,24 @@ def _run_dalgona(model, data, analysis, save_dir): cmd += ['--analysis_args', str(save_dir)] try: - subprocess.run(cmd, capture_output=True, check=True) + subprocess.run(cmd, capture_output=True, check=True, universal_newlines=True) except subprocess.CalledProcessError as e: print('Error raised while running the below command') print(' '.join(cmd)) - print(e.output) + print(e.stderr) raise # Generate h5 file that contains a dataset of a single batch # This is for batch execution of visq -def gen_batch_h5(inputs_data, inputs_path): +def gen_batch_h5(inputs_data, inputs_path, rawData): # Create h5 file output_path = inputs_path + "/inputs.h5" h5_file = h5.File(output_path, 'w') group = h5_file.create_group("value") group.attrs['desc'] = "Input data" + if rawData: + group.attrs['rawData'] = '1' for i in range(len(inputs_data)): sample = group.create_group(str(i)) @@ -151,7 +158,7 @@ def advance_on_data(fp32_model, fq_model, data, computers): tempfile.TemporaryDirectory() as fq_dir: _run_dalgona(fp32_model, data, dump_fp32_py, fp32_dir) - copyfile(fp32_dir + '/tensors.txt', fq_dir + '/tensors.txt') + copyfile(fp32_dir + '/tensors.json', fq_dir + '/tensors.json') _run_dalgona(fq_model, data, dump_fq_py, fq_dir) for metric_key in computers: @@ -162,22 +169,23 @@ def _run_batch(fp32_model, fq_model, data, computers, batch_size): with tempfile.TemporaryDirectory() as inputs_dir: with h5.File(data, 'r') as f: dataset = f['value'] - + rawData = dataset.attrs.__contains__( + 'rawData') and dataset.attrs['rawData'] == '1' inputs = [] for data_index in dataset: cur_inputs = [] for input_index in dataset[data_index]: d = dataset[data_index][input_index][:] - cur_inputs.append(np.array(d, np.float32)) + cur_inputs.append(d) inputs.append(cur_inputs) if len(inputs) >= batch_size: - input_path = gen_batch_h5(inputs, inputs_dir) + input_path = gen_batch_h5(inputs, inputs_dir, rawData) advance_on_data(fp32_model, fq_model, input_path, computers) inputs = [] if len(inputs) > 0: - input_path = gen_batch_h5(inputs, inputs_dir) + input_path = gen_batch_h5(inputs, inputs_dir, rawData) advance_on_data(fp32_model, fq_model, input_path, computers) @@ -190,11 +198,11 @@ def _fake_quantize(input_model, output_model): cmd += [str(output_model)] try: - subprocess.run(cmd, check=True) + subprocess.run(cmd, check=True, universal_newlines=True) except subprocess.CalledProcessError as e: print('Error raised while running the below command') print(' '.join(cmd)) - print(e.output) + print(e.stderr) raise @@ -262,12 +270,7 @@ def run_on_data_batchwise(fp32_model, q_model, data, dump_dot_graph, computers, for metric_key in computers: cur_computer = computers[metric_key][0] output = computers[metric_key][1] - if metric_key == 'MPEIR': - qerror_map = cur_computer.get_final_result() - q_min = 0.0 - q_max = 1.0 - elif metric_key == 'MSE' or metric_key == 'TAE': - qerror_map, q_min, q_max = cur_computer.get_final_result() + qerror_map, q_min, q_max = cur_computer.get_final_result() palette = YLORRD9Palette(qerror_min=q_min, qerror_max=q_max) result = _build_json( @@ -304,7 +307,7 @@ def run_on_data(fp32_model, q_model, data, dump_dot_graph, computers): _run_dalgona(fp32_model, data, dump_fp32_py, fp32_dir) # Copy list of dumped tensors - copyfile(fp32_dir + '/tensors.txt', fq_dir + '/tensors.txt') + copyfile(fp32_dir + '/tensors.json', fq_dir + '/tensors.json') # Step 3. Run dalgona to dump intermediate FMs in fq model _run_dalgona(fq_model, data, dump_fq_py, fq_dir) @@ -314,12 +317,7 @@ def run_on_data(fp32_model, q_model, data, dump_dot_graph, computers): cur_computer = computers[metric_key][0] output = computers[metric_key][1] cur_computer.advance_on(fp32_dir, fq_dir) - if metric_key == 'MPEIR': - qerror_map = cur_computer.get_final_result() - q_min = 0.0 - q_max = 1.0 - elif metric_key == 'MSE' or metric_key == 'TAE': - qerror_map, q_min, q_max = cur_computer.get_final_result() + qerror_map, q_min, q_max = cur_computer.get_final_result() palette = YLORRD9Palette(qerror_min=q_min, qerror_max=q_max) result = _build_json( @@ -365,6 +363,9 @@ def main(): if args.tae_output: computers['TAE'] = (TAEComputer(None, None), args.tae_output) + if args.srmse_output: + computers['SRMSE'] = (SRMSEComputer(None, None), args.srmse_output) + if batch_size == None: run_on_data(fp32_model, q_model, data, dump_dot_graph, computers) else: |