Skip to content

llmcompressor.modifiers

Compression modifiers for applying various optimization techniques.

Provides the core modifier system for applying compression techniques like quantization, pruning, distillation, and other optimization methods to neural networks. Includes base classes, factory patterns, and interfaces for extensible compression workflows.

Modules:

Classes:

  • Modifier

    A base class for all modifiers to inherit from.

  • ModifierFactory

    A factory for loading and registering modifiers

  • ModifierInterface

    Defines the contract that all modifiers must implement

Modifier

Bases: ModifierInterface, HooksMixin

A base class for all modifiers to inherit from. Modifiers are used to modify the training process for a model. Defines base attributes and methods available to all modifiers

Lifecycle: 1. initialize 2. on_event -> * on_start if self.start <= event.current_index * on_end if self.end >= event.current_index 5. finalize

Parameters:

  • index

    The index of the modifier in the list of modifiers for the model

  • group

    The group name for the modifier

  • start

    The start step for the modifier

  • end

    The end step for the modifier

  • update

    The update step for the modifier

Methods:

  • finalize

    Finalize the modifier for the given model and state.

  • initialize

    Initialize the modifier for the given model and state.

  • on_end

    on_end is called when the modifier ends and must be implemented

  • on_event

    on_event is called whenever an event is triggered

  • on_finalize

    on_finalize is called on modifier finalization and

  • on_initialize

    on_initialize is called on modifier initialization and

  • on_start

    on_start is called when the modifier starts and

  • on_update

    on_update is called when the model in question must be

  • should_end

    :param event: The event to check if the modifier should end

  • should_start

    :param event: The event to check if the modifier should start

  • update_event

    Update modifier based on the given event. In turn calls

Attributes:

  • finalized (bool) –

    :return: True if the modifier has been finalized

  • initialized (bool) –

    :return: True if the modifier has been initialized

finalized property

finalized: bool

Returns:

  • bool

    True if the modifier has been finalized

initialized property

initialized: bool

Returns:

  • bool

    True if the modifier has been initialized

finalize

finalize(state: State, **kwargs)

Finalize the modifier for the given model and state.

Parameters:

  • state

    (State) –

    The current state of the model

  • kwargs

    Additional arguments for finalizing the modifier

Raises:

  • RuntimeError

    if the modifier has not been initialized

Source code in llmcompressor/modifiers/modifier.py
def finalize(self, state: State, **kwargs):
    """
    Finalize the modifier for the given model and state.

    :raises RuntimeError: if the modifier has not been initialized
    :param state: The current state of the model
    :param kwargs: Additional arguments for finalizing the modifier
    """
    if self.finalized_:
        raise RuntimeError("cannot finalize a modifier twice")

    if not self.initialized_:
        raise RuntimeError("cannot finalize an uninitialized modifier")

    # TODO: all finalization should succeed
    self.finalized_ = self.on_finalize(state=state, **kwargs)

initialize

initialize(state: State, **kwargs)

Initialize the modifier for the given model and state.

Parameters:

  • state

    (State) –

    The current state of the model

  • kwargs

    Additional arguments for initializing the modifier

Raises:

  • RuntimeError

    if the modifier has already been finalized

Source code in llmcompressor/modifiers/modifier.py
def initialize(self, state: State, **kwargs):
    """
    Initialize the modifier for the given model and state.

    :raises RuntimeError: if the modifier has already been finalized
    :param state: The current state of the model
    :param kwargs: Additional arguments for initializing the modifier
    """
    if self.initialized_:
        raise RuntimeError(
            "Cannot initialize a modifier that has already been initialized"
        )

    if self.finalized_:
        raise RuntimeError(
            "Cannot initialize a modifier that has already been finalized"
        )

    self.initialized_ = self.on_initialize(state=state, **kwargs)

    # trigger starts
    fake_start_event = Event(type_=EventType.BATCH_START, global_step=0)
    if self.should_start(fake_start_event):
        self.on_start(state, fake_start_event, **kwargs)
        self.started_ = True

on_end

on_end(state: State, event: Event, **kwargs)

on_end is called when the modifier ends and must be implemented by the inheriting modifier.

Parameters:

  • state

    (State) –

    The current state of the model

  • event

    (Event) –

    The event that triggered the end

  • kwargs

    Additional arguments for ending the modifier

Source code in llmcompressor/modifiers/modifier.py
def on_end(self, state: State, event: Event, **kwargs):
    """
    on_end is called when the modifier ends and must be implemented
    by the inheriting modifier.

    :param state: The current state of the model
    :param event: The event that triggered the end
    :param kwargs: Additional arguments for ending the modifier
    """
    pass

on_event

on_event(state: State, event: Event, **kwargs)

on_event is called whenever an event is triggered

Parameters:

  • state

    (State) –

    The current state of the model

  • event

    (Event) –

    The event that triggered the update

  • kwargs

    Additional arguments for updating the model

Source code in llmcompressor/modifiers/modifier.py
def on_event(self, state: State, event: Event, **kwargs):
    """
    on_event is called whenever an event is triggered

    :param state: The current state of the model
    :param event: The event that triggered the update
    :param kwargs: Additional arguments for updating the model
    """
    pass

on_finalize

on_finalize(state: State, **kwargs) -> bool

on_finalize is called on modifier finalization and must be implemented by the inheriting modifier.

Parameters:

  • state

    (State) –

    The current state of the model

  • kwargs

    Additional arguments for finalizing the modifier

Returns:

  • bool

    True if the modifier was finalized successfully, False otherwise

Source code in llmcompressor/modifiers/modifier.py
def on_finalize(self, state: State, **kwargs) -> bool:
    """
    on_finalize is called on modifier finalization and
    must be implemented by the inheriting modifier.

    :param state: The current state of the model
    :param kwargs: Additional arguments for finalizing the modifier
    :return: True if the modifier was finalized successfully,
        False otherwise
    """
    return True

on_initialize abstractmethod

on_initialize(state: State, **kwargs) -> bool

on_initialize is called on modifier initialization and must be implemented by the inheriting modifier.

Parameters:

  • state

    (State) –

    The current state of the model

  • kwargs

    Additional arguments for initializing the modifier

Returns:

  • bool

    True if the modifier was initialized successfully, False otherwise

Source code in llmcompressor/modifiers/modifier.py
@abstractmethod
def on_initialize(self, state: State, **kwargs) -> bool:
    """
    on_initialize is called on modifier initialization and
    must be implemented by the inheriting modifier.

    :param state: The current state of the model
    :param kwargs: Additional arguments for initializing the modifier
    :return: True if the modifier was initialized successfully,
        False otherwise
    """
    raise NotImplementedError()

on_start

on_start(state: State, event: Event, **kwargs)

on_start is called when the modifier starts and must be implemented by the inheriting modifier.

Parameters:

  • state

    (State) –

    The current state of the model

  • event

    (Event) –

    The event that triggered the start

  • kwargs

    Additional arguments for starting the modifier

Source code in llmcompressor/modifiers/modifier.py
def on_start(self, state: State, event: Event, **kwargs):
    """
    on_start is called when the modifier starts and
    must be implemented by the inheriting modifier.

    :param state: The current state of the model
    :param event: The event that triggered the start
    :param kwargs: Additional arguments for starting the modifier
    """
    pass

on_update

on_update(state: State, event: Event, **kwargs)

on_update is called when the model in question must be updated based on passed in event. Must be implemented by the inheriting modifier.

Parameters:

  • state

    (State) –

    The current state of the model

  • event

    (Event) –

    The event that triggered the update

  • kwargs

    Additional arguments for updating the model

Source code in llmcompressor/modifiers/modifier.py
def on_update(self, state: State, event: Event, **kwargs):
    """
    on_update is called when the model in question must be
    updated based on passed in event. Must be implemented by the
    inheriting modifier.

    :param state: The current state of the model
    :param event: The event that triggered the update
    :param kwargs: Additional arguments for updating the model
    """
    pass

should_end

should_end(event: Event)

Parameters:

  • event

    (Event) –

    The event to check if the modifier should end

Returns:

  • True if the modifier should end based on the given event

Source code in llmcompressor/modifiers/modifier.py
def should_end(self, event: Event):
    """
    :param event: The event to check if the modifier should end
    :return: True if the modifier should end based on the given event
    """
    current = event.current_index

    return self.end is not None and current >= self.end

should_start

should_start(event: Event) -> bool

Parameters:

  • event

    (Event) –

    The event to check if the modifier should start

Returns:

  • bool

    True if the modifier should start based on the given event

Source code in llmcompressor/modifiers/modifier.py
def should_start(self, event: Event) -> bool:
    """
    :param event: The event to check if the modifier should start
    :return: True if the modifier should start based on the given event
    """
    if self.start is None:
        return False

    current = event.current_index

    return self.start <= current and (self.end is None or current < self.end)

update_event

update_event(state: State, event: Event, **kwargs)

Update modifier based on the given event. In turn calls on_start, on_update, and on_end based on the event and modifier settings. Returns immediately if the modifier is not initialized

Parameters:

  • state

    (State) –

    The current state of sparsification

  • event

    (Event) –

    The event to update the modifier with

  • kwargs

    Additional arguments for updating the modifier

Raises:

  • RuntimeError

    if the modifier has been finalized

Source code in llmcompressor/modifiers/modifier.py
def update_event(self, state: State, event: Event, **kwargs):
    """
    Update modifier based on the given event. In turn calls
    on_start, on_update, and on_end based on the event and
    modifier settings. Returns immediately if the modifier is
    not initialized

    :raises RuntimeError: if the modifier has been finalized
    :param state: The current state of sparsification
    :param event: The event to update the modifier with
    :param kwargs: Additional arguments for updating the modifier
    """
    if not self.initialized_:
        raise RuntimeError("Cannot update an uninitialized modifier")

    if self.finalized_:
        raise RuntimeError("Cannot update a finalized modifier")

    self.on_event(state, event, **kwargs)

    # handle starting the modifier if needed
    if (
        event.type_ == EventType.BATCH_START
        and not self.started_
        and self.should_start(event)
    ):
        self.on_start(state, event, **kwargs)
        self.started_ = True
        self.on_update(state, event, **kwargs)

        return

    # handle ending the modifier if needed
    if (
        event.type_ == EventType.BATCH_END
        and not self.ended_
        and self.should_end(event)
    ):
        self.on_end(state, event, **kwargs)
        self.ended_ = True
        self.on_update(state, event, **kwargs)

        return

    if self.started_ and not self.ended_:
        self.on_update(state, event, **kwargs)

ModifierFactory

A factory for loading and registering modifiers

Methods:

  • create

    Instantiate a modifier of the given type from registered modifiers.

  • load_from_package

    :param package_path: The path to the package to load modifiers from

  • refresh

    A method to refresh the factory by reloading the modifiers

  • register

    Register a modifier class to be used by the factory.

create staticmethod

create(
    type_: str,
    allow_registered: bool,
    allow_experimental: bool,
    **kwargs
) -> Modifier

Instantiate a modifier of the given type from registered modifiers.

Parameters:

  • type_

    (str) –

    The type of modifier to create

  • framework

    The framework the modifier is for

  • allow_registered

    (bool) –

    Whether or not to allow registered modifiers

  • allow_experimental

    (bool) –

    Whether or not to allow experimental modifiers

  • kwargs

    Additional keyword arguments to pass to the modifier during instantiation

Returns:

  • Modifier

    The instantiated modifier

Raises:

  • ValueError

    If no modifier of the given type is found

Source code in llmcompressor/modifiers/factory.py
@staticmethod
def create(
    type_: str,
    allow_registered: bool,
    allow_experimental: bool,
    **kwargs,
) -> Modifier:
    """
    Instantiate a modifier of the given type from registered modifiers.

    :raises ValueError: If no modifier of the given type is found
    :param type_: The type of modifier to create
    :param framework: The framework the modifier is for
    :param allow_registered: Whether or not to allow registered modifiers
    :param allow_experimental: Whether or not to allow experimental modifiers
    :param kwargs: Additional keyword arguments to pass to the modifier
        during instantiation
    :return: The instantiated modifier
    """
    if type_ in ModifierFactory._errors:
        raise ModifierFactory._errors[type_]

    if type_ in ModifierFactory._registered_registry:
        if allow_registered:
            return ModifierFactory._registered_registry[type_](**kwargs)
        else:
            # TODO: log warning that modifier was skipped
            pass

    if type_ in ModifierFactory._experimental_registry:
        if allow_experimental:
            return ModifierFactory._experimental_registry[type_](**kwargs)
        else:
            # TODO: log warning that modifier was skipped
            pass

    if type_ in ModifierFactory._main_registry:
        return ModifierFactory._main_registry[type_](**kwargs)

    raise ValueError(f"No modifier of type '{type_}' found.")

load_from_package staticmethod

load_from_package(
    package_path: str,
) -> Dict[str, Type[Modifier]]

Parameters:

  • package_path

    (str) –

    The path to the package to load modifiers from

Returns:

  • Dict[str, Type[Modifier]]

    The loaded modifiers, as a mapping of name to class

Source code in llmcompressor/modifiers/factory.py
@staticmethod
def load_from_package(package_path: str) -> Dict[str, Type[Modifier]]:
    """
    :param package_path: The path to the package to load modifiers from
    :return: The loaded modifiers, as a mapping of name to class
    """
    loaded = {}
    main_package = importlib.import_module(package_path)

    for importer, modname, is_pkg in pkgutil.walk_packages(
        main_package.__path__, package_path + "."
    ):
        try:
            module = importlib.import_module(modname)

            for attribute_name in dir(module):
                if not attribute_name.endswith("Modifier"):
                    continue

                try:
                    if attribute_name in loaded:
                        continue

                    attr = getattr(module, attribute_name)

                    if not isinstance(attr, type):
                        raise ValueError(
                            f"Attribute {attribute_name} is not a type"
                        )

                    if not issubclass(attr, Modifier):
                        raise ValueError(
                            f"Attribute {attribute_name} is not a Modifier"
                        )

                    loaded[attribute_name] = attr
                except Exception as err:
                    # TODO: log import error
                    ModifierFactory._errors[attribute_name] = err
        except Exception as module_err:
            # TODO: log import error
            print(module_err)

    return loaded

refresh staticmethod

refresh()

A method to refresh the factory by reloading the modifiers Note: this will clear any previously registered modifiers

Source code in llmcompressor/modifiers/factory.py
@staticmethod
def refresh():
    """
    A method to refresh the factory by reloading the modifiers
    Note: this will clear any previously registered modifiers
    """
    ModifierFactory._main_registry = ModifierFactory.load_from_package(
        ModifierFactory._MAIN_PACKAGE_PATH
    )
    ModifierFactory._experimental_registry = ModifierFactory.load_from_package(
        ModifierFactory._EXPERIMENTAL_PACKAGE_PATH
    )
    ModifierFactory._loaded = True

register staticmethod

register(type_: str, modifier_class: Type[Modifier])

Register a modifier class to be used by the factory.

Parameters:

  • type_

    (str) –

    The type of modifier to register

  • modifier_class

    (Type[Modifier]) –

    The class of the modifier to register, must subclass the Modifier base class

Raises:

  • ValueError

    If the provided class does not subclass the Modifier base class or is not a type

Source code in llmcompressor/modifiers/factory.py
@staticmethod
def register(type_: str, modifier_class: Type[Modifier]):
    """
    Register a modifier class to be used by the factory.

    :raises ValueError: If the provided class does not subclass the Modifier
        base class or is not a type
    :param type_: The type of modifier to register
    :param modifier_class: The class of the modifier to register, must subclass
        the Modifier base class
    """
    if not issubclass(modifier_class, Modifier):
        raise ValueError(
            "The provided class does not subclass the Modifier base class."
        )
    if not isinstance(modifier_class, type):
        raise ValueError("The provided class is not a type.")

    ModifierFactory._registered_registry[type_] = modifier_class

ModifierInterface

Bases: ABC

Defines the contract that all modifiers must implement

Methods:

Attributes:

  • finalized (bool) –

    :return: True if the modifier has been finalized

  • initialized (bool) –

    :return: True if the modifier has been initialized

finalized abstractmethod property

finalized: bool

Returns:

  • bool

    True if the modifier has been finalized

initialized abstractmethod property

initialized: bool

Returns:

  • bool

    True if the modifier has been initialized

finalize abstractmethod

finalize(state: State, **kwargs)

Finalize the modifier

Parameters:

  • state

    (State) –

    The current state of the model

  • kwargs

    Additional keyword arguments for modifier finalization

Source code in llmcompressor/modifiers/interface.py
@abstractmethod
def finalize(self, state: State, **kwargs):
    """
    Finalize the modifier

    :param state: The current state of the model
    :param kwargs: Additional keyword arguments for
        modifier finalization
    """
    raise NotImplementedError()

initialize abstractmethod

initialize(state: State, **kwargs)

Initialize the modifier

Parameters:

  • state

    (State) –

    The current state of the model

  • kwargs

    Additional keyword arguments for modifier initialization

Source code in llmcompressor/modifiers/interface.py
@abstractmethod
def initialize(self, state: State, **kwargs):
    """
    Initialize the modifier

    :param state: The current state of the model
    :param kwargs: Additional keyword arguments
        for modifier initialization
    """
    raise NotImplementedError()

update_event abstractmethod

update_event(state: State, event: Event, **kwargs)

Update the modifier based on the event

Parameters:

  • state

    (State) –

    The current state of the model

  • event

    (Event) –

    The event to update the modifier with

  • kwargs

    Additional keyword arguments for modifier update

Source code in llmcompressor/modifiers/interface.py
@abstractmethod
def update_event(self, state: State, event: Event, **kwargs):
    """
    Update the modifier based on the event

    :param state: The current state of the model
    :param event: The event to update the modifier with
    :param kwargs: Additional keyword arguments for
        modifier update
    """
    raise NotImplementedError()