def _test_model( model_path: str, input_paths: str, output_paths: str, runner_constructor: Callable[[Any], ModelRunner], rtol: float = 1e-5, atol: float = 1e-8, ): model = load_model(model_path) dataloader = DataLoader(input_paths, output_paths, 2, 0) model_runner = runner_constructor(model, batch_size=2) outputs, _ = model_runner.run(dataloader) _test_output(outputs, dataloader, batch_size=2) dataloader = DataLoader(input_paths, output_paths, 1, 0) model_runner = runner_constructor( model, batch_size=1, ) outputs, _ = model_runner.run(dataloader, max_steps=1) assert len(outputs) == 1 outputs, _ = model_runner.run(dataloader) _test_output(outputs, dataloader)
def test_nm_analyze_model_runner( onnx_models_with_data: OnnxModelDataFixture, ): model = load_model(onnx_models_with_data.model_path) # Sanity check, asserting model can run random input dataloader = DataLoader.from_model_random(model, 5, 0, 10) model_runner = DeepSparseAnalyzeModelRunner(model, batch_size=5) outputs, _ = model_runner.run(dataloader, max_steps=5) fields = [ "num_threads", "num_sockets", "average_total_time", "iteration_times" ] layer_fields = [ "name", "canonical_name", "input_dims", "output_dims", "strides", "required_flops", "kernel_sparsity", "activation_sparsity", "average_run_time_in_ms", "average_utilization", "average_teraflops_per_second", ] for out in outputs: for field in fields: assert field in out for layer_info in out["layer_info"]: for field in layer_fields: assert field in layer_info
def _create_sensitivity_ks_data( model_path: str, input_paths: str, output_paths: str, loss_approx_path: str, loss_one_shot_path: str, perf_path: str, sparsity_levels: Union[List[float], None], ): dataloader = DataLoader(input_paths, output_paths, 1) analysis = pruning_loss_sens_magnitude(model_path) analysis.save_json(loss_approx_path) analysis = pruning_loss_sens_one_shot( model_path, dataloader, 1, 1, show_progress=False, sparsity_levels=sparsity_levels, ) analysis.save_json(loss_one_shot_path) if deepsparse is not None: analysis = pruning_perf_sens_one_shot( model_path, dataloader, 1, None, iterations_per_check=10, warmup_iterations_per_check=5, sparsity_levels=sparsity_levels, show_progress=False, ) analysis.save_json(perf_path)
def test_one_shot_ks_perf_sensitivity( onnx_models_with_analysis: OnnxModelAnalysisFixture, ): expected_analysis = PruningLossSensitivityAnalysis.load_json( onnx_models_with_analysis.perf_path) dataloader = DataLoader(onnx_models_with_analysis.input_paths, onnx_models_with_analysis.output_paths, 1) analysis = pruning_perf_sens_one_shot( onnx_models_with_analysis.model_path, dataloader, 1, None, iterations_per_check=10, warmup_iterations_per_check=3, sparsity_levels=onnx_models_with_analysis.sparsity_levels, show_progress=False, ) expected_layers = sorted(expected_analysis.dict()["results"], key=lambda x: x["index"]) actual_layers = sorted( analysis.dict()["results"], key=lambda x: x["index"], ) _test_analysis_comparison(expected_layers, actual_layers)