Skip to content

Commit 7e43385

Browse files
Fix Cuda CI failures due to Transformers and AWQ incompatibility (#882)
* Resolving CI issues caused by incompatibility between Transformers and awq Signed-off-by: Zhang, Weiwei1 <weiwei1.zhang@intel.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix import typo Signed-off-by: Zhang, Weiwei1 <weiwei1.zhang@intel.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Signed-off-by: Zhang, Weiwei1 <weiwei1.zhang@intel.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 6e567b7 commit 7e43385

File tree

6 files changed

+101
-7
lines changed

6 files changed

+101
-7
lines changed

auto_round/inference/backend.py

Lines changed: 1 addition & 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(

auto_round/testing_utils.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414

1515
import importlib.util
1616
import unittest
17+
from functools import wraps
18+
from typing import Callable, Literal
1719

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

test/test_cuda/test_auto_round_format.py

Lines changed: 10 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)

test/test_cuda/test_export.py

Lines changed: 3 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 = {

test/test_cuda/test_main_func.py

Lines changed: 28 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}"
@@ -75,7 +85,6 @@ def test_backend(self):
7585

7686
@unittest.skipIf(torch.cuda.is_available() is False, "Skipping because no cuda")
7787
@require_gptqmodel
78-
@require_awq
7988
def test_fp_layers(self):
8089
model_name = "/models/opt-125m"
8190
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
@@ -98,6 +107,22 @@ def test_fp_layers(self):
98107
assert accuracy > 0.35
99108
shutil.rmtree("./saved", ignore_errors=True)
100109

110+
@unittest.skipIf(torch.cuda.is_available() is False, "Skipping because no cuda")
111+
@require_awq
112+
@require_package_version_ut("transformers", "<4.57.0")
113+
def test_fp_layers_awq(self):
114+
model_name = "/models/opt-125m"
115+
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
116+
tokenizer = AutoTokenizer.from_pretrained(model_name)
117+
from auto_round.utils import get_fp_layer_names
118+
119+
layer_names = get_fp_layer_names(model, "model.decoder.layers.0,model.decoder.layers.1")
120+
layer_configs = {}
121+
for name in layer_names:
122+
layer_configs[name] = {"bits": 16}
123+
autoround = AutoRound(model, tokenizer, bits=4, group_size=128)
124+
autoround.quantize()
125+
101126
##test auto_awq format
102127
autoround.save_quantized(self.save_dir, format="auto_awq", inplace=False)
103128
model_args = f"pretrained={self.save_dir}"

test/test_cuda/test_support_vlms.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from PIL import Image
1010

1111
from auto_round import AutoRoundConfig # # must import for auto-round format
12-
from auto_round.testing_utils import require_gptqmodel, require_vlm_env
12+
from auto_round.testing_utils import require_gptqmodel, require_package_version_ut, require_vlm_env
1313

1414

1515
class TestSupportVLMS(unittest.TestCase):
@@ -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

0 commit comments

Comments
 (0)