Exemple #1
0
def test_can_not_set_sparsity_more_than_one_for_magnitude_sparse_algo():
    config = get_basic_magnitude_sparsity_config()
    _, compression_ctrl = create_compressed_model_and_algo_for_test(
        MagnitudeTestModel(), config)
    with pytest.raises(AttributeError):
        compression_ctrl.set_sparsity_level(1)
        compression_ctrl.set_sparsity_level(1.2)
Exemple #2
0
def test_magnitude_algo_set_independently_sparsity_level_for_one_module():
    module_name_conv1 = 'MagnitudeTestModel/NNCFConv2d[conv1]'
    module_name_conv2 = 'MagnitudeTestModel/NNCFConv2d[conv2]'
    config = get_basic_magnitude_sparsity_config()
    config['compression']['params'] = {"sparsity_level_setting_mode": 'local'}
    sparse_model, compression_ctrl = create_compressed_model_and_algo_for_test(MagnitudeTestModel(), config)
    sparse_info_conv1 = [sparse_info for sparse_info in compression_ctrl.sparsified_module_info\
     if sparse_info.module_name == module_name_conv1]
    sparse_info_conv2 = [sparse_info for sparse_info in compression_ctrl.sparsified_module_info\
     if sparse_info.module_name == module_name_conv2]

    compression_ctrl.set_sparsity_level(0.5, sparse_info_conv1[0])

    weights_conv1 = sparse_model.conv1.weight
    weights_conv2 = sparse_model.conv2.weight
    count_nonzero_conv1 = sparse_model.conv1.pre_ops['0'].operand.apply_binary_mask(weights_conv1).nonzero().size(0)
    count_param_conv1 = weights_conv1.view(-1).size(0)

    assert count_param_conv1 - count_nonzero_conv1 == 4 # 8 * 0.5

    compression_ctrl.set_sparsity_level(0.3, sparse_info_conv2[0])

    count_nonzero_conv1 = sparse_model.conv1.pre_ops['0'].operand.apply_binary_mask(weights_conv1).nonzero().size(0)
    count_param_conv1 = weights_conv1.view(-1).size(0)

    count_nonzero_conv2 = sparse_model.conv2.pre_ops['0'].operand.apply_binary_mask(weights_conv2).nonzero().size(0)
    count_param_conv2 = weights_conv2.view(-1).size(0)

    assert count_param_conv1 - count_nonzero_conv1 == 4 # 8 * 0.5
    assert count_param_conv2 - count_nonzero_conv2 == 6 # ~ 18 * 0.3
Exemple #3
0
def test_can_create_magnitude_sparse_algo__with_defaults():
    model = MagnitudeTestModel()
    config = get_basic_magnitude_sparsity_config()
    config['compression']['params'] = \
        {'schedule': 'multistep'}
    sparse_model, compression_ctrl = create_compressed_model_and_algo_for_test(
        deepcopy(model), config)

    assert isinstance(compression_ctrl, MagnitudeSparsityController)
    assert compression_ctrl.sparsity_level == approx(0.1)
    assert len(list(sparse_model.modules())) == 12

    _, sparse_model_conv = check_correct_nncf_modules_replacement(
        model, sparse_model)

    i = 0
    for sparse_module in sparse_model_conv.values():
        store = []
        ref_mask = torch.ones_like(
            sparse_module.weight) if i == 0 else ref_mask_2
        i += 1
        for op in sparse_module.pre_ops.values():
            if isinstance(op, UpdateWeight) and isinstance(
                    op.operand, BinaryMask):
                assert compression_ctrl.threshold == approx(0.24, 0.1)
                assert torch.allclose(op.operand.binary_mask, ref_mask)
                assert isinstance(compression_ctrl.weight_importance,
                                  type(normed_magnitude))
                assert op.__class__.__name__ not in store
                store.append(op.__class__.__name__)
Exemple #4
0
def test_can_not_set_sparsity_more_than_one_for_magnitude_sparse_algo():
    model = MagnitudeTestModel()
    config = get_basic_magnitude_sparsity_config()
    compression_algo = create_compression_algorithm(model, config)
    with pytest.raises(AttributeError):
        compression_algo.set_sparsity_level(1)
        compression_algo.set_sparsity_level(1.2)
Exemple #5
0
def test_can_create_magnitude_sparse_algo__with_defaults():
    model = MagnitudeTestModel()
    config = get_basic_magnitude_sparsity_config()
    config['compression']['params'] = \
        {'schedule': 'multistep'}
    compression_algo = create_compression_algorithm(deepcopy(model), config)

    assert isinstance(compression_algo, MagnitudeSparsity)
    sparse_model = compression_algo.model
    assert compression_algo.sparsity_level == approx(0.1)
    assert len(list(sparse_model.modules())) == 11

    model_conv = get_all_modules_by_type(model, 'Conv2d')
    sparse_model_conv = get_all_modules_by_type(sparse_model, 'NNCFConv2d')
    assert len(model_conv) == len(sparse_model_conv)

    i = 0
    for module_name in model_conv:
        scope = module_name.split('/')
        scope[-1] = scope[-1].replace('Conv2d', 'NNCFConv2d')
        sparse_module_name = '/'.join(scope)
        assert sparse_module_name in sparse_model_conv

        store = []
        sparse_module = sparse_model_conv[sparse_module_name]
        ref_mask = torch.ones_like(sparse_module.weight) if i == 0 else ref_mask_2
        i += 1
        for op in sparse_module.pre_ops.values():
            if isinstance(op, UpdateWeight) and isinstance(op.operand, BinaryMask):
                assert compression_algo.threshold == approx(0.24, 0.1)
                assert torch.allclose(op.operand.binary_mask, ref_mask)
                assert isinstance(compression_algo.weight_importance, type(normed_magnitude))
                assert op.__class__.__name__ not in store
                store.append(op.__class__.__name__)
Exemple #6
0
def test_can_not_create_magnitude_algo__without_steps():
    config = get_basic_magnitude_sparsity_config()
    config['compression']['params'] = {
        'schedule': 'multistep',
        'multistep_sparsity_levels': [0.1]
    }
    with pytest.raises(AttributeError):
        _, _ = create_compressed_model_and_algo_for_test(MockModel(), config)
Exemple #7
0
def test_can_create_magnitude_algo__without_levels():
    config = get_basic_magnitude_sparsity_config()
    config['compression']['params'] = {
        'schedule': 'multistep',
        'multistep_steps': [1]
    }
    _, compression_ctrl = create_compressed_model_and_algo_for_test(
        MockModel(), config)
    assert compression_ctrl.sparsity_level == approx(0.1)
Exemple #8
0
def test_magnitude_sparse_algo_sets_threshold(weight_importance, sparsity_level, threshold):
    model = MagnitudeTestModel()
    config = get_basic_magnitude_sparsity_config()
    config['compression']['weight_importance'] = weight_importance
    config['compression']['params'] = {'schedule': 'multistep'}
    compression_algo = create_compression_algorithm(model, config)
    if sparsity_level:
        compression_algo.set_sparsity_level(sparsity_level)
    assert compression_algo.threshold == pytest.approx(threshold, 0.01)
Exemple #9
0
def test_can_not_create_magnitude_algo__without_steps():
    model = MagnitudeTestModel()
    config = get_basic_magnitude_sparsity_config()
    config['compression']['params'] = {
        'schedule': 'multistep',
        'sparsity_levels': [0.1]
    }
    with pytest.raises(AttributeError):
        create_compression_algorithm(model, config)
def get_multistep_normed_abs_config():
    config = get_basic_magnitude_sparsity_config()
    compression_config = config['compression']
    compression_config['params'] = {
        'schedule': 'multistep',
        'weight_importance': 'normed_abs',
        'multistep_steps': [1, 3],
        'multistep_sparsity_levels': [0.1, 0.5, 0.9]
    }
    return config
Exemple #11
0
def test_magnitude_sparse_algo_sets_threshold(weight_importance, sparsity_level, threshold):
    model = MagnitudeTestModel()
    config = get_basic_magnitude_sparsity_config()
    config['compression']['params'] = {'schedule': 'multistep',
                                       'weight_importance': weight_importance}
    _, compression_ctrl = create_compressed_model_and_algo_for_test(model, config)
    if sparsity_level:
        compression_ctrl.set_sparsity_level(sparsity_level)

    stats = compression_ctrl.statistics()
    assert stats["sparsity_threshold"] == pytest.approx(threshold, 0.01)
Exemple #12
0
def test_magnitude_algo_set_binary_mask_on_forward():
    config = get_basic_magnitude_sparsity_config()
    config['compression']['weight_importance'] = 'abs'
    sparse_model, compression_ctrl = create_compressed_model_and_algo_for_test(MagnitudeTestModel(), config)
    compression_ctrl.set_sparsity_level(0.3)
    with torch.no_grad():
        sparse_model(torch.ones([1, 1, 10, 10]))

    op = sparse_model.conv1.pre_ops['0']
    check_equal(ref_mask_1, op.operand.binary_mask)

    op = sparse_model.conv2.pre_ops['0']
    check_equal(ref_mask_2, op.operand.binary_mask)
Exemple #13
0
def test_magnitude_algo_set_binary_mask_on_forward():
    model = MagnitudeTestModel()
    config = get_basic_magnitude_sparsity_config()
    config['compression']['weight_importance'] = 'abs'
    compression_algo = create_compression_algorithm(model, config)
    compression_algo.set_sparsity_level(0.3)
    model = compression_algo.model
    with torch.no_grad():
        model(torch.ones([1, 1, 10, 10]))

    op = model.conv1.pre_ops['0']
    check_equal(ref_mask_1, op.operand.binary_mask)

    op = model.conv2.pre_ops['0']
    check_equal(ref_mask_2, op.operand.binary_mask)
Exemple #14
0
def test_can_create_magnitude_algo__without_levels():
    model = MagnitudeTestModel()
    config = get_basic_magnitude_sparsity_config()
    config['compression']['params'] = {'schedule': 'multistep', 'steps': [1]}
    compression_algo = create_compression_algorithm(model, config)
    assert compression_algo.sparsity_level == approx(0.1)