From ec29d25d9f7109f3fdaadfa51515eb6745a136ba Mon Sep 17 00:00:00 2001 From: Juri Ganitkevitch Date: Fri, 2 Feb 2024 03:34:12 -0500 Subject: [PATCH] Add missing None check for hf_quantizer (#28804) * Add missing None check for hf_quantizer * Add test, fix logic. * make style * Switch test model to Mistral * Comment * Update tests/test_modeling_utils.py --------- Co-authored-by: Younes Belkada <49240599+younesbelkada@users.noreply.github.com> --- src/transformers/modeling_utils.py | 10 ++++++---- tests/test_modeling_utils.py | 11 +++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/transformers/modeling_utils.py b/src/transformers/modeling_utils.py index e9ff9bd78c..dd19189332 100644 --- a/src/transformers/modeling_utils.py +++ b/src/transformers/modeling_utils.py @@ -3727,10 +3727,12 @@ class PreTrainedModel(nn.Module, ModuleUtilsMixin, GenerationMixin, PushToHubMix if param.device == torch.device("meta"): value = torch.empty(*param.size(), dtype=target_dtype) - if getattr( - hf_quantizer, "requires_parameters_quantization", False - ) or not hf_quantizer.check_quantized_param( - model, param_value=value, param_name=key, state_dict={} + if ( + hf_quantizer is None + or getattr(hf_quantizer, "requires_parameters_quantization", False) + or not hf_quantizer.check_quantized_param( + model, param_value=value, param_name=key, state_dict={} + ) ): set_module_tensor_to_device(model, key, "cpu", value) else: diff --git a/tests/test_modeling_utils.py b/tests/test_modeling_utils.py index aac78e955c..cef56822dc 100755 --- a/tests/test_modeling_utils.py +++ b/tests/test_modeling_utils.py @@ -34,6 +34,7 @@ from requests.exceptions import HTTPError from transformers import ( AutoConfig, AutoModel, + AutoModelForSequenceClassification, OwlViTForObjectDetection, PretrainedConfig, is_torch_available, @@ -201,6 +202,7 @@ if is_tf_available(): TINY_T5 = "patrickvonplaten/t5-tiny-random" TINY_BERT_FOR_TOKEN_CLASSIFICATION = "hf-internal-testing/tiny-bert-for-token-classification" +TINY_MISTRAL = "hf-internal-testing/tiny-random-MistralForCausalLM" def check_models_equal(model1, model2): @@ -300,6 +302,15 @@ class ModelUtilsTest(TestCasePlus): BertModel.from_pretrained(TINY_T5) self.assertTrue("You are using a model of type t5 to instantiate a model of type bert" in cl.out) + @require_accelerate + def test_model_from_pretrained_with_none_quantization_config(self): + # Needs a device_map for to enter the low_cpu_mem branch. We also load AutoModelForSequenceClassification + # deliberately to enter the missing keys branch. + model = AutoModelForSequenceClassification.from_pretrained( + TINY_MISTRAL, device_map="auto", quantization_config=None + ) + self.assertIsNotNone(model) + def test_model_from_config_torch_dtype(self): # test that the model can be instantiated with dtype of user's choice - as long as it's a # float dtype. To make it happen config.torch_dtype needs to be set before instantiating the