test_compressed_tensors.py 7.61 KB
Newer Older
1
"""Test model set-up and weight loading for llmcompressor-quantized models.
2
3
4
5

Run `pytest tests/quantization/test_compressed_tensors.py`.
"""

6
import pytest
7
import torch
8
import os
9
10

from vllm.model_executor.layers.quantization.compressed_tensors.compressed_tensors import (  # noqa: E501
11
    CompressedTensorsLinearMethod, CompressedTensorsW4A16Sparse24,
12
    CompressedTensorsW8A8Fp8, CompressedTensorsW8A8Int8,
13
    CompressedTensorsW8A16Fp8, CompressedTensorsWNA16)
14
15
from vllm.model_executor.layers.quantization.compressed_tensors.utils import (
    QuantizationType)
16
from ..utils import models_path_prefix
17
from vllm.utils import is_hip
18
19


20
@pytest.mark.parametrize("model_args", [
21
    (os.path.join(models_path_prefix, "nm-testing/tinyllama-oneshot-w8w8-test-static-shape-change"), "tensor",
22
     QuantizationType.INT, 2560),
23
    (os.path.join(models_path_prefix, "nm-testing/tinyllama-oneshot-w8-channel-a8-tensor"), "channel",
24
     QuantizationType.INT, 2560),
25
26
])
def test_compressed_tensors_w8a8_static_setup(vllm_runner, model_args):
27
    model_path, strategy, quant_type, shape_0 = model_args
28
    with vllm_runner(model_path, enforce_eager=True) as llm:
29
30
        model = llm.model.llm_engine.model_executor.driver_worker.model_runner.model  # noqa: E501
        layer = model.model.layers[0]
31

32
33
34
35
        qkv_proj = layer.self_attn.qkv_proj
        o_proj = layer.self_attn.o_proj
        gate_up_proj = layer.mlp.gate_up_proj
        down_proj = layer.mlp.down_proj
36

37
38
39
40
41
42
        assert isinstance(qkv_proj.quant_method, CompressedTensorsLinearMethod)
        assert isinstance(o_proj.quant_method, CompressedTensorsLinearMethod)
        assert isinstance(gate_up_proj.quant_method,
                          CompressedTensorsLinearMethod)
        assert isinstance(down_proj.quant_method,
                          CompressedTensorsLinearMethod)
43
        assert isinstance(qkv_proj.scheme, CompressedTensorsW8A8Int8)
44

45
        assert qkv_proj.scheme.strategy == strategy
46
        assert qkv_proj.scheme.is_static_input_scheme
47
        expected_type = torch.int8
48
49
50
51

        assert qkv_proj.weight.dtype is expected_type
        assert o_proj.weight.dtype is expected_type
        assert gate_up_proj.weight.dtype is expected_type
52

53
        if qkv_proj.scheme.strategy == "tensor":
54
55
56
57
58
59
            # Make sure it is a channelwise buffer
            # After running process_weights_after_loading
            assert len(qkv_proj.weight_scale.shape) == 2
            assert qkv_proj.weight_scale.shape[0] == shape_0
            assert qkv_proj.weight_scale.shape[1] == 1
        assert qkv_proj.weight_scale.dtype is torch.float32
60
        assert qkv_proj.input_scale.dtype is torch.float32
61

62
        output = llm.generate_greedy(["Hello my name is"], max_tokens=20)
63
64
        assert output

65

66
def test_compressed_tensors_no_enforce_eager(vllm_runner):
67
    model_path = os.path.join(models_path_prefix, "nm-testing/tinyllama-oneshot-w8w8-test-static-shape-change")
68
    with vllm_runner(model_path) as llm:
69
        output = llm.generate_greedy("Hello my name is", max_tokens=20)
70
71
72
        assert output


73
@pytest.mark.parametrize("model_args", [
74
75
    (os.path.join(models_path_prefix, "nm-testing/tinyllama-oneshot-w8a8-dynamic-token-v2"), "tensor"),
    (os.path.join(models_path_prefix,"nm-testing/tinyllama-oneshot-w8a8-channel-dynamic-token-v2"), "channel"),
76
77
78
])
def test_compressed_tensors_w8a8_dynanmic_per_token(vllm_runner, model_args):
    model_path, strategy = model_args
79
    with vllm_runner(model_path, dtype=torch.float16) as llm:
80
81
82
83
84
85
        model = llm.model.llm_engine.model_executor.driver_worker.model_runner.model  # noqa: E501
        layer = model.model.layers[0]

        qkv_proj = layer.self_attn.qkv_proj

        assert isinstance(qkv_proj.quant_method, CompressedTensorsLinearMethod)
86
        assert isinstance(qkv_proj.scheme, CompressedTensorsW8A8Int8)
87
        assert not qkv_proj.scheme.is_static_input_scheme
88
        assert qkv_proj.scheme.strategy == strategy
89
        assert qkv_proj.weight.dtype is torch.int8
90

91
        output = llm.generate_greedy(["Hello my name is"], max_tokens=20)
92
93
        assert output

94

95
96
@pytest.mark.skipif(is_hip(),
                    reason="WNA16 is not supported on ROCm.")
97
98
@pytest.mark.parametrize(
    "wNa16_args",
99
100
101
    [(os.path.join(models_path_prefix,"nm-testing/tinyllama-oneshot-w4a16-channel-v2"), "channel", None, 8),
     (os.path.join(models_path_prefix,"nm-testing/tinyllama-oneshot-w4a16-group128-v2"), "group", 128, 8),
     (os.path.join(models_path_prefix,"nm-testing/tinyllama-oneshot-w8a16-per-channel"), "channel", None, 4)])
102
def test_compressed_tensors_wNa16(vllm_runner, wNa16_args):
103
    model, strategy, group, pack_factor = wNa16_args
104
105
106
107
108
109
    with vllm_runner(model) as llm:
        model = llm.model.llm_engine.model_executor.driver_worker.model_runner.model  # noqa: E501
        layer = model.model.layers[0]

        qkv_proj = layer.self_attn.qkv_proj
        assert isinstance(qkv_proj.quant_method, CompressedTensorsLinearMethod)
110
        assert isinstance(qkv_proj.scheme, CompressedTensorsWNA16)
111
112

        assert qkv_proj.scheme.strategy == strategy
113
        assert qkv_proj.scheme.group_size == (-1 if group is None else group)
114
115
116

        assert qkv_proj.weight_packed.dtype is torch.int32
        assert qkv_proj.weight_scale.dtype is torch.float16
117
        assert qkv_proj.scheme.pack_factor == pack_factor
118

119
120
121
        output = llm.generate_greedy("Hello my name is", max_tokens=20)
        assert output

122

123
124
@pytest.mark.skipif(is_hip(),
                    reason="W4A16 MARLIN is not supported on ROCm.")
125
def test_compressed_tensors_w4a16_marlin24(vllm_runner):
126
    model_path = os.path.join(models_path_prefix,"nm-testing/llama7b-one-shot-2_4-w4a16-marlin24-t")
127
128
129
130
131
132
133
134
135
136
    with vllm_runner(model_path) as llm:
        model = llm.model.llm_engine.model_executor.driver_worker.model_runner.model  # noqa: E501
        layer = model.model.layers[0]

        qkv_proj = layer.self_attn.qkv_proj

        assert isinstance(qkv_proj.quant_method, CompressedTensorsLinearMethod)
        assert isinstance(qkv_proj.scheme, CompressedTensorsW4A16Sparse24)
        assert qkv_proj.weight_packed.dtype is torch.int32

137
        output = llm.generate_greedy("Hello my name is", max_tokens=20)
138
        assert output
139
140


141
142
@pytest.mark.skipif(is_hip(),
                    reason="FP8 is not supported on ROCm.")
143
def test_compressed_tensors_fp8(vllm_runner):
144
    model_path = os.path.join(models_path_prefix,"nm-testing/Meta-Llama-3-8B-FP8-compressed-tensors-test")
145
146
147
148
149
150
151
    with vllm_runner(model_path) as llm:
        model = llm.model.llm_engine.model_executor.driver_worker.model_runner.model  # noqa: E501
        layer = model.model.layers[0]

        qkv_proj = layer.self_attn.qkv_proj

        assert isinstance(qkv_proj.quant_method, CompressedTensorsLinearMethod)
152
153
154
155
        assert isinstance(
            qkv_proj.scheme,
            (CompressedTensorsW8A8Fp8, CompressedTensorsW8A16Fp8))

156
        assert qkv_proj.input_scale.dtype is torch.float32
157
158
159
160
161
162

        if isinstance(qkv_proj.scheme, CompressedTensorsW8A8Fp8):
            assert len(qkv_proj.input_scale.shape) == 0
            assert qkv_proj.weight.dtype is torch.float8_e4m3fn
            assert qkv_proj.weight_scale.dtype is torch.float32
            assert len(qkv_proj.weight_scale.shape) == 0
163

164
        output = llm.generate_greedy("Hello my name is", max_tokens=20)
165
        assert output
166
167


168
169
@pytest.mark.skipif(is_hip(),
                    reason="FP8 KV cache is not supported on ROCm.")
170
def test_compressed_tensors_kv_cache(vllm_runner):
171
    model_path = os.path.join(models_path_prefix,"nm-testing/TinyLlama-1.1B-compressed-tensors-kv-cache-scheme")
172
173
    with vllm_runner(model_path, kv_cache_dtype="fp8") as llm:
        output = llm.generate_greedy("Hello world!", max_tokens=20)
174
        assert output