From 864b4d01478691c202c1571fbbcb72e86d6cc44a Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Mon, 10 Nov 2025 03:26:25 +0000 Subject: [PATCH 1/3] implement propagate_error Signed-off-by: Kyle Sayers --- src/llmcompressor/args/dataset_arguments.py | 17 +++++++++++++---- .../pipelines/sequential/pipeline.py | 12 ++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/llmcompressor/args/dataset_arguments.py b/src/llmcompressor/args/dataset_arguments.py index a42e596ea..b648b21c1 100644 --- a/src/llmcompressor/args/dataset_arguments.py +++ b/src/llmcompressor/args/dataset_arguments.py @@ -223,10 +223,19 @@ class DatasetArguments(CustomDatasetArguments): quantization_aware_calibration: bool = field( default=True, metadata={ - "help": "Whether to enable quantization-aware calibration in the pipeline. " - "When True, quantization is applied during forward pass in calibration. " - "When False, quantization is disabled during forward pass in calibration. " - "Default is set to True." + "help": "Only relevant for the sequential pipeline. " + "If True, quantization is applied during forward pass in calibration. " + "If False, quantization is disabled during forward pass in calibration. " + "Default is True." + }, + ) + propagate_error: bool = field( + default=True, + metadata={ + "help": "Only relevant for the sequential pipeline. If True, use quantized " + "layer outputs as the inputs to the next sequential layer. If False, use " + "unquantized layer outputs as the inputs to the next sequential layer. " + "Default is True" }, ) diff --git a/src/llmcompressor/pipelines/sequential/pipeline.py b/src/llmcompressor/pipelines/sequential/pipeline.py index e95ffa915..59f9866ba 100644 --- a/src/llmcompressor/pipelines/sequential/pipeline.py +++ b/src/llmcompressor/pipelines/sequential/pipeline.py @@ -97,7 +97,11 @@ def __call__( # do a preliminary pass to trigger modifier hooks for batch_idx in tqdm(range(len(dataloader)), desc=calib_desc): inputs = activations.fetch(batch_idx, subgraph.input_names) - subgraph.forward(model, **inputs) + outputs = subgraph.forward(model, **inputs) + + if not dataset_args.propagate_error: + activations.update(batch_idx, outputs) + activations.delete(batch_idx, subgraph.consumed_names) LifecycleCallbacks.sequential_epoch_end(subgraph) @@ -106,10 +110,10 @@ def __call__( with HooksMixin.disable_hooks(): for batch_idx in tqdm(range(len(dataloader)), desc=prop_desc): inputs = activations.fetch(batch_idx, subgraph.input_names) - output = subgraph.forward(model, **inputs) + outputs = subgraph.forward(model, **inputs) - if subgraph_index < num_subgraphs - 1: - activations.update(batch_idx, output) + if dataset_args.propagate_error: + activations.update(batch_idx, outputs) activations.delete(batch_idx, subgraph.consumed_names) # redundant, finish any remaining compression From ffc44153e43dbd993ee9266b0ecb2be381521e36 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Mon, 10 Nov 2025 03:39:45 +0000 Subject: [PATCH 2/3] optimization Signed-off-by: Kyle Sayers --- .../pipelines/sequential/pipeline.py | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/llmcompressor/pipelines/sequential/pipeline.py b/src/llmcompressor/pipelines/sequential/pipeline.py index 59f9866ba..1176f1a7a 100644 --- a/src/llmcompressor/pipelines/sequential/pipeline.py +++ b/src/llmcompressor/pipelines/sequential/pipeline.py @@ -95,26 +95,27 @@ def __call__( # reduce memory movement by keeping modules onloaded with disable_offloading(): # do a preliminary pass to trigger modifier hooks - for batch_idx in tqdm(range(len(dataloader)), desc=calib_desc): - inputs = activations.fetch(batch_idx, subgraph.input_names) + for b_idx in tqdm(range(len(dataloader)), desc=calib_desc): + inputs = activations.fetch(b_idx, subgraph.input_names) outputs = subgraph.forward(model, **inputs) if not dataset_args.propagate_error: - activations.update(batch_idx, outputs) - activations.delete(batch_idx, subgraph.consumed_names) + activations.update(b_idx, outputs) + activations.delete(b_idx, subgraph.consumed_names) LifecycleCallbacks.sequential_epoch_end(subgraph) - # this pass does not trigger modifier hooks - # and is only used for capturing outputs of newly compressed modules - with HooksMixin.disable_hooks(): - for batch_idx in tqdm(range(len(dataloader)), desc=prop_desc): - inputs = activations.fetch(batch_idx, subgraph.input_names) - outputs = subgraph.forward(model, **inputs) - - if dataset_args.propagate_error: - activations.update(batch_idx, outputs) - activations.delete(batch_idx, subgraph.consumed_names) + if not dataset_args.propagate_error: + # this pass does not trigger modifier hooks + # and is only used for capturing outputs of compressed modules + with HooksMixin.disable_hooks(): + for b_idx in tqdm(range(len(dataloader)), desc=prop_desc): + inputs = activations.fetch(b_idx, subgraph.input_names) + outputs = subgraph.forward(model, **inputs) + + if dataset_args.propagate_error: + activations.update(b_idx, outputs) + activations.delete(b_idx, subgraph.consumed_names) # redundant, finish any remaining compression LifecycleCallbacks.calibration_epoch_end() From 66f36d223a3a250d3ce9d7730c0acb11582b8230 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Mon, 10 Nov 2025 03:40:09 +0000 Subject: [PATCH 3/3] fix typo Signed-off-by: Kyle Sayers --- src/llmcompressor/pipelines/sequential/pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llmcompressor/pipelines/sequential/pipeline.py b/src/llmcompressor/pipelines/sequential/pipeline.py index 1176f1a7a..bffd90c64 100644 --- a/src/llmcompressor/pipelines/sequential/pipeline.py +++ b/src/llmcompressor/pipelines/sequential/pipeline.py @@ -105,7 +105,7 @@ def __call__( LifecycleCallbacks.sequential_epoch_end(subgraph) - if not dataset_args.propagate_error: + if dataset_args.propagate_error: # this pass does not trigger modifier hooks # and is only used for capturing outputs of compressed modules with HooksMixin.disable_hooks():