Files
Liger-Kernel/test/transformers/test_monkey_patch.py
T
Vaibhav JindalandClaude Opus 4.6 8e6232a08f Add Liger Kernel support for Ministral models (#1166)
This PR was generated automatically by Claude Code with minimal human
intervention. Claude uses the skill written in #1167 to generate this PR
and test it out.

Ministral (model_type: "ministral") is a separate model type in
transformers v5+ with its own MinistralForCausalLM class. This adds full
Liger Kernel optimization support including RoPE, RMSNorm, SwiGLU,
CrossEntropyLoss, and FusedLinearCrossEntropy.

## Summary
<!--- This is a required section; please describe the main purpose of
this proposed code change. --->

- Adds full Liger Kernel optimization for Ministral models (model_type:
"ministral") in transformers v5+
- Patches: RoPE, RMSNorm, SwiGLU, CrossEntropyLoss,
FusedLinearCrossEntropy
- All 5 tests (instance patching + 4 convergence) validated on H100 GPU

<!---
## Details
This is an optional section; is there anything specific that reviewers
should be aware of?
--->

## Testing Done
<!--- This is a required section; please describe how this change was
tested. --->

<!-- 
Replace BLANK with your device type. For example, A100-80G-PCIe

Complete the following tasks before sending your PR, and replace `[ ]`
with
`[x]` to indicate you have done them. 
-->

- Hardware Type: <BLANK>
- [x] run `make test` to ensure correctness
- [x] run `make checkstyle` to ensure code style
- [x] run `make test-convergence` to ensure convergence

---------

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
2026-03-27 22:21:31 +00:00

3307 lines
168 KiB
Python
Executable File

import inspect
from inspect import signature
from unittest.mock import MagicMock
from unittest.mock import Mock
from unittest.mock import patch
import pytest
import torch
import transformers
from packaging import version
from test.utils import get_mllama_rope_config
from test.utils import get_qwen3_vl_rope_config
from transformers import AutoModelForCausalLM
from transformers import PretrainedConfig
from transformers import PreTrainedModel
from liger_kernel.transformers import LigerBlockSparseTop2MLP
from liger_kernel.transformers import LigerExperts
from liger_kernel.transformers import LigerGEGLUMLP
from liger_kernel.transformers import LigerPhi3SwiGLUMLP
from liger_kernel.transformers import LigerQwen3MoeSwiGLUMLP
from liger_kernel.transformers import LigerRMSNorm
from liger_kernel.transformers import LigerSwiGLUMLP
from liger_kernel.transformers import monkey_patch
from liger_kernel.transformers.layer_norm import LigerLayerNorm
from liger_kernel.transformers.model.falcon_h1 import lce_forward as falcon_h1_lce_forward
from liger_kernel.transformers.model.gemma import lce_forward as gemma_lce_forward
from liger_kernel.transformers.model.gemma2 import lce_forward as gemma2_lce_forward
from liger_kernel.transformers.model.llama import lce_forward as llama_lce_forward
from liger_kernel.transformers.model.ministral import lce_forward as ministral_lce_forward
from liger_kernel.transformers.model.mistral import lce_forward as mistral_lce_forward
from liger_kernel.transformers.model.mixtral import lce_forward as mixtral_lce_forward
from liger_kernel.transformers.model.mllama import lce_forward as mllama_lce_forward
from liger_kernel.transformers.model.paligemma import lce_forward as paligemma_lce_forward
from liger_kernel.transformers.model.phi3 import lce_forward as phi3_lce_forward
from liger_kernel.transformers.model.qwen2 import lce_forward as qwen2_lce_forward
from liger_kernel.transformers.model.qwen3_5 import lce_forward as qwen3_5_lce_forward
from liger_kernel.transformers.model.qwen3_5 import lce_forward_for_multimodal as qwen3_5_lce_forward_for_multimodal
from liger_kernel.transformers.model.qwen3_next import lce_forward as qwen3_next_lce_forward
from liger_kernel.transformers.model.smollm3 import lce_forward as smolllm3_lce_forward
from liger_kernel.transformers.monkey_patch import MODEL_TYPE_TO_APPLY_LIGER_FN
from liger_kernel.transformers.monkey_patch import _apply_liger_kernel
from liger_kernel.transformers.monkey_patch import _apply_liger_kernel_to_instance
# We only support transformers >= 4.52.0
transformer_version = version.parse(transformers.__version__)
MIN_SUPPORTED_TRANSFORMERS_VERSION = version.parse("4.52.0")
if transformer_version < MIN_SUPPORTED_TRANSFORMERS_VERSION:
pytest.skip(
f"tests require transformers >= {MIN_SUPPORTED_TRANSFORMERS_VERSION}, got {transformers.__version__}",
allow_module_level=True,
)
IS_TRANSFORMERS_V5_OR_LATER = transformer_version >= version.parse("5.0.0")
# Check if optional modules are available
def is_mllama_available():
try:
import transformers.models.mllama # noqa: F401
return True
except ImportError:
return False
def is_internvl_available():
try:
import transformers.models.internvl # noqa: F401
return True
except ImportError:
return False
def is_smolvlm_available():
try:
import transformers.models.smolvlm # noqa: F401
return True
except ImportError:
return False
def is_llama4_available():
try:
import transformers.models.llama4 # noqa: F401
return True
except ImportError:
return False
def is_ministral_available():
try:
import transformers.models.ministral # noqa: F401
return True
except ImportError:
return False
def is_qwen3_available():
try:
import transformers.models.qwen3 # noqa: F401
return True
except ImportError:
return False
def is_qwen3_vl_available():
try:
import transformers.models.qwen3_vl # noqa: F401
return True
except ImportError:
return False
def is_qwen3_vl_moe_available():
try:
import transformers.models.qwen3_vl_moe # noqa: F401
return True
except ImportError:
return False
def is_smollm3_available():
try:
import transformers.models.smollm3 # noqa: F401
return True
except ImportError:
return False
def is_olmo2_available():
try:
import transformers.models.olmo2 # noqa: F401
return True
except ImportError:
return False
def is_olmo3_available():
try:
import transformers.models.olmo3 # noqa: F401
return True
except ImportError:
return False
def is_glm4_available():
try:
import transformers.models.glm4 # noqa: F401
return True
except ImportError:
return False
def is_glm4v_available():
try:
import transformers.models.glm4v # noqa: F401
return True
except ImportError:
return False
def is_glm4v_moe_available():
try:
import transformers.models.glm4v_moe # noqa: F401
return True
except ImportError:
return False
def is_gemma3_available():
try:
import transformers.models.gemma3 # noqa: F401
return True
except ImportError:
return False
def is_paligemma_available():
try:
import transformers.models.paligemma # noqa: F401
return True
except ImportError:
return False
def is_falcon_h1_available():
try:
import transformers.models.falcon_h1 # noqa: F401
return True
except ImportError:
return False
def is_qwen3_next_available():
try:
import transformers.models.qwen3_next # noqa: F401
return True
except ImportError:
return False
def is_qwen3_5_available():
try:
import transformers.models.qwen3_5 # noqa: F401
return True
except ImportError:
return False
def is_qwen3_5_moe_available():
try:
import transformers.models.qwen3_5_moe # noqa: F401
return True
except ImportError:
return False
def is_pixtral_available():
try:
import transformers.models.pixtral # noqa: F401
return True
except ImportError:
return False
def is_hunyuan_v1_available():
try:
import transformers.models.hunyuan_v1_dense # noqa: F401
return True
except ImportError:
return False
def is_nemotron_available():
try:
import transformers.models.nemotron # noqa: F401
return True
except ImportError:
return False
def test_import_from_root():
try:
from liger_kernel.transformers import AutoLigerKernelForCausalLM # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_gemma # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_gemma2 # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_gemma3 # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_gemma3_text # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_glm4 # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_glm4v # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_glm4v_moe # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_internvl # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_llama # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_ministral # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_mistral # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_mixtral # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_mllama # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_phi3 # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_qwen2 # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_qwen2_5_vl # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_qwen2_vl # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_qwen3 # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_qwen3_5 # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_qwen3_moe # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_qwen3_next # noqa: F401
from liger_kernel.transformers import apply_liger_kernel_to_smollm3 # noqa: F401
except Exception:
pytest.fail("Import kernel patch from root fails")
def test_apply_liger_kernel_no_supported_model_type():
# Test that calling _apply_liger_kernel with an unsupported model type is a no-op
mock_mistral = Mock()
with patch.dict(MODEL_TYPE_TO_APPLY_LIGER_FN, {"mistral": mock_mistral}):
_apply_liger_kernel("foobar")
MODEL_TYPE_TO_APPLY_LIGER_FN["mistral"].assert_not_called()
def test_apply_liger_kernel_only_supported_model_type_called():
# Test that liger kernel is applied only to the specified model
mock_gemma = Mock()
mock_llama = Mock()
mock_mistral = Mock()
with patch.dict(
MODEL_TYPE_TO_APPLY_LIGER_FN,
{"gemma": mock_gemma, "llama": mock_llama, "mistral": mock_mistral},
):
_apply_liger_kernel("llama")
mock_llama.assert_called_once()
mock_gemma.assert_not_called()
mock_mistral.assert_not_called()
def test_apply_liger_kernel_only_passes_valid_kwargs():
# Test that keyword args that are not valid for the apply_liger_* function are not passed
mock_llama = Mock()
def dummy_apply_liger_kernal_to_llama(
rope=False,
cross_entropy=False,
fused_linear_cross_entropy=True,
rms_norm=True,
swiglu=True,
):
pass
apply_liger_kernal_to_llama_sig = signature(dummy_apply_liger_kernal_to_llama)
with patch.dict(MODEL_TYPE_TO_APPLY_LIGER_FN, {"llama": mock_llama}):
mock_llama.__signature__ = apply_liger_kernal_to_llama_sig
(
_apply_liger_kernel(
"llama",
rope=False,
fused_linear_cross_entropy=False,
cross_entropy=True,
foobar=True,
barbaz=False,
),
)
mock_llama.assert_called_once()
mock_llama.assert_called_once_with(
rope=False,
fused_linear_cross_entropy=False,
cross_entropy=True,
)
def test_apply_liger_kernel_to_instance_no_supported_model_type():
# Test that calling _apply_liger_kernel_to_instance with an unsupported model type is a no-op
mock_mistral = Mock()
mock_unknown_model = MagicMock(spec=PreTrainedModel)
mock_unknown_model.config = {"model_type": "foobar"}
with patch.dict(MODEL_TYPE_TO_APPLY_LIGER_FN, {"mistral": mock_mistral}):
_apply_liger_kernel_to_instance(model=mock_unknown_model)
MODEL_TYPE_TO_APPLY_LIGER_FN["mistral"].assert_not_called()
def test_apply_liger_kernel_to_instance_only_supported_model_type_called():
# Test that liger kernel is applied only to the specified model
mock_gemma = Mock()
mock_llama = Mock()
mock_mistral = Mock()
mock_llama_model_instance = MagicMock(spec=PreTrainedModel)
mock_llama_model_instance.config = MagicMock(spec=PretrainedConfig)
mock_llama_model_instance.config.model_type = "llama"
with patch.dict(
MODEL_TYPE_TO_APPLY_LIGER_FN,
{"gemma": mock_gemma, "llama": mock_llama, "mistral": mock_mistral},
):
_apply_liger_kernel_to_instance(model=mock_llama_model_instance)
mock_llama.assert_called_once()
mock_gemma.assert_not_called()
mock_mistral.assert_not_called()
def test_apply_liger_kernel_to_instance_only_passes_valid_kwargs():
# Test that keyword args that are not valid for the apply_liger_* function are not passed
mock_llama = Mock()
mock_llama_model_instance = MagicMock(spec=PreTrainedModel)
mock_llama_model_instance.config = MagicMock(spec=PretrainedConfig)
mock_llama_model_instance.config.model_type = "llama"
def dummy_apply_liger_kernel_to_llama(
rope=False,
cross_entropy=False,
fused_linear_cross_entropy=True,
rms_norm=True,
swiglu=True,
model=None,
):
pass
apply_liger_kernel_to_llama_sig = signature(dummy_apply_liger_kernel_to_llama)
with patch.dict(MODEL_TYPE_TO_APPLY_LIGER_FN, {"llama": mock_llama}):
mock_llama.__signature__ = apply_liger_kernel_to_llama_sig
(
_apply_liger_kernel_to_instance(
model=mock_llama_model_instance,
rope=False,
fused_linear_cross_entropy=False,
cross_entropy=True,
foobar=True,
barbaz=False,
),
)
mock_llama.assert_called_once()
mock_llama.assert_called_once_with(
model=mock_llama_model_instance,
rope=False,
fused_linear_cross_entropy=False,
cross_entropy=True,
)
def test_patching_apis_match_auto_mapping():
# Test that all of the patching APIs present also have a corresponding entry in the auto mapping
patching_functions = [
func
for name, func in inspect.getmembers(monkey_patch, inspect.isfunction)
if name.startswith("apply_liger_kernel_to_")
]
assert set(patching_functions) == set(MODEL_TYPE_TO_APPLY_LIGER_FN.values())
def test_patching_apis_support_patching_model_instance():
# Test that all the patching APIs present support passing in
# model (PreTrainedModel) as an argument indicating that it supports
# patching post-model creation
patching_functions = [
func
for name, func in inspect.getmembers(monkey_patch, inspect.isfunction)
if name.startswith("apply_liger_kernel_to_")
]
for func in patching_functions:
sig = inspect.signature(func)
# Ensure 'model' is in the parameters
assert "model" in sig.parameters, (
f"{func.__name__} does not have 'model' as an argument. All patching methods must support patching an existing model instance."
)
def test_apply_liger_kernel_to_instance_for_llama():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.llama.modeling_llama"):
# Instantiate a dummy model
config = transformers.models.llama.configuration_llama.LlamaConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(llama_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(llama_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
# Ensure that the model patched with Liger modules can work properly
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_vl_available(), reason="qwen3_vl module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_vl_for_conditional_generation():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_vl.modeling_qwen3_vl"):
from transformers.models.qwen3_vl.modeling_qwen3_vl import Qwen3VLForConditionalGeneration
from liger_kernel.transformers.model.qwen3_vl import lce_forward as qwen3_vl_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen3_vl.configuration_qwen3_vl.Qwen3VLConfig(
attn_implementation="sdpa",
image_token_id=4,
video_token_id=5,
vision_start_token_id=1,
vision_end_token_id=2,
tie_word_embeddings=True,
vision_config=transformers.models.qwen3_vl.configuration_qwen3_vl.Qwen3VLVisionConfig(
depth=4,
hidden_size=256,
hidden_act="gelu_pytorch_tanh",
intermediate_size=512,
num_heads=4,
in_channels=3,
patch_size=16,
spatial_merge_size=2,
temporal_patch_size=2,
out_hidden_size=512,
num_position_embeddings=256,
deepstack_visual_indexes=[1, 2, 3],
initializer_range=0.02,
).to_dict(),
text_config=transformers.models.qwen3_vl.configuration_qwen3_vl.Qwen3VLTextConfig(
vocab_size=32000,
hidden_size=512,
intermediate_size=2048,
num_hidden_layers=4,
num_attention_heads=8,
num_key_value_heads=2,
head_dim=64,
hidden_act="silu",
max_position_embeddings=32768,
initializer_range=0.02,
rms_norm_eps=1e-6,
use_cache=False,
tie_word_embeddings=True,
attention_dropout=0.0,
attention_bias=False,
**get_qwen3_vl_rope_config(), # Version-aware rope configuration
).to_dict(),
)
dummy_model_instance = Qwen3VLForConditionalGeneration._from_config(config)
assert isinstance(dummy_model_instance, Qwen3VLForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for decoder_layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for decoder_layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_vl_available(), reason="qwen3_vl module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_vl():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_vl.modeling_qwen3_vl"):
from transformers.models.qwen3_vl.modeling_qwen3_vl import Qwen3VLModel
from liger_kernel.transformers.model.qwen3_vl import lce_forward as qwen3_vl_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen3_vl.configuration_qwen3_vl.Qwen3VLConfig(
attn_implementation="sdpa",
image_token_id=4,
video_token_id=5,
vision_start_token_id=1,
vision_end_token_id=2,
tie_word_embeddings=True,
vision_config=transformers.models.qwen3_vl.configuration_qwen3_vl.Qwen3VLVisionConfig(
depth=4,
hidden_size=256,
hidden_act="gelu_pytorch_tanh",
intermediate_size=512,
num_heads=4,
in_channels=3,
patch_size=16,
spatial_merge_size=2,
temporal_patch_size=2,
out_hidden_size=512,
num_position_embeddings=256,
deepstack_visual_indexes=[1, 2, 3],
initializer_range=0.02,
).to_dict(),
text_config=transformers.models.qwen3_vl.configuration_qwen3_vl.Qwen3VLTextConfig(
vocab_size=32000,
hidden_size=512,
intermediate_size=2048,
num_hidden_layers=4,
num_attention_heads=8,
num_key_value_heads=2,
head_dim=64,
hidden_act="silu",
max_position_embeddings=32768,
initializer_range=0.02,
rms_norm_eps=1e-6,
use_cache=False,
tie_word_embeddings=True,
attention_dropout=0.0,
attention_bias=False,
**get_qwen3_vl_rope_config(), # Version-aware rope configuration
).to_dict(),
)
dummy_model_instance = Qwen3VLModel._from_config(config)
assert isinstance(dummy_model_instance, Qwen3VLModel)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for decoder_layer in dummy_model_instance.language_model.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for decoder_layer in dummy_model_instance.language_model.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_vl_available(), reason="qwen3_vl module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_vl_text():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_vl.modeling_qwen3_vl"):
from transformers.models.qwen3_vl.modeling_qwen3_vl import Qwen3VLTextModel
# Instantiate a dummy model
config = transformers.models.qwen3_vl.configuration_qwen3_vl.Qwen3VLTextConfig(
vocab_size=32000,
hidden_size=512,
intermediate_size=2048,
num_hidden_layers=4,
num_attention_heads=8,
num_key_value_heads=2,
head_dim=64,
hidden_act="silu",
max_position_embeddings=32768,
initializer_range=0.02,
rms_norm_eps=1e-6,
use_cache=False,
tie_word_embeddings=True,
attention_dropout=0.0,
attention_bias=False,
**get_qwen3_vl_rope_config(), # Version-aware rope configuration
)
dummy_model_instance = Qwen3VLTextModel._from_config(config)
assert isinstance(dummy_model_instance, Qwen3VLTextModel)
# Check that model instance variables are not yet patched with Liger modules
# Note: Text models don't have forward method patching, so skip this check
assert inspect.getsource(dummy_model_instance.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for decoder_layer in dummy_model_instance.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
# Note: Text models don't have forward method patching, so skip this check
assert inspect.getsource(dummy_model_instance.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for decoder_layer in dummy_model_instance.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_vl_moe_available(), reason="qwen3_vl_moe module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_vl_moe_for_conditional_generation():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_vl_moe.modeling_qwen3_vl_moe"):
from transformers.models.qwen3_vl_moe.modeling_qwen3_vl_moe import Qwen3VLMoeForConditionalGeneration
from liger_kernel.transformers.model.qwen3_vl_moe import lce_forward as qwen3_vl_moe_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen3_vl_moe.configuration_qwen3_vl_moe.Qwen3VLMoeConfig(
attn_implementation="sdpa",
image_token_id=4,
video_token_id=5,
vision_start_token_id=1,
vision_end_token_id=2,
tie_word_embeddings=True,
vision_config=transformers.models.qwen3_vl_moe.configuration_qwen3_vl_moe.Qwen3VLMoeVisionConfig(
depth=4,
hidden_size=256,
hidden_act="gelu_pytorch_tanh",
intermediate_size=512,
num_heads=4,
in_channels=3,
patch_size=16,
spatial_merge_size=2,
temporal_patch_size=2,
out_hidden_size=512,
num_position_embeddings=256,
deepstack_visual_indexes=[1, 2, 3],
initializer_range=0.02,
).to_dict(),
text_config=transformers.models.qwen3_vl_moe.configuration_qwen3_vl_moe.Qwen3VLMoeTextConfig(
vocab_size=32000,
hidden_size=512,
intermediate_size=2048,
num_hidden_layers=4,
num_attention_heads=8,
num_key_value_heads=2,
head_dim=64,
hidden_act="silu",
max_position_embeddings=32768,
initializer_range=0.02,
rms_norm_eps=1e-6,
use_cache=False,
tie_word_embeddings=True,
attention_dropout=0.0,
attention_bias=False,
decoder_sparse_step=1,
moe_intermediate_size=1024,
num_experts_per_tok=2,
num_experts=4,
mlp_only_layers=[],
pad_token_id=None,
**get_qwen3_vl_rope_config(), # Version-aware rope configuration
).to_dict(),
)
dummy_model_instance = Qwen3VLMoeForConditionalGeneration._from_config(config)
assert isinstance(dummy_model_instance, Qwen3VLMoeForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_vl_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for decoder_layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_vl_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for decoder_layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_vl_moe_available(), reason="qwen3_vl_moe module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_vl_moe():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_vl_moe.modeling_qwen3_vl_moe"):
from transformers.models.qwen3_vl_moe.modeling_qwen3_vl_moe import Qwen3VLMoeModel
from liger_kernel.transformers.model.qwen3_vl_moe import lce_forward as qwen3_vl_moe_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen3_vl_moe.configuration_qwen3_vl_moe.Qwen3VLMoeConfig(
attn_implementation="sdpa",
image_token_id=4,
video_token_id=5,
vision_start_token_id=1,
vision_end_token_id=2,
tie_word_embeddings=True,
vision_config=transformers.models.qwen3_vl_moe.configuration_qwen3_vl_moe.Qwen3VLMoeVisionConfig(
depth=4,
hidden_size=256,
hidden_act="gelu_pytorch_tanh",
intermediate_size=512,
num_heads=4,
in_channels=3,
patch_size=16,
spatial_merge_size=2,
temporal_patch_size=2,
out_hidden_size=512,
num_position_embeddings=256,
deepstack_visual_indexes=[1, 2, 3],
initializer_range=0.02,
).to_dict(),
text_config=transformers.models.qwen3_vl_moe.configuration_qwen3_vl_moe.Qwen3VLMoeTextConfig(
vocab_size=32000,
hidden_size=512,
intermediate_size=2048,
num_hidden_layers=4,
num_attention_heads=8,
num_key_value_heads=2,
head_dim=64,
hidden_act="silu",
max_position_embeddings=32768,
initializer_range=0.02,
rms_norm_eps=1e-6,
use_cache=False,
tie_word_embeddings=True,
attention_dropout=0.0,
attention_bias=False,
decoder_sparse_step=1,
moe_intermediate_size=1024,
num_experts_per_tok=2,
num_experts=4,
mlp_only_layers=[],
pad_token_id=None,
**get_qwen3_vl_rope_config(), # Version-aware rope configuration
).to_dict(),
)
dummy_model_instance = Qwen3VLMoeModel._from_config(config)
assert isinstance(dummy_model_instance, Qwen3VLMoeModel)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_vl_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for decoder_layer in dummy_model_instance.language_model.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_vl_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for decoder_layer in dummy_model_instance.language_model.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_vl_moe_available(), reason="qwen3_vl_moe module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_vl_moe_text():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_vl_moe.modeling_qwen3_vl_moe"):
from transformers.models.qwen3_vl_moe.modeling_qwen3_vl_moe import Qwen3VLMoeTextModel
# Instantiate a dummy model
config = transformers.models.qwen3_vl_moe.configuration_qwen3_vl_moe.Qwen3VLMoeTextConfig(
vocab_size=32000,
hidden_size=512,
intermediate_size=2048,
num_hidden_layers=4,
num_attention_heads=8,
num_key_value_heads=2,
head_dim=64,
hidden_act="silu",
max_position_embeddings=32768,
initializer_range=0.02,
rms_norm_eps=1e-6,
use_cache=False,
tie_word_embeddings=True,
attention_dropout=0.0,
attention_bias=False,
decoder_sparse_step=1,
moe_intermediate_size=1024,
num_experts_per_tok=2,
num_experts=4,
mlp_only_layers=[],
pad_token_id=None,
**get_qwen3_vl_rope_config(), # Version-aware rope configuration
)
dummy_model_instance = Qwen3VLMoeTextModel._from_config(config)
assert isinstance(dummy_model_instance, Qwen3VLMoeTextModel)
# Check that model instance variables are not yet patched with Liger modules
# Note: Text models don't have forward method patching, so skip this check
assert inspect.getsource(dummy_model_instance.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for decoder_layer in dummy_model_instance.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
# Note: Text models don't have forward method patching, so skip this check
assert inspect.getsource(dummy_model_instance.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for decoder_layer in dummy_model_instance.layers:
assert inspect.getsource(decoder_layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
self_attn = getattr(decoder_layer, "self_attn", None)
if self_attn is not None:
if hasattr(self_attn, "q_norm") and self_attn.q_norm is not None:
assert inspect.getsource(self_attn.q_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
if hasattr(self_attn, "k_norm") and self_attn.k_norm is not None:
assert inspect.getsource(self_attn.k_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_vl_available(), reason="qwen3_vl module not available")
def test_qwen3_vl_rope_hooks_applied():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_vl.modeling_qwen3_vl") as modeling_mod:
from liger_kernel.transformers.monkey_patch import liger_rotary_pos_emb
from liger_kernel.transformers.monkey_patch import liger_rotary_pos_emb_vision
# Before applying, make sure attributes exist but are not the liger implementations
setattr(modeling_mod, "apply_rotary_pos_emb", object())
setattr(modeling_mod, "apply_rotary_pos_emb_vision", object())
_apply_liger_kernel("qwen3_vl")
assert modeling_mod.apply_rotary_pos_emb is liger_rotary_pos_emb
assert modeling_mod.apply_rotary_pos_emb_vision is liger_rotary_pos_emb_vision
@pytest.mark.skipif(not is_qwen3_vl_moe_available(), reason="qwen3_vl_moe module not available")
def test_qwen3_vl_moe_rope_hooks_applied():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_vl_moe.modeling_qwen3_vl_moe") as modeling_mod:
from liger_kernel.transformers.monkey_patch import liger_rotary_pos_emb
from liger_kernel.transformers.monkey_patch import liger_rotary_pos_emb_vision
# Before applying, make sure attributes exist but are not the liger implementations
setattr(modeling_mod, "apply_rotary_pos_emb", object())
setattr(modeling_mod, "apply_rotary_pos_emb_vision", object())
_apply_liger_kernel("qwen3_vl_moe")
assert modeling_mod.apply_rotary_pos_emb is liger_rotary_pos_emb
assert modeling_mod.apply_rotary_pos_emb_vision is liger_rotary_pos_emb_vision
@pytest.mark.skipif(not is_falcon_h1_available(), reason="falcon_h1 module not available")
def test_apply_liger_kernel_to_falcon_h1_for_causal_lm():
with patch("transformers.models.falcon_h1.modeling_falcon_h1"):
from transformers.models.falcon_h1.modeling_falcon_h1 import FalconH1ForCausalLM
# Instantiate a dummy model
config = transformers.models.falcon_h1.configuration_falcon_h1.FalconH1Config(
hidden_size=256,
num_hidden_layers=2,
num_attention_heads=4,
num_key_value_heads=2,
intermediate_size=1024,
)
dummy_model_instance = FalconH1ForCausalLM(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(falcon_h1_lce_forward)
assert inspect.getsource(dummy_model_instance.model.final_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.pre_ff_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(falcon_h1_lce_forward)
assert inspect.getsource(dummy_model_instance.model.final_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.pre_ff_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_mllama_available(), reason="mllama module not available")
def test_apply_liger_kernel_to_instance_for_mllama_for_conditional_generation():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.mllama.modeling_mllama"):
from transformers.models.mllama.modeling_mllama import MllamaForConditionalGeneration
from transformers.models.mllama.modeling_mllama import MllamaTextModel
# Instantiate a dummy model
config = transformers.models.mllama.configuration_mllama.MllamaConfig(
dtype=torch.bfloat16,
text_config=transformers.models.mllama.configuration_mllama.MllamaTextConfig(
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
**get_mllama_rope_config(), # Version-aware rope configuration
),
vision_config=transformers.models.mllama.configuration_mllama.MllamaVisionConfig(
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="gelu",
num_hidden_layers=2,
vision_output_dim=64,
),
)
dummy_model_instance = MllamaForConditionalGeneration._from_config(config)
assert isinstance(dummy_model_instance, MllamaForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(mllama_lce_forward)
if isinstance(dummy_model_instance.model.language_model, MllamaTextModel):
language_model = dummy_model_instance.model.language_model
else:
language_model = dummy_model_instance.model.language_model.model
assert inspect.getsource(language_model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in language_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(dummy_model_instance.model.vision_model.layernorm_pre.forward) != inspect.getsource(
LigerLayerNorm.forward
)
assert inspect.getsource(dummy_model_instance.model.vision_model.layernorm_post.forward) != inspect.getsource(
LigerLayerNorm.forward
)
for layer in dummy_model_instance.model.vision_model.transformer.layers:
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(
LigerLayerNorm.forward
)
for layer in dummy_model_instance.model.vision_model.global_transformer.layers:
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(
LigerLayerNorm.forward
)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(mllama_lce_forward)
assert inspect.getsource(language_model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in language_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(dummy_model_instance.model.vision_model.layernorm_pre.forward) == inspect.getsource(
LigerLayerNorm.forward
)
assert inspect.getsource(dummy_model_instance.model.vision_model.layernorm_post.forward) == inspect.getsource(
LigerLayerNorm.forward
)
for layer in dummy_model_instance.model.vision_model.transformer.layers:
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(
LigerLayerNorm.forward
)
for layer in dummy_model_instance.model.vision_model.global_transformer.layers:
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(
LigerLayerNorm.forward
)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_mllama_available(), reason="mllama module not available")
def test_apply_liger_kernel_to_instance_for_mllama_for_causal_lm():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.mllama.modeling_mllama"):
from transformers.models.mllama.modeling_mllama import MllamaForCausalLM
# Instantiate a dummy model
config = transformers.models.mllama.configuration_mllama.MllamaTextConfig(
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
**get_mllama_rope_config(), # Version-aware rope configuration
)
dummy_model_instance = MllamaForCausalLM._from_config(config)
assert isinstance(dummy_model_instance, MllamaForCausalLM)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(mllama_lce_forward)
assert not isinstance(dummy_model_instance.model.norm, LigerRMSNorm)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(mllama_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_pixtral_available(), reason="pixtral module not available")
def test_apply_liger_kernel_to_instance_for_pixtral_vision_model():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.pixtral.modeling_pixtral"):
from transformers.models.pixtral.modeling_pixtral import PixtralVisionModel
# Instantiate a dummy model
config = transformers.models.pixtral.configuration_pixtral.PixtralVisionConfig(
hidden_size=32,
intermediate_size=64,
num_hidden_layers=2,
num_attention_heads=4,
num_channels=3,
image_size=64,
patch_size=16,
hidden_act="silu",
attention_dropout=0.0,
rope_theta=10000.0,
)
dummy_model_instance = PixtralVisionModel._from_config(config)
assert isinstance(dummy_model_instance, PixtralVisionModel)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.ln_pre.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.transformer.layers:
assert inspect.getsource(layer.feed_forward.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.attention_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.ffn_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.ln_pre.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.transformer.layers:
assert inspect.getsource(layer.feed_forward.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.attention_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.ffn_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_llama4_available(), reason="llama4 module not available")
def test_apply_liger_kernel_to_instance_for_llama4_for_causal_lm():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.llama4.modeling_llama4"):
from transformers.models.llama4.modeling_llama4 import Llama4ForCausalLM
# Instantiate a dummy model
config = transformers.models.llama4.configuration_llama4.Llama4TextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
moe_layers=[1],
)
dummy_model_instance = Llama4ForCausalLM._from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if layer.is_moe_layer:
assert inspect.getsource(layer.feed_forward.shared_expert.forward) != inspect.getsource(
LigerSwiGLUMLP.forward
)
else:
assert inspect.getsource(layer.feed_forward.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if layer.is_moe_layer:
assert inspect.getsource(layer.feed_forward.shared_expert.forward) == inspect.getsource(
LigerSwiGLUMLP.forward
)
else:
assert inspect.getsource(layer.feed_forward.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_llama4_available(), reason="llama4 module not available")
def test_apply_liger_kernel_to_instance_for_llama4_for_conditional_generation():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.llama4.modeling_llama4"):
from transformers.models.llama4.modeling_llama4 import Llama4ForConditionalGeneration
# Instantiate a dummy model
config = transformers.models.llama4.configuration_llama4.Llama4Config(
dtype=torch.bfloat16,
text_config=transformers.models.llama4.configuration_llama4.Llama4TextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
moe_layers=[1],
),
vision_config=transformers.models.llama4.configuration_llama4.Llama4VisionConfig(
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="gelu",
num_hidden_layers=2,
vision_output_dim=64,
),
pad_token_id=None,
)
dummy_model_instance = Llama4ForConditionalGeneration._from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert isinstance(dummy_model_instance, Llama4ForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.language_model.model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.language_model.model.layers:
if layer.is_moe_layer:
assert inspect.getsource(layer.feed_forward.shared_expert.forward) != inspect.getsource(
LigerSwiGLUMLP.forward
)
else:
assert inspect.getsource(layer.feed_forward.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(dummy_model_instance.vision_model.layernorm_pre.forward) != inspect.getsource(
LigerLayerNorm.forward
)
assert inspect.getsource(dummy_model_instance.vision_model.layernorm_post.forward) != inspect.getsource(
LigerLayerNorm.forward
)
for layer in dummy_model_instance.vision_model.model.layers:
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(
LigerLayerNorm.forward
)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.language_model.model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.language_model.model.layers:
if layer.is_moe_layer:
assert inspect.getsource(layer.feed_forward.shared_expert.forward) == inspect.getsource(
LigerSwiGLUMLP.forward
)
else:
assert inspect.getsource(layer.feed_forward.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(dummy_model_instance.vision_model.layernorm_pre.forward) == inspect.getsource(
LigerLayerNorm.forward
)
assert inspect.getsource(dummy_model_instance.vision_model.layernorm_post.forward) == inspect.getsource(
LigerLayerNorm.forward
)
for layer in dummy_model_instance.vision_model.model.layers:
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(
LigerLayerNorm.forward
)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
def test_apply_liger_kernel_to_instance_for_mistral():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.mistral.modeling_mistral"):
# Instantiate a dummy model
config = transformers.models.mistral.configuration_mistral.MistralConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(mistral_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(mistral_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_ministral_available(), reason="ministral module not available")
def test_apply_liger_kernel_to_instance_for_ministral():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.ministral.modeling_ministral"):
# Instantiate a dummy model
config = transformers.models.ministral.configuration_ministral.MinistralConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
head_dim=16,
num_attention_heads=2,
num_key_value_heads=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(ministral_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(ministral_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
def test_apply_liger_kernel_to_instance_for_mixtral():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.mixtral.modeling_mixtral"):
# Instantiate a dummy model
config = transformers.models.mixtral.configuration_mixtral.MixtralConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
num_local_experts=3,
num_experts_per_tok=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(mixtral_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) != inspect.getsource(LigerExperts.forward)
else:
for expert in layer.block_sparse_moe.experts:
assert inspect.getsource(expert.forward) != inspect.getsource(LigerBlockSparseTop2MLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(mixtral_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) == inspect.getsource(LigerExperts.forward)
else:
for expert in layer.block_sparse_moe.experts:
assert inspect.getsource(expert.forward) == inspect.getsource(LigerBlockSparseTop2MLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
def test_apply_liger_kernel_to_instance_for_gemma():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.gemma.modeling_gemma"):
# Instantiate a dummy model
config = transformers.models.gemma.configuration_gemma.GemmaConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(gemma_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerGEGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(gemma_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerGEGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
def test_apply_liger_kernel_to_instance_for_gemma2():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.gemma2.modeling_gemma2"):
# Instantiate a dummy model
config = transformers.models.gemma2.configuration_gemma2.Gemma2Config(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(gemma2_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerGEGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.pre_feedforward_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(gemma2_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerGEGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.pre_feedforward_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_paligemma_available(), reason="paligemma module not available")
def test_apply_liger_kernel_to_instance_for_paligemma():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.paligemma.modeling_paligemma"):
from transformers.models.paligemma.modeling_paligemma import PaliGemmaForConditionalGeneration
# Instantiate a dummy model
config = transformers.models.paligemma.configuration_paligemma.PaliGemmaConfig(
dtype=torch.bfloat16,
text_config={
"num_hidden_layers": 2,
"rms_norm_eps": 1e-5,
"hidden_size": 32,
"intermediate_size": 64,
"hidden_act": "silu",
},
vision_config={
"num_hidden_layers": 2,
"layer_norm_eps": 1e-5,
"hidden_size": 48,
"intermediate_size": 64,
},
)
dummy_model_instance = PaliGemmaForConditionalGeneration(config)
assert isinstance(dummy_model_instance, PaliGemmaForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(paligemma_lce_forward)
assert inspect.getsource(
dummy_model_instance.model.vision_tower.vision_model.post_layernorm.forward
) != inspect.getsource(LigerLayerNorm.forward)
for layer in dummy_model_instance.model.vision_tower.vision_model.encoder.layers:
assert inspect.getsource(layer.layer_norm1.forward) != inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.layer_norm2.forward) != inspect.getsource(LigerLayerNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(paligemma_lce_forward)
assert inspect.getsource(
dummy_model_instance.model.vision_tower.vision_model.post_layernorm.forward
) == inspect.getsource(LigerLayerNorm.forward)
for layer in dummy_model_instance.model.vision_tower.vision_model.encoder.layers:
assert inspect.getsource(layer.layer_norm1.forward) == inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.layer_norm2.forward) == inspect.getsource(LigerLayerNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_gemma3_available(), reason="gemma3 module not available")
def test_apply_liger_kernel_to_instance_for_gemma3_text():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.gemma3.modeling_gemma3"):
from liger_kernel.transformers.model.gemma3 import causal_forward as gemma3_causal_forward
# Instantiate a dummy model
config = transformers.models.gemma3.configuration_gemma3.Gemma3TextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(gemma3_causal_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerGEGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.pre_feedforward_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
assert inspect.getsource(layer.self_attn.q_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.self_attn.k_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(gemma3_causal_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerGEGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.pre_feedforward_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
assert inspect.getsource(layer.self_attn.q_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.self_attn.k_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_gemma3_available(), reason="gemma3 module not available")
def test_apply_liger_kernel_to_instance_for_gemma3_conditional_generation():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.gemma3.modeling_gemma3"):
from transformers.models.gemma3.modeling_gemma3 import Gemma3ForConditionalGeneration
from liger_kernel.transformers.model.gemma3 import multimodal_forward as gemma3_multimodal_forward
# Instantiate a dummy model
text_config = transformers.models.gemma3.configuration_gemma3.Gemma3TextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
num_hidden_layers=2,
)
vision_config = transformers.models.siglip.configuration_siglip.SiglipVisionConfig(
layer_norm_eps=1e-5,
hidden_size=48,
intermediate_size=64,
)
config = transformers.models.gemma3.configuration_gemma3.Gemma3Config(text_config, vision_config)
dummy_model_instance = Gemma3ForConditionalGeneration._from_config(config)
assert isinstance(dummy_model_instance, Gemma3ForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(gemma3_multimodal_forward)
assert inspect.getsource(
dummy_model_instance.model.vision_tower.vision_model.post_layernorm.forward
) != inspect.getsource(LigerLayerNorm.forward)
for layer in dummy_model_instance.model.vision_tower.vision_model.encoder.layers:
assert inspect.getsource(layer.layer_norm1.forward) != inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.layer_norm2.forward) != inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(
dummy_model_instance.model.multi_modal_projector.mm_soft_emb_norm.forward
) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerGEGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.pre_feedforward_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
assert inspect.getsource(layer.self_attn.q_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.self_attn.k_norm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(gemma3_multimodal_forward)
assert inspect.getsource(
dummy_model_instance.model.vision_tower.vision_model.post_layernorm.forward
) == inspect.getsource(LigerLayerNorm.forward)
for layer in dummy_model_instance.model.vision_tower.vision_model.encoder.layers:
assert inspect.getsource(layer.layer_norm1.forward) == inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(layer.layer_norm2.forward) == inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(
dummy_model_instance.model.multi_modal_projector.mm_soft_emb_norm.forward
) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerGEGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.pre_feedforward_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
assert inspect.getsource(layer.self_attn.q_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.self_attn.k_norm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
def test_apply_liger_kernel_to_instance_for_qwen2():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen2.modeling_qwen2"):
# Instantiate a dummy model
config = transformers.models.qwen2.configuration_qwen2.Qwen2Config(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen2_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen2_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_available(), reason="qwen3 module not available")
def test_apply_liger_kernel_to_instance_for_qwen3():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3.modeling_qwen3"):
from liger_kernel.transformers.model.qwen3 import lce_forward as qwen3_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen3.configuration_qwen3.Qwen3Config(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_available(), reason="qwen3 module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_moe():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_moe.modeling_qwen3_moe"):
from liger_kernel.transformers.model.qwen3_moe import lce_forward as qwen3_moe_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen3_moe.configuration_qwen3_moe.Qwen3MoeConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) != inspect.getsource(LigerExperts.forward)
else:
for expert in layer.mlp.experts:
assert inspect.getsource(expert.forward) != inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) == inspect.getsource(LigerExperts.forward)
else:
for expert in layer.mlp.experts:
assert inspect.getsource(expert.forward) == inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(
transformer_version < version.parse("4.52.4"),
reason="Qwen2-VL support is only compatible with transformers >= 4.52.4",
)
def test_apply_liger_kernel_to_instance_for_qwen2_vl_for_conditional_generation():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen2_vl.modeling_qwen2_vl"):
from transformers.models.qwen2_vl.modeling_qwen2_vl import Qwen2VLForConditionalGeneration
from liger_kernel.transformers.model.qwen2_vl import lce_forward as qwen2_vl_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen2_vl.configuration_qwen2_vl.Qwen2VLConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=48,
embed_dim=16,
hidden_act="silu",
num_hidden_layers=2,
num_attention_heads=2,
max_position_embeddings=128,
vocab_size=1000,
vision_config={
"depth": 4,
"embed_dim": 128,
"num_heads": 8,
"hidden_size": 1024,
},
)
dummy_model_instance = Qwen2VLForConditionalGeneration._from_config(config)
assert isinstance(dummy_model_instance, Qwen2VLForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen2_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.model.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) != inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) != inspect.getsource(LigerLayerNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen2_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.model.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) == inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) == inspect.getsource(LigerLayerNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(
transformer_version < version.parse("4.52.4"),
reason="Qwen2-VL support is only compatible with transformers >= 4.52.4",
)
def test_apply_liger_kernel_to_instance_for_qwen2_vl():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen2_vl.modeling_qwen2_vl"):
from transformers.models.qwen2_vl.modeling_qwen2_vl import Qwen2VLModel
from liger_kernel.transformers.model.qwen2_vl import lce_forward as qwen2_vl_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen2_vl.configuration_qwen2_vl.Qwen2VLConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=48,
embed_dim=16,
hidden_act="silu",
num_hidden_layers=2,
num_attention_heads=2,
max_position_embeddings=128,
vocab_size=1000,
vision_config={
"depth": 4,
"embed_dim": 128,
"num_heads": 8,
"hidden_size": 1024,
},
)
dummy_model_instance = Qwen2VLModel._from_config(config)
assert isinstance(dummy_model_instance, Qwen2VLModel)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen2_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.language_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) != inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) != inspect.getsource(LigerLayerNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen2_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.language_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) == inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) == inspect.getsource(LigerLayerNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(
transformer_version < version.parse("4.52.4"),
reason="Qwen2-VL support is only compatible with transformers >= 4.52.4",
)
def test_apply_liger_kernel_to_instance_for_qwen2_vl_text():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen2_vl.modeling_qwen2_vl"):
from transformers.models.qwen2_vl.modeling_qwen2_vl import Qwen2VLTextModel
# Instantiate a dummy model
config = transformers.models.qwen2_vl.configuration_qwen2_vl.Qwen2VLTextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=48,
embed_dim=16,
hidden_act="silu",
num_hidden_layers=2,
num_attention_heads=2,
max_position_embeddings=128,
vocab_size=1000,
)
dummy_model_instance = Qwen2VLTextModel._from_config(config)
assert isinstance(dummy_model_instance, Qwen2VLTextModel)
# Check that model instance variables are not yet patched with Liger modules
# Note: Text models don't have forward method patching, so skip this check
assert inspect.getsource(dummy_model_instance.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
# Note: Text models don't have forward method patching, so skip this check
assert inspect.getsource(dummy_model_instance.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(
transformer_version < version.parse("4.52.4"),
reason="Qwen2.5-VL support is only compatible with transformers >= 4.52.4",
)
def test_apply_liger_kernel_to_instance_for_qwen2_5_vl():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen2_5_vl.modeling_qwen2_5_vl"):
from transformers.models.qwen2_5_vl.modeling_qwen2_5_vl import Qwen2_5_VLModel
from liger_kernel.transformers.model.qwen2_5_vl import lce_forward as qwen2_5_vl_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen2_5_vl.configuration_qwen2_5_vl.Qwen2_5_VLConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=48,
embed_dim=16,
hidden_act="silu",
num_hidden_layers=2,
num_attention_heads=2,
max_position_embeddings=128,
vocab_size=1000,
vision_config={
"depth": 4,
"embed_dim": 128,
"num_heads": 8,
"hidden_size": 1024,
},
)
dummy_model_instance = Qwen2_5_VLModel._from_config(config)
assert isinstance(dummy_model_instance, Qwen2_5_VLModel)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen2_5_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.language_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen2_5_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.language_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(
transformer_version < version.parse("4.52.4"),
reason="Qwen2.5-VL support is only compatible with transformers >= 4.52.4",
)
def test_apply_liger_kernel_to_instance_for_qwen2_5_vl_for_conditional_generation():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen2_5_vl.modeling_qwen2_5_vl"):
from transformers.models.qwen2_5_vl.modeling_qwen2_5_vl import Qwen2_5_VLForConditionalGeneration
from liger_kernel.transformers.model.qwen2_5_vl import lce_forward as qwen2_5_vl_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen2_5_vl.configuration_qwen2_5_vl.Qwen2_5_VLConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=48,
embed_dim=16,
hidden_act="silu",
num_hidden_layers=2,
num_attention_heads=2,
max_position_embeddings=128,
vocab_size=1000,
vision_config={
"depth": 4,
"embed_dim": 128,
"num_heads": 8,
"hidden_size": 1024,
},
)
dummy_model_instance = Qwen2_5_VLForConditionalGeneration._from_config(config)
assert isinstance(dummy_model_instance, Qwen2_5_VLForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen2_5_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.model.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen2_5_vl_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.model.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(
transformer_version < version.parse("4.52.4"),
reason="Qwen2.5-VL support is only compatible with transformers >= 4.52.4",
)
def test_apply_liger_kernel_to_instance_for_qwen2_5_vl_text():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen2_5_vl.modeling_qwen2_5_vl"):
from transformers.models.qwen2_5_vl.modeling_qwen2_5_vl import Qwen2_5_VLTextModel
# Instantiate a dummy model
config = transformers.models.qwen2_5_vl.configuration_qwen2_5_vl.Qwen2_5_VLTextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=48,
embed_dim=16,
hidden_act="silu",
num_hidden_layers=2,
num_attention_heads=2,
max_position_embeddings=128,
vocab_size=1000,
)
dummy_model_instance = Qwen2_5_VLTextModel._from_config(config)
assert isinstance(dummy_model_instance, Qwen2_5_VLTextModel)
# Check that model instance variables are not yet patched with Liger modules
# Note: Text models don't have forward method patching, so skip this check
assert inspect.getsource(dummy_model_instance.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
# Note: Text models don't have forward method patching, so skip this check
assert inspect.getsource(dummy_model_instance.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_internvl_available(), reason="internvl module not available")
def test_apply_liger_kernel_to_instance_for_internvl():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.internvl.modeling_internvl"):
from transformers.models.internvl.modeling_internvl import InternVLForConditionalGeneration
# Instantiate a dummy model
config = transformers.models.internvl.configuration_internvl.InternVLConfig(
dtype=torch.bfloat16,
text_config={
"rms_norm_eps": 1e-5,
"hidden_size": 256, # 1024
"intermediate_size": 1024, # 4096
"hidden_act": "silu",
"num_hidden_layers": 4, # 24
"num_attention_heads": 4, # 16
"num_key_value_heads": 2, # 16
"max_position_embeddings": 4096, # 8192
"vocab_size": 32000, # 151936
"bos_token_id": 1,
"eos_token_id": 2,
"pad_token_id": 2,
"tie_word_embeddings": False,
},
vision_config={
"hidden_size": 256, # 1024
"intermediate_size": 1024, # 4096
"num_hidden_layers": 4, # 24
"num_attention_heads": 4, # 16
},
image_token_id=10,
attn_implementation="sdpa", # default value, pytorch native attention
)
dummy_model_instance = InternVLForConditionalGeneration._from_config(config)
assert isinstance(dummy_model_instance, InternVLForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_smolvlm_available(), reason="smolvlm module not available")
def test_apply_liger_kernel_to_instance_for_smolvlm2():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.smolvlm.modeling_smolvlm"):
from transformers.models.smolvlm.modeling_smolvlm import SmolVLMForConditionalGeneration
# Instantiate a dummy model
config = transformers.models.smolvlm.configuration_smolvlm.SmolVLMConfig(
dtype=torch.bfloat16,
text_config={
"rms_norm_eps": 1e-5,
"hidden_size": 576,
"intermediate_size": 1536,
"hidden_act": "silu",
"num_hidden_layers": 2,
"num_attention_heads": 9,
"num_key_value_heads": 3,
"max_position_embeddings": 128,
"vocab_size": 1000,
},
vision_config={
"hidden_size": 768,
"intermediate_size": 3072,
"num_hidden_layers": 2,
"num_attention_heads": 12,
},
)
dummy_model_instance = SmolVLMForConditionalGeneration._from_config(config)
assert isinstance(dummy_model_instance, SmolVLMForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
# Text model checks
assert inspect.getsource(dummy_model_instance.model.text_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.text_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Vision model checks
assert inspect.getsource(dummy_model_instance.model.vision_model.post_layernorm.forward) != inspect.getsource(
LigerLayerNorm.forward
)
for encoder_layer in dummy_model_instance.model.vision_model.encoder.layers:
assert inspect.getsource(encoder_layer.layer_norm1.forward) != inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(encoder_layer.layer_norm2.forward) != inspect.getsource(LigerLayerNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
# Text model checks
assert inspect.getsource(dummy_model_instance.model.text_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.text_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
# Vision model checks
assert inspect.getsource(dummy_model_instance.model.vision_model.post_layernorm.forward) == inspect.getsource(
LigerLayerNorm.forward
)
for encoder_layer in dummy_model_instance.model.vision_model.encoder.layers:
assert inspect.getsource(encoder_layer.layer_norm1.forward) == inspect.getsource(LigerLayerNorm.forward)
assert inspect.getsource(encoder_layer.layer_norm2.forward) == inspect.getsource(LigerLayerNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
def test_apply_liger_kernel_to_instance_for_phi3():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.phi3.modeling_phi3"):
# Instantiate a dummy model
config = transformers.models.phi3.configuration_phi3.Phi3Config(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(phi3_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerPhi3SwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(phi3_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerPhi3SwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_olmo2_available(), reason="olmo2 module not available")
def test_apply_liger_kernel_to_instance_for_olmo2():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.olmo2.modeling_olmo2"):
from liger_kernel.transformers.model.olmo2 import lce_forward as olmo2_lce_forward
# Instantiate a dummy model
config = transformers.models.olmo2.configuration_olmo2.Olmo2Config(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(olmo2_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(olmo2_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_olmo3_available(), reason="olmo3 module not available")
def test_apply_liger_kernel_to_instance_for_olmo3():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.olmo3.modeling_olmo3"):
from liger_kernel.transformers.model.olmo3 import lce_forward as olmo3_lce_forward
# Instantiate a dummy model
config = transformers.models.olmo3.configuration_olmo3.Olmo3Config(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(olmo3_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(olmo3_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_feedforward_layernorm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_glm4_available(), reason="glm4 module not available")
def test_apply_liger_kernel_to_instance_for_glm4():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.glm4.modeling_glm4"):
from liger_kernel.transformers.model.glm4 import lce_forward as glm4_lce_forward
# Instantiate a dummy model
config = transformers.models.glm4.configuration_glm4.Glm4Config(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(glm4_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerPhi3SwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_self_attn_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_mlp_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(glm4_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerPhi3SwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_self_attn_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_mlp_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_glm4v_available(), reason="glm4v module not available")
def test_apply_liger_kernel_to_instance_for_glm4v():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.glm4v.modeling_glm4v"):
from transformers.models.glm4v.modeling_glm4v import Glm4vForConditionalGeneration
from liger_kernel.transformers.model.glm4v import lce_forward as glm4v_lce_forward
# Instantiate a dummy model
config = transformers.models.glm4v.configuration_glm4v.Glm4vConfig(
dtype=torch.bfloat16,
text_config={
"num_hidden_layers": 2,
"rms_norm_eps": 1e-5,
"hidden_size": 32,
"intermediate_size": 64,
"hidden_act": "silu",
"pad_token_id": None,
},
vision_config={
"num_hidden_layers": 2,
"rms_norm_eps": 1e-5,
"hidden_size": 48,
"intermediate_size": 64,
},
)
dummy_model_instance = Glm4vForConditionalGeneration(config)
assert isinstance(dummy_model_instance, Glm4vForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(glm4v_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerPhi3SwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_self_attn_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_mlp_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.model.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(vision_block.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(glm4v_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerPhi3SwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_self_attn_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_mlp_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
for vision_block in dummy_model_instance.model.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(vision_block.norm2.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(vision_block.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_glm4v_moe_available(), reason="glm4v_moe module not available")
def test_apply_liger_kernel_to_instance_for_glm4v_moe():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.glm4v_moe.modeling_glm4v_moe"):
from transformers.models.glm4v_moe.modeling_glm4v_moe import Glm4vMoeForConditionalGeneration
from liger_kernel.transformers.model.glm4v_moe import lce_forward as glm4v_moe_lce_forward
from liger_kernel.transformers.rms_norm import LigerRMSNormForGlm4
# Instantiate a dummy model
config = transformers.models.glm4v_moe.configuration_glm4v_moe.Glm4vMoeConfig(
dtype=torch.bfloat16,
hidden_size=32,
num_attention_heads=4,
num_key_value_heads=2,
text_config={
"hidden_size": 16,
"intermediate_size": 32,
"num_attention_heads": 4,
"num_hidden_layers": 2,
"rms_norm_eps": 1e-5,
"hidden_act": "silu",
"n_routed_experts": 1,
},
vision_config={
"num_hidden_layers": 2,
"rms_norm_eps": 1e-5,
"hidden_size": 48,
"intermediate_size": 64,
},
)
dummy_model_instance = Glm4vMoeForConditionalGeneration(config)
assert isinstance(dummy_model_instance, Glm4vMoeForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(glm4v_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) != inspect.getsource(
LigerRMSNormForGlm4.forward
)
assert inspect.getsource(dummy_model_instance.model.visual.post_conv_layernorm.forward) != inspect.getsource(
LigerRMSNormForGlm4.forward
)
assert inspect.getsource(dummy_model_instance.model.visual.post_layernorm.forward) != inspect.getsource(
LigerRMSNormForGlm4.forward
)
for decoder_layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(decoder_layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) != inspect.getsource(
LigerRMSNormForGlm4.forward
)
assert inspect.getsource(decoder_layer.input_layernorm.forward) != inspect.getsource(
LigerRMSNormForGlm4.forward
)
if decoder_layer.mlp.experts is not None:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(decoder_layer.mlp.experts.forward) != inspect.getsource(LigerExperts.forward)
else:
for expert in decoder_layer.mlp.experts:
assert inspect.getsource(expert.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
if decoder_layer.mlp.shared_experts is not None:
assert inspect.getsource(decoder_layer.mlp.shared_experts.forward) != inspect.getsource(
LigerSwiGLUMLP.forward
)
for vision_block in dummy_model_instance.model.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) != inspect.getsource(LigerRMSNormForGlm4.forward)
assert inspect.getsource(vision_block.norm2.forward) != inspect.getsource(LigerRMSNormForGlm4.forward)
assert inspect.getsource(vision_block.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(glm4v_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) == inspect.getsource(
LigerRMSNormForGlm4.forward
)
assert inspect.getsource(dummy_model_instance.model.visual.post_conv_layernorm.forward) == inspect.getsource(
LigerRMSNormForGlm4.forward
)
assert inspect.getsource(dummy_model_instance.model.visual.post_layernorm.forward) == inspect.getsource(
LigerRMSNormForGlm4.forward
)
for decoder_layer in dummy_model_instance.model.language_model.layers:
if decoder_layer.mlp is not None:
assert inspect.getsource(decoder_layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(decoder_layer.post_attention_layernorm.forward) == inspect.getsource(
LigerRMSNormForGlm4.forward
)
assert inspect.getsource(decoder_layer.input_layernorm.forward) == inspect.getsource(
LigerRMSNormForGlm4.forward
)
if getattr(decoder_layer.mlp, "experts", None) is not None:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(decoder_layer.mlp.experts.forward) == inspect.getsource(
LigerExperts.forward
)
else:
for expert in decoder_layer.mlp.experts:
assert inspect.getsource(expert.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
if getattr(decoder_layer.mlp, "shared_experts", None) is not None:
assert inspect.getsource(decoder_layer.mlp.shared_experts.forward) == inspect.getsource(
LigerSwiGLUMLP.forward
)
for vision_block in dummy_model_instance.model.visual.blocks:
assert inspect.getsource(vision_block.norm1.forward) == inspect.getsource(LigerRMSNormForGlm4.forward)
assert inspect.getsource(vision_block.norm2.forward) == inspect.getsource(LigerRMSNormForGlm4.forward)
assert inspect.getsource(vision_block.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_smollm3_available(), reason="smollm3 module not available")
def test_apply_liger_kernel_to_instance_for_smollm3():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.smollm3.modeling_smollm3"):
# Instantiate a dummy model
config = transformers.models.smollm3.configuration_smollm3.SmolLM3Config(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(smolllm3_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(smolllm3_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
# Ensure that the model patched with Liger modules can work properly
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_next_available(), reason="qwen3_next module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_next():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_next.modeling_qwen3_next"):
# Instantiate a dummy model
config = transformers.models.qwen3_next.configuration_qwen3_next.Qwen3NextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
moe_intermediate_size=16,
shared_expert_intermediate_size=16,
hidden_act="silu",
num_hidden_layers=2,
num_experts=2,
num_experts_per_tok=1,
mlp_only_layers=[1],
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_next_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if hasattr(layer, "mlp") and hasattr(layer.mlp, "experts"):
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) != inspect.getsource(LigerExperts.forward)
else:
for expert in layer.mlp.experts:
assert inspect.getsource(expert.forward) != inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
if hasattr(layer.mlp, "shared_expert"):
assert inspect.getsource(layer.mlp.shared_expert.forward) != inspect.getsource(
LigerSwiGLUMLP.forward
)
else:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_next_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if hasattr(layer, "mlp") and hasattr(layer.mlp, "experts"):
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) == inspect.getsource(LigerExperts.forward)
else:
for expert in layer.mlp.experts:
assert inspect.getsource(expert.forward) == inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
if hasattr(layer.mlp, "shared_expert"):
assert inspect.getsource(layer.mlp.shared_expert.forward) == inspect.getsource(
LigerSwiGLUMLP.forward
)
else:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_5_moe_available(), reason="qwen3_5_moe module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_5_moe():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_5_moe.modeling_qwen3_5_moe"):
from liger_kernel.transformers.model.qwen3_5_moe import lce_forward as qwen3_5_moe_lce_forward
# Instantiate a dummy model
config = transformers.models.qwen3_5_moe.configuration_qwen3_5_moe.Qwen3_5MoeTextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
moe_intermediate_size=16,
shared_expert_intermediate_size=16,
hidden_act="silu",
num_hidden_layers=2,
num_attention_heads=2,
num_key_value_heads=1,
head_dim=16,
linear_conv_kernel_dim=4,
linear_key_head_dim=16,
linear_value_head_dim=16,
linear_num_key_heads=2,
linear_num_value_heads=2,
num_experts=2,
num_experts_per_tok=1,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_5_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) != inspect.getsource(LigerExperts.forward)
else:
for expert in layer.mlp.experts:
assert inspect.getsource(expert.forward) != inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.mlp.shared_expert.forward) != inspect.getsource(
LigerQwen3MoeSwiGLUMLP.forward
)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_5_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) == inspect.getsource(LigerExperts.forward)
else:
for expert in layer.mlp.experts:
assert inspect.getsource(expert.forward) == inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.mlp.shared_expert.forward) == inspect.getsource(
LigerQwen3MoeSwiGLUMLP.forward
)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_5_available(), reason="qwen3_5 module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_5():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_5.modeling_qwen3_5"):
# Instantiate a dummy model
config = transformers.models.qwen3_5.configuration_qwen3_5.Qwen3_5TextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=4,
num_attention_heads=2,
num_key_value_heads=2,
head_dim=16,
linear_conv_kernel_dim=4,
linear_key_head_dim=16,
linear_value_head_dim=16,
linear_num_key_heads=2,
linear_num_value_heads=2,
layer_types=["linear_attention", "linear_attention", "linear_attention", "full_attention"],
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_5_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_5_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_qwen3_5_available(), reason="qwen3_5 module not available")
def test_apply_liger_kernel_to_instance_for_qwen3_5_for_conditional_generation():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.qwen3_5.modeling_qwen3_5"):
# Instantiate a dummy model
config = transformers.models.qwen3_5.configuration_qwen3_5.Qwen3_5Config(
attn_implementation="sdpa",
image_token_id=4,
video_token_id=5,
vision_start_token_id=1,
vision_end_token_id=2,
tie_word_embeddings=True,
vision_config=transformers.models.qwen3_5.configuration_qwen3_5.Qwen3_5VisionConfig(
depth=4,
hidden_size=256,
hidden_act="gelu_pytorch_tanh",
intermediate_size=512,
num_heads=4,
in_channels=3,
patch_size=16,
spatial_merge_size=2,
temporal_patch_size=2,
out_hidden_size=512,
num_position_embeddings=256,
initializer_range=0.02,
).to_dict(),
text_config=transformers.models.qwen3_5.configuration_qwen3_5.Qwen3_5TextConfig(
dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=4,
num_attention_heads=2,
num_key_value_heads=2,
head_dim=16,
linear_conv_kernel_dim=4,
linear_key_head_dim=16,
linear_value_head_dim=16,
linear_num_key_heads=2,
linear_num_value_heads=2,
layer_types=["linear_attention", "linear_attention", "linear_attention", "full_attention"],
).to_dict(),
)
from transformers.models.qwen3_5.modeling_qwen3_5 import Qwen3_5ForConditionalGeneration
dummy_model_instance = Qwen3_5ForConditionalGeneration._from_config(config)
assert isinstance(dummy_model_instance, Qwen3_5ForConditionalGeneration)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(qwen3_5_lce_forward_for_multimodal)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) != inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(qwen3_5_lce_forward_for_multimodal)
assert inspect.getsource(dummy_model_instance.model.language_model.norm.forward) == inspect.getsource(
LigerRMSNorm.forward
)
for layer in dummy_model_instance.model.language_model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_hunyuan_v1_available(), reason="hunyuan_v1 module not available")
def test_apply_liger_kernel_to_instance_for_hunyuan_v1_moe():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.hunyuan_v1_moe.modeling_hunyuan_v1_moe"):
from liger_kernel.transformers.model.hunyuan_v1 import lce_forward as hunyuan_v1_moe_lce_forward
# Instantiate a dummy model
config = transformers.models.hunyuan_v1_moe.configuration_hunyuan_v1_moe.HunYuanMoEV1Config(
torch_dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
head_dim=1,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(hunyuan_v1_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) != inspect.getsource(LigerExperts.forward)
else:
for expert in layer.mlp.experts:
assert inspect.getsource(expert.forward) != inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(hunyuan_v1_moe_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
if IS_TRANSFORMERS_V5_OR_LATER:
assert inspect.getsource(layer.mlp.experts.forward) == inspect.getsource(LigerExperts.forward)
else:
for mlp_expert in layer.mlp.experts:
assert inspect.getsource(mlp_expert.forward) == inspect.getsource(LigerQwen3MoeSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_hunyuan_v1_available(), reason="hunyuan_v1_dense module not available")
def test_apply_liger_kernel_to_instance_for_hunyuan_v1_dense():
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.hunyuan_v1_dense.modeling_hunyuan_v1_dense"):
from liger_kernel.transformers.model.hunyuan_v1 import lce_forward as hunyuan_v1_dense_lce_forward
# Instantiate a dummy model
config = transformers.models.hunyuan_v1_dense.configuration_hunyuan_v1_dense.HunYuanDenseV1Config(
torch_dtype=torch.bfloat16,
rms_norm_eps=1e-5,
hidden_size=32,
intermediate_size=64,
hidden_act="silu",
num_hidden_layers=2,
head_dim=1,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(hunyuan_v1_dense_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) != inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) != inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) != inspect.getsource(LigerRMSNorm.forward)
# Test applying kernels to the model instance
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's instance variables were correctly patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(hunyuan_v1_dense_lce_forward)
assert inspect.getsource(dummy_model_instance.model.norm.forward) == inspect.getsource(LigerRMSNorm.forward)
for layer in dummy_model_instance.model.layers:
assert inspect.getsource(layer.mlp.forward) == inspect.getsource(LigerSwiGLUMLP.forward)
assert inspect.getsource(layer.input_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
assert inspect.getsource(layer.post_attention_layernorm.forward) == inspect.getsource(LigerRMSNorm.forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")
@pytest.mark.skipif(not is_nemotron_available(), reason="nemotron not available")
def test_apply_liger_kernel_to_instance_for_nemotron():
from liger_kernel.transformers.model.nemotron import lce_forward as nemotron_lce_forward
# Ensure any monkey patching is cleaned up for subsequent tests
with patch("transformers.models.nemotron.modeling_nemotron"):
# Instantiate a dummy model
config = transformers.models.nemotron.configuration_nemotron.NemotronConfig(
hidden_size=32,
intermediate_size=64,
hidden_act="relu2",
num_hidden_layers=2,
num_attention_heads=2,
num_key_value_heads=2,
norm_eps=1e-5,
)
dummy_model_instance = AutoModelForCausalLM.from_config(config)
# Check that model instance variables are not yet patched with Liger modules
assert inspect.getsource(dummy_model_instance.forward) != inspect.getsource(nemotron_lce_forward)
# Test applying kernels to the model instance
# Nemotron only supports rope and fused_linear_cross_entropy patching
_apply_liger_kernel_to_instance(model=dummy_model_instance)
# Check that the model's forward was correctly patched
assert inspect.getsource(dummy_model_instance.forward) == inspect.getsource(nemotron_lce_forward)
try:
print(dummy_model_instance)
except Exception as e:
pytest.fail(f"An exception occured in extra_expr: {type(e).__name__} - {e}")