Skip to content

Commit 4bbb48d

Browse files
committed
Resolving CI issues caused by incompatibility between Transformers and awq
Signed-off-by: Zhang, Weiwei1 <weiwei1.zhang@intel.com>
1 parent 6e567b7 commit 4bbb48d

File tree

6 files changed

+112
-7
lines changed

6 files changed

+112
-7
lines changed

auto_round/inference/backend.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ def fp8_static_scheme_checker(
396396
data_type=["int"],
397397
act_bits=WOQ_DEFAULT_ACT_BITS,
398398
alias=["auto_awq:gemm", "awq", "awq:gemm", "auto_awq"],
399-
requirements=["autoawq"],
399+
requirements=["autoawq", "transformers<4.57.0"],
400400
)
401401

402402
BackendInfos["qbits"] = BackendInfo(
@@ -1025,3 +1025,4 @@ def build_pip_commands(gptq_req, other_reqs):
10251025
log(joined_cmds)
10261026
if logger_level == "error":
10271027
exit(-1)
1028+

auto_round/testing_utils.py

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414

1515
import importlib.util
1616
import unittest
17-
17+
from functools import wraps
18+
from typing import Literal
1819
import torch
20+
from typing import Callable
1921
from transformers.utils.versions import require_version
2022

23+
from auto_round.logger import logger
24+
2125

2226
def is_gguf_available():
2327
return importlib.util.find_spec("gguf") is not None
@@ -211,3 +215,59 @@ def require_vlm_env(test_case):
211215
env_check &= importlib.util.find_spec("xformers") is not None
212216

213217
return unittest.skipUnless(env_check, "Environment is not satisfactory")(test_case)
218+
219+
220+
def require_package_version(
221+
package: str,
222+
version_spec: str,
223+
on_fail: Literal["skip", "warn", "error"] = "skip"
224+
) -> bool:
225+
"""
226+
Check if a package satisfies a version requirement.
227+
228+
Args:
229+
package (str): Name of the Python package (e.g., "transformers").
230+
version_spec (str): Version specifier string (e.g., ">=0.5.0", "<4.57.0").
231+
on_fail (str, optional): Behavior when requirement is not met:
232+
- "skip": return False (used for skipping tests)
233+
- "warn": issue a warning but return True
234+
- "error": raise ImportError
235+
Defaults to "skip".
236+
237+
Returns:
238+
bool: True if requirement satisfied or on_fail=="warn", False if skipped
239+
"""
240+
try:
241+
require_version(f"{package}{version_spec}")
242+
return True
243+
except ImportError as e:
244+
msg = f"Requirement not satisfied: {package}{version_spec}"
245+
if on_fail == "skip":
246+
return False
247+
elif on_fail == "warn":
248+
logger.warning_once(msg)
249+
return True
250+
else: # on_fail == "error"
251+
raise ImportError(msg) from e
252+
253+
254+
def require_package_version_ut(package: str, version_spec: str) -> Callable:
255+
"""
256+
Decorator for unittest.TestCase methods to enforce a package version requirement.
257+
258+
The decorated test will be skipped if the package version does not satisfy the requirement.
259+
260+
Args:
261+
package (str): Name of the package (e.g., "transformers", "auto-round").
262+
version_spec (str): Version specifier string (e.g., ">=0.5.0", "<4.57.0").
263+
264+
Returns:
265+
Callable: A decorator to wrap unittest test methods.
266+
"""
267+
def decorator(test_func: Callable) -> Callable:
268+
reason = f"Test requires {package}{version_spec}"
269+
return unittest.skipUnless(
270+
require_package_version(package, version_spec, on_fail="skip"),
271+
reason
272+
)(test_func)
273+
return decorator

test/test_cuda/test_auto_round_format.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@
1010

1111
from auto_round import AutoRound, AutoRoundConfig
1212
from auto_round.eval.evaluation import simple_evaluate_user_model
13-
from auto_round.testing_utils import require_autogptq, require_awq, require_greater_than_050, require_ipex
13+
from auto_round.testing_utils import (
14+
require_autogptq,
15+
require_awq,
16+
require_greater_than_050,
17+
require_ipex,
18+
require_package_version_ut,
19+
)
1420

1521

1622
class LLMDataLoader:
@@ -73,6 +79,7 @@ def tearDownClass(self):
7379
shutil.rmtree("runs", ignore_errors=True)
7480

7581
@require_greater_than_050
82+
@require_package_version_ut("transformers", "<4.57.0")
7683
def test_autoround_asym(self):
7784
for bits in [2, 3, 4, 8]:
7885
model = AutoModelForCausalLM.from_pretrained(self.model_name, torch_dtype="auto", trust_remote_code=True)
@@ -131,6 +138,7 @@ def test_mixed_precision(self):
131138
self.assertGreater(result["results"]["lambada_openai"]["acc,none"], 0.32)
132139

133140
@require_awq
141+
@require_package_version_ut("transformers", "<4.57.0")
134142
def test_awq_backend(self):
135143
model = AutoModelForCausalLM.from_pretrained(self.model_name, torch_dtype="auto", trust_remote_code=True)
136144
tokenizer = AutoTokenizer.from_pretrained(self.model_name, trust_remote_code=True)
@@ -235,6 +243,7 @@ def test_autoround_gptq_sym_format(self):
235243

236244
@require_awq
237245
@require_ipex
246+
@require_package_version_ut("transformers", "<4.57.0")
238247
def test_autoround_awq_sym_format(self):
239248
model = AutoModelForCausalLM.from_pretrained(self.model_name, torch_dtype="auto", trust_remote_code=True)
240249
tokenizer = AutoTokenizer.from_pretrained(self.model_name, trust_remote_code=True)
@@ -321,3 +330,4 @@ def test_load_gptq_model_3bits(self):
321330

322331
if __name__ == "__main__":
323332
unittest.main()
333+

test/test_cuda/test_export.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer
1010

1111
from auto_round import AutoRound
12-
from auto_round.testing_utils import require_awq, require_optimum
12+
from auto_round.testing_utils import require_awq, require_optimum, require_package_version_ut
1313

1414

1515
class LLMDataLoader:
@@ -185,6 +185,7 @@ def test_autoround_format(self):
185185
shutil.rmtree("./saved", ignore_errors=True)
186186

187187
@require_awq
188+
@require_package_version_ut("transformers", "<4.57.0")
188189
def test_autoawq_format(self):
189190
model = AutoModelForCausalLM.from_pretrained(self.model_name, torch_dtype="auto", trust_remote_code=True)
190191
tokenizer = AutoTokenizer.from_pretrained(self.model_name, trust_remote_code=True)
@@ -218,6 +219,7 @@ def test_autoawq_format(self):
218219

219220
@require_optimum
220221
@require_awq
222+
@require_package_version_ut("transformers", "<4.57.0")
221223
def test_autoawq_format_fp_qsave_layers(self):
222224
model = AutoModelForCausalLM.from_pretrained(self.model_name, torch_dtype="auto", trust_remote_code=True)
223225
layer_config = {
@@ -403,3 +405,4 @@ def test_nvfp4_llmcompressor_format(self):
403405

404406
if __name__ == "__main__":
405407
unittest.main()
408+

test/test_cuda/test_main_func.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
import transformers
1010
from lm_eval.utils import make_table # pylint: disable=E0401
1111
from transformers import AutoModelForCausalLM, AutoTokenizer
12+
from transformers.utils.versions import require_version
1213

1314
from auto_round import AutoRound, AutoRoundAdam
1415
from auto_round.eval.evaluation import simple_evaluate
15-
from auto_round.testing_utils import require_awq, require_gptqmodel, require_optimum
16+
from auto_round.testing_utils import require_awq, require_gptqmodel, require_optimum, require_package_version_ut
1617

1718

1819
def get_accuracy(data):
@@ -38,7 +39,6 @@ def tearDownClass(self):
3839

3940
@require_gptqmodel
4041
@require_optimum
41-
@require_awq
4242
def test_backend(self):
4343
model_name = "/models/opt-125m"
4444
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
@@ -64,6 +64,16 @@ def test_backend(self):
6464
assert accuracy > 0.35
6565
shutil.rmtree("./saved", ignore_errors=True)
6666

67+
@require_optimum
68+
@require_awq
69+
@require_package_version_ut("transformers", "<4.57.0")
70+
def test_backend_awq(self):
71+
model_name = "/models/opt-125m"
72+
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
73+
tokenizer = AutoTokenizer.from_pretrained(model_name)
74+
autoround = AutoRound(model, tokenizer, bits=4, group_size=128)
75+
autoround.quantize()
76+
6777
##test auto_awq format
6878
autoround.save_quantized(self.save_dir, format="auto_awq", inplace=False)
6979
model_args = f"pretrained={self.save_dir}"
@@ -73,9 +83,9 @@ def test_backend(self):
7383
assert accuracy > 0.35
7484
shutil.rmtree("./saved", ignore_errors=True)
7585

86+
7687
@unittest.skipIf(torch.cuda.is_available() is False, "Skipping because no cuda")
7788
@require_gptqmodel
78-
@require_awq
7989
def test_fp_layers(self):
8090
model_name = "/models/opt-125m"
8191
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
@@ -98,6 +108,23 @@ def test_fp_layers(self):
98108
assert accuracy > 0.35
99109
shutil.rmtree("./saved", ignore_errors=True)
100110

111+
112+
@unittest.skipIf(torch.cuda.is_available() is False, "Skipping because no cuda")
113+
@require_awq
114+
@require_package_version_ut("transformers", "<4.57.0")
115+
def test_fp_layers_awq(self):
116+
model_name = "/models/opt-125m"
117+
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
118+
tokenizer = AutoTokenizer.from_pretrained(model_name)
119+
from auto_round.utils import get_fp_layer_names
120+
121+
layer_names = get_fp_layer_names(model, "model.decoder.layers.0,model.decoder.layers.1")
122+
layer_configs = {}
123+
for name in layer_names:
124+
layer_configs[name] = {"bits": 16}
125+
autoround = AutoRound(model, tokenizer, bits=4, group_size=128)
126+
autoround.quantize()
127+
101128
##test auto_awq format
102129
autoround.save_quantized(self.save_dir, format="auto_awq", inplace=False)
103130
model_args = f"pretrained={self.save_dir}"
@@ -107,6 +134,7 @@ def test_fp_layers(self):
107134
assert accuracy > 0.35
108135
shutil.rmtree("./saved", ignore_errors=True)
109136

137+
110138
@unittest.skipIf(torch.cuda.is_available() is False, "Skipping because no cuda")
111139
def test_undivided_group_size_tuning(self):
112140
model_name = "/models/opt-125m"
@@ -157,3 +185,4 @@ def test_autoround_asym(self): ##need to install false
157185

158186
if __name__ == "__main__":
159187
unittest.main()
188+

test/test_cuda/test_support_vlms.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ def test_phi3(self):
128128
shutil.rmtree(quantized_model_path, ignore_errors=True)
129129

130130
@require_vlm_env
131+
@require_package_version_ut("transformers", "<4.57.0")
131132
def test_phi3_vision_awq(self):
132133
model_path = "/models/Phi-3.5-vision-instruct/"
133134
## test tune
@@ -387,3 +388,4 @@ def test_deepseek_vl2(self):
387388

388389
if __name__ == "__main__":
389390
unittest.main()
391+

0 commit comments

Comments
 (0)