def test_select_per_layer_comp_ratios_with_spatial_svd_pruner(self): pruner = SpatialSvdPruner() eval_func = unittest.mock.MagicMock() rounding_algo = unittest.mock.MagicMock() eval_func.side_effect = [ 10, 20, 30, 40, 50, 60, 70, 80, 90, 11, 21, 31, 35, 40, 45, 50, 55, 60 ] rounding_algo.round.side_effect = [ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 ] model = mnist_torch_model.Net() layer_db = LayerDatabase(model, input_shape=(1, 1, 28, 28)) selected_layers = [ layer for layer in layer_db if isinstance(layer.module, nn.Conv2d) ] layer_db.mark_picked_layers(selected_layers) # Instantiate child greedy_algo = comp_ratio_select.GreedyCompRatioSelectAlgo( layer_db, pruner, SpatialSvdCostCalculator(), eval_func, 20, CostMetric.mac, Decimal(0.4), 10, True, None, rounding_algo, False, bokeh_session=None) layer_comp_ratio_list, stats = greedy_algo.select_per_layer_comp_ratios( ) original_cost = SpatialSvdCostCalculator.compute_model_cost(layer_db) for layer in layer_db: if layer not in selected_layers: layer_comp_ratio_list.append(LayerCompRatioPair(layer, None)) compressed_cost = SpatialSvdCostCalculator.calculate_compressed_cost( layer_db, layer_comp_ratio_list, CostMetric.mac) actual_compression_ratio = compressed_cost.mac / original_cost.mac self.assertTrue( math.isclose(Decimal(0.3), actual_compression_ratio, abs_tol=0.8)) print('\n') for pair in layer_comp_ratio_list: print(pair)
def test_per_layer_eval_scores(self): url, process = start_bokeh_server_session(8006) bokeh_session = BokehServerSession(url=url, session_id="compression") pruner = unittest.mock.MagicMock() eval_func = unittest.mock.MagicMock() model = mnist_torch_model.Net().to('cpu') layer_db = LayerDatabase(model, input_shape=(1, 1, 28, 28)) layer1 = layer_db.find_layer_by_name('conv1') layer_db.mark_picked_layers([layer1]) eval_func.side_effect = [90, 80, 70, 60, 50, 40, 30, 20, 10] # Instantiate child greedy_algo = comp_ratio_select.GreedyCompRatioSelectAlgo( layer_db, pruner, SpatialSvdCostCalculator(), eval_func, 20, CostMetric.mac, 0.5, 10, True, None, None, False, bokeh_session=None) progress_bar = ProgressBar(1, "eval scores", "green", bokeh_session=bokeh_session) data_table = DataTable(num_columns=3, num_rows=1, column_names=[ '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9' ], row_index_names=[layer1.name], bokeh_session=bokeh_session) pruner.prune_model.return_value = layer_db eval_dict = greedy_algo._compute_layerwise_eval_score_per_comp_ratio_candidate( data_table, progress_bar, layer1) self.assertEqual(90, eval_dict[Decimal('0.1')]) bokeh_session.server_session.close("test complete") os.killpg(os.getpgid(process.pid), signal.SIGTERM)
def test_eval_scores_with_spatial_svd_pruner(self): pruner = SpatialSvdPruner() eval_func = unittest.mock.MagicMock() eval_func.side_effect = [ 90, 80, 70, 60, 50, 40, 30, 20, 10, 91, 81, 71, 61, 51, 41, 31, 21, 11 ] model = mnist_torch_model.Net() # Create a layer database layer_db = LayerDatabase(model, input_shape=(1, 1, 28, 28)) layer1 = layer_db.find_layer_by_name('conv1') layer2 = layer_db.find_layer_by_name('conv2') layer_db.mark_picked_layers([layer1, layer2]) # Instantiate child greedy_algo = comp_ratio_select.GreedyCompRatioSelectAlgo( layer_db, pruner, SpatialSvdCostCalculator(), eval_func, 20, CostMetric.mac, 0.5, 10, True, None, None, True, bokeh_session=None) dict = greedy_algo._compute_eval_scores_for_all_comp_ratio_candidates() print() print(dict) self.assertEqual(90, dict['conv1'][Decimal('0.1')]) self.assertEqual(51, dict['conv2'][Decimal('0.5')]) self.assertEqual(21, dict['conv2'][Decimal('0.8')])
def test_per_layer_eval_scores(self): pruner = unittest.mock.MagicMock() eval_func = unittest.mock.MagicMock() # create tf.compat.v1.Session and initialize the weights and biases with zeros config = tf.compat.v1.ConfigProto() config.gpu_options.allow_growth = True # create session with graph sess = tf.compat.v1.Session(graph=tf.Graph(), config=config) with sess.graph.as_default(): # by default, model will be constructed in default graph _ = mnist_tf_model.create_model(data_format='channels_last') sess.run(tf.compat.v1.global_variables_initializer()) # Create a layer database layer_db = LayerDatabase(model=sess, input_shape=(1, 28, 28, 1), working_dir=None) layer1 = layer_db.find_layer_by_name('conv2d/Conv2D') layer_db.mark_picked_layers([layer1]) eval_func.side_effect = [90, 80, 70, 60, 50, 40, 30, 20, 10] url, process = start_bokeh_server_session(8006) bokeh_session = BokehServerSession(url=url, session_id="compression") # Instantiate child greedy_algo = comp_ratio_select.GreedyCompRatioSelectAlgo( layer_db=layer_db, pruner=pruner, cost_calculator=SpatialSvdCostCalculator(), eval_func=eval_func, eval_iterations=20, cost_metric=CostMetric.mac, target_comp_ratio=0.5, num_candidates=10, use_monotonic_fit=True, saved_eval_scores_dict=None, comp_ratio_rounding_algo=None, use_cuda=False, bokeh_session=bokeh_session) progress_bar = ProgressBar(1, "eval scores", "green", bokeh_session=bokeh_session) data_table = DataTable(num_columns=3, num_rows=1, column_names=[ '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9' ], row_index_names=[layer1.name], bokeh_session=bokeh_session) pruner.prune_model.return_value = layer_db eval_dict = greedy_algo._compute_layerwise_eval_score_per_comp_ratio_candidate( data_table, progress_bar, layer1) self.assertEqual(90, eval_dict[Decimal('0.1')]) tf.compat.v1.reset_default_graph() sess.close() bokeh_session.server_session.close("test complete") os.killpg(os.getpgid(process.pid), signal.SIGTERM)
def test_select_per_layer_comp_ratios_with_spatial_svd_pruner(self): pruner = SpatialSvdPruner() eval_func = unittest.mock.MagicMock() rounding_algo = unittest.mock.MagicMock() eval_func.side_effect = [ 10, 20, 30, 40, 50, 60, 70, 80, 90, 11, 21, 31, 35, 40, 45, 50, 55, 60 ] rounding_algo.round.side_effect = [ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 ] # create tf.compat.v1.Session and initialize the weights and biases with zeros config = tf.compat.v1.ConfigProto() config.gpu_options.allow_growth = True # create session with graph sess = tf.compat.v1.Session(graph=tf.Graph(), config=config) with sess.graph.as_default(): # by default, model will be constructed in default graph _ = mnist_tf_model.create_model(data_format='channels_last') sess.run(tf.compat.v1.global_variables_initializer()) # Create a layer database layer_db = LayerDatabase(model=sess, input_shape=(1, 28, 28, 1), working_dir=None) selected_layers = [ layer for layer in layer_db if layer.module.type == 'Conv2D' ] layer_db.mark_picked_layers(selected_layers) url, process = start_bokeh_server_session(8006) bokeh_session = BokehServerSession(url=url, session_id="compression") # Instantiate child greedy_algo = comp_ratio_select.GreedyCompRatioSelectAlgo( layer_db=layer_db, pruner=pruner, cost_calculator=SpatialSvdCostCalculator(), eval_func=eval_func, eval_iterations=20, cost_metric=CostMetric.mac, target_comp_ratio=Decimal(0.4), num_candidates=10, use_monotonic_fit=True, saved_eval_scores_dict=None, comp_ratio_rounding_algo=rounding_algo, use_cuda=False, bokeh_session=bokeh_session) layer_comp_ratio_list, stats = greedy_algo.select_per_layer_comp_ratios( ) original_cost = SpatialSvdCostCalculator.compute_model_cost(layer_db) for layer in layer_db: if layer not in selected_layers: layer_comp_ratio_list.append(LayerCompRatioPair(layer, None)) compressed_cost = SpatialSvdCostCalculator.calculate_compressed_cost( layer_db, layer_comp_ratio_list, CostMetric.mac) actual_compression_ratio = compressed_cost.mac / original_cost.mac self.assertTrue( math.isclose(Decimal(0.3), actual_compression_ratio, abs_tol=0.8)) print('\n') for pair in layer_comp_ratio_list: print(pair) tf.compat.v1.reset_default_graph() sess.close() bokeh_session.server_session.close("test complete") os.killpg(os.getpgid(process.pid), signal.SIGTERM)
def test_eval_scores_with_spatial_svd_pruner(self): pruner = SpatialSvdPruner() eval_func = unittest.mock.MagicMock() eval_func.side_effect = [ 90, 80, 70, 60, 50, 40, 30, 20, 10, 91, 81, 71, 61, 51, 41, 31, 21, 11 ] # create tf.compat.v1.Session and initialize the weights and biases with zeros config = tf.compat.v1.ConfigProto() config.gpu_options.allow_growth = True # create session with graph sess = tf.compat.v1.Session(graph=tf.Graph(), config=config) with sess.graph.as_default(): # by default, model will be constructed in default graph _ = mnist_tf_model.create_model(data_format='channels_last') sess.run(tf.compat.v1.global_variables_initializer()) # Create a layer database layer_db = LayerDatabase(model=sess, input_shape=(1, 28, 28, 1), working_dir=None) layer1 = layer_db.find_layer_by_name('conv2d/Conv2D') layer2 = layer_db.find_layer_by_name('conv2d_1/Conv2D') layer_db.mark_picked_layers([layer1, layer2]) url, process = start_bokeh_server_session(8006) bokeh_session = BokehServerSession(url=url, session_id="compression") # Instantiate child greedy_algo = comp_ratio_select.GreedyCompRatioSelectAlgo( layer_db=layer_db, pruner=pruner, cost_calculator=SpatialSvdCostCalculator(), eval_func=eval_func, eval_iterations=20, cost_metric=CostMetric.mac, target_comp_ratio=0.5, num_candidates=10, use_monotonic_fit=True, saved_eval_scores_dict=None, comp_ratio_rounding_algo=None, use_cuda=False, bokeh_session=bokeh_session) dict = greedy_algo._compute_eval_scores_for_all_comp_ratio_candidates() print() print(dict) self.assertEqual(90, dict['conv2d/Conv2D'][Decimal('0.1')]) self.assertEqual(51, dict['conv2d_1/Conv2D'][Decimal('0.5')]) self.assertEqual(21, dict['conv2d_1/Conv2D'][Decimal('0.8')]) tf.compat.v1.reset_default_graph() sess.close() bokeh_session.server_session.close("test complete") os.killpg(os.getpgid(process.pid), signal.SIGTERM)
def test_select_per_layer_comp_ratios(self): pruner = unittest.mock.MagicMock() eval_func = unittest.mock.MagicMock() rounding_algo = unittest.mock.MagicMock() rounding_algo.round.side_effect = [ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 ] eval_func.side_effect = [ 10, 20, 30, 40, 50, 60, 70, 80, 90, 11, 21, 31, 35, 40, 45, 50, 55, 60 ] model = mnist_torch_model.Net() layer_db = LayerDatabase(model, input_shape=(1, 1, 28, 28)) layer1 = layer_db.find_layer_by_name('conv1') layer2 = layer_db.find_layer_by_name('conv2') selected_layers = [layer1, layer2] layer_db.mark_picked_layers([layer1, layer2]) try: os.remove('./data/greedy_selection_eval_scores_dict.pkl') except OSError: pass # Instantiate child greedy_algo = comp_ratio_select.GreedyCompRatioSelectAlgo( layer_db, pruner, SpatialSvdCostCalculator(), eval_func, 20, CostMetric.mac, Decimal(0.6), 10, True, None, rounding_algo, False, bokeh_session=None) layer_comp_ratio_list, stats = greedy_algo.select_per_layer_comp_ratios( ) original_cost = SpatialSvdCostCalculator.compute_model_cost(layer_db) for layer in layer_db: if layer not in selected_layers: layer_comp_ratio_list.append(LayerCompRatioPair(layer, None)) compressed_cost = SpatialSvdCostCalculator.calculate_compressed_cost( layer_db, layer_comp_ratio_list, CostMetric.mac) rounding_algo.round.side_effect = [ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 ] actual_compression_ratio = compressed_cost.mac / original_cost.mac self.assertTrue( math.isclose(Decimal(0.6), actual_compression_ratio, abs_tol=0.05)) self.assertTrue( os.path.isfile('./data/greedy_selection_eval_scores_dict.pkl')) print('\n') for pair in layer_comp_ratio_list: print(pair) # lets repeat with a saved eval_dict greedy_algo = comp_ratio_select.GreedyCompRatioSelectAlgo( layer_db, pruner, SpatialSvdCostCalculator(), eval_func, 20, CostMetric.mac, Decimal(0.6), 10, True, './data/greedy_selection_eval_scores_dict.pkl', rounding_algo, False, bokeh_session=None) layer_comp_ratio_list, stats = greedy_algo.select_per_layer_comp_ratios( ) original_cost = SpatialSvdCostCalculator.compute_model_cost(layer_db) for layer in layer_db: if layer not in selected_layers: layer_comp_ratio_list.append(LayerCompRatioPair(layer, None)) compressed_cost = SpatialSvdCostCalculator.calculate_compressed_cost( layer_db, layer_comp_ratio_list, CostMetric.mac) actual_compression_ratio = compressed_cost.mac / original_cost.mac self.assertTrue( math.isclose(Decimal(0.6), actual_compression_ratio, abs_tol=0.05)) print('\n') for pair in layer_comp_ratio_list: print(pair)