"vscode:/vscode.git/clone" did not exist on "309c1bb822c94436e8beff60d68404b4cecd62b8"
test_gptq_dynamic.py 3.31 KB
Newer Older
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
5
6
7
8
9
10
11
12
"""Tests whether gptq models with dynamic quantized can be loaded.

Run `pytest tests/quantization/test_gptq_dynamic.py --forked`.
"""

import pytest
import torch

from vllm.model_executor.layers.linear import UnquantizedLinearMethod
from vllm.model_executor.layers.quantization.gptq import GPTQLinearMethod
13
from vllm.model_executor.layers.quantization.gptq_marlin import GPTQMarlinLinearMethod
14
from vllm.model_executor.layers.quantization.utils.gptq_utils import (
15
16
    get_dynamic_override,
)
17
18
19
20
21
22
23

PROMPT = "On the surface of Mars, we found"

# The first layer is quantized using bits=4, group_size=128
# The second layer is quantized using bits=8, group_size=32
# All other layers (layer index >= 2) are not quantized
MODEL_QUANT = [
24
25
26
27
28
    ("ModelCloud/Qwen1.5-1.8B-Chat-GPTQ-4bits-dynamic-cfg-with-lm_head-symTrue", True),
    (
        "ModelCloud/Qwen1.5-1.8B-Chat-GPTQ-4bits-dynamic-cfg-with-lm_head-symFalse",
        False,
    ),
29
30
31
32
]


@pytest.mark.parametrize("model_id, use_marlin_kernel", MODEL_QUANT)
33
34
35
def test_gptq_with_dynamic(
    vllm_runner, model_id: str, use_marlin_kernel: bool, monkeypatch
):
36
37
    # `LLM.apply_model` requires pickling a function.
    monkeypatch.setenv("VLLM_ALLOW_INSECURE_SERIALIZATION", "1")
38

39
40
41
    linear_method_cls = (
        GPTQMarlinLinearMethod if use_marlin_kernel else (GPTQLinearMethod)
    )
42

43
44
45
    with vllm_runner(
        model_id, dtype=torch.float16, max_model_len=2048, enforce_eager=True
    ) as llm:
46
47
48
49

        def check_model(model):
            for name, submodule in model.named_modules():
                if name == "lm_head":
50
51
                    assert isinstance(submodule.quant_method, linear_method_cls)
                elif name == "model.layers.0.self_attn.qkv_proj":
52
53
                    # The first layer is quantized using bits=4, group_size=128
                    # desc_act=True
54
                    assert isinstance(submodule.quant_method, linear_method_cls)
55
56
57
58
                    config = submodule.quant_method.quant_config
                    assert config.weight_bits == 4
                    assert config.group_size == 128
                    assert config.desc_act
59
                elif name == "model.layers.1.self_attn.qkv_proj":
60
61
                    # The second layer is quantized using bits=8, group_size=32
                    # desc_act=False
62
                    assert isinstance(submodule.quant_method, linear_method_cls)
63
                    config = submodule.quant_method.quant_config
64
65
66
67
68
69
70
                    assert (
                        get_dynamic_override(config, layer_name=name, key="bits") == 8
                    )
                    assert (
                        get_dynamic_override(config, layer_name=name, key="group_size")
                        == 32
                    )
71
                    assert not get_dynamic_override(
72
73
74
75
76
77
                        config, layer_name=name, key="desc_act"
                    )
                elif (
                    name == "model.layers.2.self_attn.qkv_proj"
                    or name == "model.layers.2.mlp.gate_up_proj"
                ):
78
                    # All other layers (layer index >= 2) are not quantized
79
                    assert isinstance(submodule.quant_method, UnquantizedLinearMethod)
80

81
        llm.apply_model(check_model)