Skip to content

Commit ea320d3

Browse files
committed
get_num_compressed() for SAPipelineMixin
1 parent 7a3f8fb commit ea320d3

File tree

5 files changed

+38
-90
lines changed

5 files changed

+38
-90
lines changed

tests/post_training/experimental/sparsify_activations/model_scope.py

+5-34
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,11 @@
99
# See the License for the specific language governing permissions and
1010
# limitations under the License.
1111

12-
import copy
13-
from typing import Dict, List
14-
15-
import nncf
1612
from nncf.experimental.torch.sparsify_activations import TargetScope
1713
from nncf.parameters import CompressWeightsMode
1814
from tests.post_training.experimental.sparsify_activations.pipelines import ImageClassificationTimmSparsifyActivations
1915
from tests.post_training.experimental.sparsify_activations.pipelines import LMSparsifyActivations
16+
from tests.post_training.model_scope import generate_tests_scope
2017
from tests.post_training.pipelines.base import BackendType
2118

2219
SPARSIFY_ACTIVATIONS_MODELS = [
@@ -30,6 +27,7 @@
3027
{
3128
"reported_name": "tinyllama_ffn_sparse20",
3229
"model_id": "tinyllama/tinyllama-1.1b-step-50k-105b",
30+
"model_name": "tinyllama",
3331
"pipeline_cls": LMSparsifyActivations,
3432
"compression_params": {
3533
"compress_weights": None,
@@ -45,6 +43,7 @@
4543
{
4644
"reported_name": "tinyllama_int8_asym_data_free_ffn_sparse20",
4745
"model_id": "tinyllama/tinyllama-1.1b-step-50k-105b",
46+
"model_name": "tinyllama",
4847
"pipeline_cls": LMSparsifyActivations,
4948
"compression_params": {
5049
"compress_weights": {
@@ -62,6 +61,7 @@
6261
{
6362
"reported_name": "timm/deit3_small_patch16_224",
6463
"model_id": "deit3_small_patch16_224",
64+
"model_name": "timm/deit3_small_patch16_224",
6565
"pipeline_cls": ImageClassificationTimmSparsifyActivations,
6666
"compression_params": {},
6767
"backends": [BackendType.FP32],
@@ -70,6 +70,7 @@
7070
{
7171
"reported_name": "timm/deit3_small_patch16_224_qkv_sparse20_fc1_sparse20_fc2_sparse30",
7272
"model_id": "deit3_small_patch16_224",
73+
"model_name": "timm/deit3_small_patch16_224",
7374
"pipeline_cls": ImageClassificationTimmSparsifyActivations,
7475
"compression_params": {
7576
"sparsify_activations": {
@@ -85,34 +86,4 @@
8586
]
8687

8788

88-
def generate_tests_scope(models_list: List[Dict]) -> Dict[str, Dict]:
89-
"""
90-
Generate tests by names "{reported_name}_backend_{backend}"
91-
"""
92-
tests_scope = {}
93-
fp32_models = set()
94-
for test_model_param in models_list:
95-
model_id = test_model_param["model_id"]
96-
reported_name = test_model_param["reported_name"]
97-
98-
for backend in test_model_param["backends"]:
99-
model_param = copy.deepcopy(test_model_param)
100-
if "is_batch_size_supported" not in model_param: # Set default value of is_batch_size_supported.
101-
model_param["is_batch_size_supported"] = True
102-
test_case_name = f"{reported_name}_backend_{backend.value}"
103-
model_param["backend"] = backend
104-
model_param.pop("backends")
105-
if backend == BackendType.FP32:
106-
if model_id in fp32_models:
107-
msg = f"Duplicate test case for {model_id} with FP32 backend"
108-
raise nncf.ValidationError(msg)
109-
fp32_models.add(model_id)
110-
if test_case_name in tests_scope:
111-
msg = f"{test_case_name} already in tests_scope"
112-
raise nncf.ValidationError(msg)
113-
tests_scope[test_case_name] = model_param
114-
115-
return tests_scope
116-
117-
11889
SPARSIFY_ACTIVATIONS_TEST_CASES = generate_tests_scope(SPARSIFY_ACTIVATIONS_MODELS)

tests/post_training/experimental/sparsify_activations/pipelines.py

+14-32
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212

1313
from dataclasses import dataclass
14-
from pathlib import Path
1514
from typing import Dict, List, Optional
1615

1716
import numpy as np
@@ -33,10 +32,11 @@
3332
from nncf.torch.quantization.layers import INT8SymmetricWeightsDecompressor
3433
from tests.post_training.pipelines.base import PT_BACKENDS
3534
from tests.post_training.pipelines.base import BackendType
36-
from tests.post_training.pipelines.base import RunInfo
35+
from tests.post_training.pipelines.base import PTQTestPipeline
3736
from tests.post_training.pipelines.image_classification_timm import ImageClassificationTimm
3837
from tests.post_training.pipelines.lm_weight_compression import LMWeightCompression
3938
from tests.post_training.pipelines.lm_weight_compression import WCTimeStats
39+
from tests.torch.experimental.sparsify_activations.helpers import count_sparsifier_patterns_in_ov
4040
from tests.torch.helpers import set_torch_seed
4141

4242

@@ -52,40 +52,11 @@ class SATimeStats(WCTimeStats):
5252
REGEX_PREFIX = [*WCTimeStats.REGEX_PREFIX, SparsifyActivationsAlgoBackend.CALIBRATION_TRACKING_DESC]
5353

5454

55-
class SAPipelineMixin:
55+
class SAPipelineMixin(PTQTestPipeline):
5656
"""
5757
Common methods in the test pipeline for Sparsify Activations.
5858
"""
5959

60-
def __init__(
61-
self,
62-
reported_name: str,
63-
model_id: str,
64-
backend: BackendType,
65-
compression_params: dict,
66-
output_dir: Path,
67-
data_dir: Path,
68-
reference_data: dict,
69-
no_eval: bool,
70-
run_benchmark_app: bool,
71-
params: dict = None,
72-
batch_size: int = 1,
73-
):
74-
super().__init__(
75-
reported_name=reported_name,
76-
model_id=model_id,
77-
backend=backend,
78-
compression_params=compression_params,
79-
output_dir=output_dir,
80-
data_dir=data_dir,
81-
reference_data=reference_data,
82-
no_eval=no_eval,
83-
run_benchmark_app=run_benchmark_app,
84-
params=params,
85-
batch_size=batch_size,
86-
)
87-
self.run_info = RunInfo(model=reported_name, backend=backend)
88-
8960
def collect_data_from_stdout(self, stdout: str):
9061
stats = SATimeStats()
9162
stats.fill(stdout)
@@ -111,6 +82,16 @@ def _compress(self):
11182
**self.compression_params["sparsify_activations"],
11283
)
11384

85+
def get_num_compressed(self) -> None:
86+
"""
87+
88+
Get number of the FakeQuantize nodes in the compressed IR.
89+
"""
90+
super().get_num_compressed()
91+
ie = ov.Core()
92+
model = ie.read_model(model=self.path_compressed_ir)
93+
self.run_info.num_compress_nodes.num_sparse_activations = count_sparsifier_patterns_in_ov(model)
94+
11495

11596
class LMSparsifyActivations(SAPipelineMixin, LMWeightCompression):
11697
DEFAULT_SUBSET_SIZE = 32
@@ -198,6 +179,7 @@ def prepare_calibration_dataset(self):
198179
self.calibration_dataset = nncf.Dataset(chunks, self.get_transform_calibration_fn())
199180

200181
def save_compressed_model(self):
182+
self.path_compressed_ir = self.output_model_dir / self.OV_MODEL_NAME
201183
if self.backend == BackendType.CUDA_TORCH:
202184
self.model_hf.float()
203185
for module in self.model_hf.nncf.modules():

tests/post_training/experimental/sparsify_activations/test_sparsify_activations_conformance.py

+3-8
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
import yaml
1919

2020
from tests.post_training.experimental.sparsify_activations.model_scope import SPARSIFY_ACTIVATIONS_TEST_CASES
21-
from tests.post_training.experimental.sparsify_activations.pipelines import SARunInfo
22-
from tests.post_training.pipelines.base import BackendType
21+
from tests.post_training.pipelines.base import RunInfo
2322
from tests.post_training.test_quantize_conformance import fixture_batch_size # noqa: F401
2423
from tests.post_training.test_quantize_conformance import fixture_data # noqa: F401
2524
from tests.post_training.test_quantize_conformance import fixture_extra_columns # noqa: F401
@@ -44,7 +43,7 @@ def fixture_sparsify_activations_reference_data():
4443

4544
@pytest.fixture(scope="session", name="sparsify_activations_result_data")
4645
def fixture_sparsify_activations_report_data(output_dir):
47-
data: Dict[str, SARunInfo] = {}
46+
data: Dict[str, RunInfo] = {}
4847
yield data
4948
if data:
5049
test_results = OrderedDict(sorted(data.items()))
@@ -59,7 +58,7 @@ def test_sparsify_activations(
5958
test_case_name: str,
6059
data_dir: Path,
6160
output_dir: Path,
62-
sparsify_activations_result_data: Dict[str, SARunInfo],
61+
sparsify_activations_result_data: Dict[str, RunInfo],
6362
no_eval: bool,
6463
batch_size: int,
6564
run_fp32_backend: bool,
@@ -69,9 +68,6 @@ def test_sparsify_activations(
6968
capsys: pytest.CaptureFixture,
7069
extra_columns: bool,
7170
):
72-
fp32_model_params = {
73-
tc["model_id"]: tc for tc in SPARSIFY_ACTIVATIONS_TEST_CASES.values() if tc["backend"] == BackendType.FP32
74-
}
7571
run_pipeline(
7672
test_case_name,
7773
sparsify_activations_reference_data,
@@ -90,5 +86,4 @@ def test_sparsify_activations(
9086
extra_columns,
9187
False, # memory_monitor is not used in SA
9288
None, # use_avx2 is not used in SA
93-
fp32_model_params,
9489
)

tests/post_training/pipelines/base.py

+2-7
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import nncf
3131
from nncf import TargetDevice
3232
from tests.cross_fw.shared.command import Command
33-
from tests.torch.experimental.sparsify_activations.helpers import count_sparsifier_patterns_in_ov
3433
from tools.memory_monitor import MemoryType
3534
from tools.memory_monitor import MemoryUnit
3635
from tools.memory_monitor import memory_monitor_context
@@ -207,7 +206,6 @@ def get_result_dict(self):
207206
"Status": self.status[:LIMIT_LENGTH_OF_STATUS] if self.status is not None else None,
208207
"Build url": os.environ.get("BUILD_URL", ""),
209208
}
210-
211209
return result
212210

213211

@@ -423,9 +421,9 @@ def save_compressed_model(self) -> None:
423421
apply_moc_transformations(self.compressed_model, cf=True)
424422
ov.serialize(self.compressed_model, str(self.path_compressed_ir))
425423

426-
def get_num_compressed(self, to_count_sparse_activations: bool = False) -> None:
424+
def get_num_compressed(self) -> None:
427425
"""
428-
to_count_sparse_activations
426+
429427
Get number of the FakeQuantize nodes in the compressed IR.
430428
"""
431429

@@ -449,9 +447,6 @@ def get_num_compressed(self, to_count_sparse_activations: bool = False) -> None:
449447
self.run_info.num_compress_nodes.num_int8 = num_int8
450448
self.run_info.num_compress_nodes.num_int4 = num_int4
451449
self.run_info.num_compress_nodes.num_fq_nodes = num_fq
452-
self.run_info.num_compress_nodes.num_sparse_activations = (
453-
0 if not to_count_sparse_activations else count_sparsifier_patterns_in_ov(model)
454-
)
455450

456451
def run_bench(self) -> None:
457452
"""

tests/post_training/test_quantize_conformance.py

+14-9
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ def fixture_ptq_report_data(output_dir, run_benchmark_app, pytestconfig):
178178
if not run_benchmark_app:
179179
df = df.drop(columns=["FPS"])
180180

181+
df = df.drop(columns=["Num sparse activations"])
182+
181183
output_dir.mkdir(parents=True, exist_ok=True)
182184
output_file = output_dir / "results.csv"
183185

@@ -202,6 +204,7 @@ def fixture_wc_report_data(output_dir, run_benchmark_app, pytestconfig):
202204
df = df.drop(columns=["FPS"])
203205

204206
df = df.drop(columns=["Num FQ"])
207+
df = df.drop(columns=["Num sparse activations"])
205208

206209
output_dir.mkdir(parents=True, exist_ok=True)
207210
output_file = output_dir / "results.csv"
@@ -266,7 +269,7 @@ def create_pipeline_kwargs(test_model_param, subset_size, test_case_name, refere
266269
print(f"PTQ params: {test_model_param['compression_params']}")
267270

268271
# Get target fp32 metric value
269-
model_name = test_case_name.split("_backend_")[0]
272+
model_name = test_model_param.get("model_name", test_case_name.split("_backend_")[0])
270273
test_reference = reference_data[test_case_name]
271274
test_reference["metric_value_fp32"] = reference_data[f"{model_name}_backend_FP32"]["metric_value"]
272275

@@ -297,11 +300,14 @@ def _update_status(pipeline: BaseTestPipeline, errors: List[ErrorReason]) -> Lis
297300
return unexpected_errors
298301

299302

300-
def _collect_errors(err_msg: str, pipeline: BaseTestPipeline) -> List[ErrorReason]:
303+
def _collect_errors(
304+
pipeline: BaseTestPipeline,
305+
exception_report: Optional[ErrorReport] = None,
306+
) -> List[ErrorReport]:
301307
errors = []
302308

303-
if err_msg:
304-
errors.append(ErrorReport(ErrorReason.EXCEPTION, err_msg))
309+
if exception_report:
310+
errors.append(exception_report)
305311
return errors
306312

307313
run_info = pipeline.run_info
@@ -372,9 +378,7 @@ def run_pipeline(
372378
memory_monitor: bool,
373379
use_avx2: Optional[bool] = None,
374380
):
375-
pipeline = None
376-
err_msg = None
377-
test_model_param = None
381+
pipeline, exception_report, test_model_param = None, None, None
378382
start_time = time.perf_counter()
379383
if test_case_name not in reference_data:
380384
msg = f"{test_case_name} does not exist in 'reference_data.yaml'"
@@ -409,6 +413,7 @@ def run_pipeline(
409413
err_msg = str(e)
410414
if not err_msg:
411415
err_msg = "Unknown exception"
416+
exception_report = ErrorReport(ErrorReason.EXCEPTION, err_msg)
412417
traceback.print_exc()
413418
finally:
414419
if pipeline is not None:
@@ -424,7 +429,7 @@ def run_pipeline(
424429
run_info = create_short_run_info(test_model_param, err_msg, test_case_name)
425430
run_info.time_total = time.perf_counter() - start_time
426431

427-
errors = _collect_errors(err_msg, pipeline)
432+
errors = _collect_errors(pipeline, exception_report)
428433
unexpected_errors = _update_status(pipeline, errors)
429434
result_data[test_case_name] = run_info
430435

@@ -495,7 +500,7 @@ def test_weight_compression(
495500
WC_TEST_CASES,
496501
wc_result_data,
497502
output_dir,
498-
None,
503+
None, # data_dir is not used in WC
499504
no_eval,
500505
batch_size,
501506
run_fp32_backend,

0 commit comments

Comments
 (0)