summaryrefslogtreecommitdiff
path: root/compiler/visq/visq
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/visq/visq')
-rw-r--r--compiler/visq/visq51
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: