Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

contiguous groups #147

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion src/llmcompressor/modifiers/quantization/gptq/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@
freeze_module_quantization,
)
from loguru import logger
from pydantic import Field
from pydantic import Field, field_validator
from torch.nn import Module

from llmcompressor.core.state import State
from llmcompressor.modifiers import Modifier, ModifierFactory
from llmcompressor.modifiers.quantization import CONTIGUOUS_ACTIVATION_ORDERINGS
from llmcompressor.modifiers.quantization.gptq.utils.gptq_wrapper import GPTQWrapper
from llmcompressor.modifiers.utils.layer_compressor import LayerCompressor
from llmcompressor.modifiers.utils.pytorch_helpers import run_calibration_forward
Expand Down Expand Up @@ -110,6 +111,24 @@ class GPTQModifier(Modifier):
compressible_layers_: Optional[List] = None
quantization_modifier_: Any = None

@field_validator("config_groups", mode="after")
def validate_config_groups(self, config_groups) -> Optional[Dict[str, QuantizationScheme]]:
if config_groups is not None:
for value in config_groups.values():
subfields = [value.weights, value.input_activations, value.output_activations]
for quant_args in subfields:
if quant_args is not None:
if quant_args.actorder in CONTIGUOUS_ACTIVATION_ORDERINGS:
if quant_args.contiguous_groups == False:
raise ValueError(f"Cannot set contiguous_groups={quant_args.contiguous_groups} for activation ordering {quant_args.actorder}")
quant_args.contiguous_groups = True
else:
if quant_args.contiguous_groups == True:
raise ValueError(f"Cannot set contiguous_groups={quant_args.contiguous_groups} for activation ordering {quant_args.actorder}")
quant_args.contiguous_groups = False

return config_groups

def on_initialize_structure(self, state: State, **kwargs):
"""
Check the model's quantization state matches that expected by this modifier,
Expand Down
25 changes: 23 additions & 2 deletions src/llmcompressor/modifiers/quantization/quantization/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,19 @@
is_preset_scheme,
preset_name_to_scheme,
set_module_for_calibration,
ActivationOrdering,
)
from compressed_tensors.quantization.observers.helpers import get_observer_token_count
from loguru import logger
from pydantic import Field
from pydantic import Field, field_validator
from torch.nn import Module

from llmcompressor.core import Event, EventType, State
from llmcompressor.modifiers import Modifier
from llmcompressor.modifiers.utils.pytorch_helpers import run_calibration_forward

__all__ = ["QuantizationModifier"]
__all__ = ["QuantizationModifier", "CONTIGUOUS_ACTIVATION_ORDERINGS"]
CONTIGUOUS_ACTIVATION_ORDERINGS = {ActivationOrdering.GROUP}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isn't ActivationOrdering.GROUP the only non-contiguous one? not the only contiguous one? CONTIGUOUS_ACTIVATION_ORDERINGS

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sorry I inverted the set accidentally



class QuantizationModifier(Modifier):
Expand Down Expand Up @@ -69,6 +71,25 @@ class QuantizationModifier(Modifier):
calibration_dataloader_: Any = None
calibration_function_: Any = None

@field_validator("config_groups", mode="after")
def validate_config_groups(self, config_groups) -> Optional[Dict[str, QuantizationScheme]]:
if config_groups is not None:
for value in config_groups.values():
subfields = [value.weights, value.input_activations, value.output_activations]
for quant_args in subfields:
if quant_args is not None:
if quant_args.actorder in CONTIGUOUS_ACTIVATION_ORDERINGS:
if quant_args.contiguous_groups == False:
raise ValueError(f"Cannot set contiguous_groups={quant_args.contiguous_groups} for activation ordering {quant_args.actorder}")
quant_args.contiguous_groups = True
else:
if quant_args.contiguous_groups == True:
raise ValueError(f"Cannot set contiguous_groups={quant_args.contiguous_groups} for activation ordering {quant_args.actorder}")
quant_args.contiguous_groups = False

return config_groups


def on_initialize_structure(self, state: State, **kwargs):
pass

Expand Down
Loading