14
14
import copy
15
15
import inspect
16
16
import logging
17
- import warnings
18
- from typing import Union , List , Any , Tuple , Dict , Optional , Iterable , Callable , Sized
17
+ from typing import Any , Callable , Dict , List , Optional , Sized , Tuple , Union
19
18
20
19
import nncf
21
20
import openvino
22
21
import requests
23
22
import torch
24
23
import transformers
25
- from PIL .Image import Image
26
24
from huggingface_hub .constants import HUGGINGFACE_HUB_CACHE
27
25
from nncf .torch .initialization import PTInitializingDataLoader
28
- from torch .utils .data import RandomSampler , DataLoader
26
+ from PIL .Image import Image
27
+ from torch .utils .data import DataLoader , RandomSampler
29
28
from tqdm import tqdm
30
- from transformers import DataCollator , default_data_collator , AutoTokenizer , AutoProcessor
29
+ from transformers import AutoProcessor , AutoTokenizer , DataCollator , default_data_collator
31
30
32
- from optimum .intel import is_accelerate_available , OVModelForCausalLM , OVModelForVisualCausalLM , \
33
- OVModelForSpeechSeq2Seq , OVDiffusionPipeline
31
+ from optimum .intel import (
32
+ OVModelForCausalLM ,
33
+ OVModelForVisualCausalLM ,
34
+ is_accelerate_available ,
35
+ )
34
36
from optimum .intel .openvino .modeling_decoder import OVBaseDecoderModel
37
+ from optimum .intel .openvino .modeling_seq2seq import _OVModelForWhisper
35
38
from optimum .intel .openvino .quantization import OVQuantizationConfigBase
36
- from optimum .intel .openvino .utils import PREDEFINED_VISUAL_LM_DATASETS , PREDEFINED_SPEECH_TO_TEXT_DATASETS , \
37
- PREDEFINED_DIFFUSION_DATASETS
38
- from optimum .intel .utils .import_utils import is_datasets_available , DATASETS_IMPORT_ERROR , is_datasets_version
39
+ from optimum .intel .openvino .utils import (
40
+ PREDEFINED_DIFFUSION_DATASETS ,
41
+ PREDEFINED_SPEECH_TO_TEXT_DATASETS ,
42
+ PREDEFINED_VISUAL_LM_DATASETS ,
43
+ )
44
+ from optimum .intel .utils .import_utils import (
45
+ DATASETS_IMPORT_ERROR ,
46
+ is_datasets_available ,
47
+ is_datasets_version ,
48
+ is_diffusers_available ,
49
+ )
50
+
39
51
40
52
if is_datasets_available ():
41
53
from datasets import Dataset
42
54
55
+ if is_diffusers_available ():
56
+ from optimum .intel .openvino .modeling_diffusion import OVDiffusionPipeline
57
+
43
58
logger = logging .getLogger (__name__ )
44
59
45
60
@@ -158,14 +173,14 @@ def build_from_dataset(
158
173
remove_unused_columns : bool = False ,
159
174
) -> Dict [str , nncf .Dataset ]:
160
175
# TODO: deprecate remove_unused_columns ?
161
-
176
+
162
177
dataloader = self ._get_calibration_dataloader (dataset , batch_size , data_collator , remove_unused_columns )
163
178
164
179
if isinstance (self .model , OVBaseDecoderModel ):
165
180
return self ._prepare_decoder_calibration_data (quantization_config , dataloader )
166
181
elif isinstance (self .model , OVModelForVisualCausalLM ):
167
182
return self ._prepare_visual_causal_lm_calibration_data (quantization_config , dataloader )
168
- elif isinstance (self .model , OVModelForSpeechSeq2Seq ):
183
+ elif isinstance (self .model , _OVModelForWhisper ):
169
184
return self ._prepare_speech_to_text_calibration_data (quantization_config , dataloader )
170
185
elif isinstance (self .model , OVDiffusionPipeline ):
171
186
return self ._prepare_diffusion_calibration_data (quantization_config , dataloader )
@@ -216,8 +231,8 @@ def build_from_dataset_name(
216
231
The calibration `datasets.Dataset` to use for the post-training static quantization calibration step.
217
232
"""
218
233
# TODO: deprecate remove_unused_columns ?
219
-
220
- dataset = self ._load_dataset (
234
+
235
+ dataset = self .load_dataset (
221
236
dataset_name ,
222
237
dataset_config_name ,
223
238
dataset_split ,
@@ -228,13 +243,13 @@ def build_from_dataset_name(
228
243
trust_remote_code ,
229
244
streaming ,
230
245
)
231
-
246
+
232
247
return self .build_from_dataset (quantization_config , dataset , batch_size , data_collator , remove_unused_columns )
233
248
234
249
def build_from_quantization_config (self , config : OVQuantizationConfigBase ) -> Dict [str , nncf .Dataset ]:
235
250
if isinstance (self , OVModelForCausalLM ):
236
251
return self ._prepare_causal_lm_calibration_data (self , config )
237
- elif isinstance (self , (OVModelForVisualCausalLM , OVModelForSpeechSeq2Seq )):
252
+ elif isinstance (self , (OVModelForVisualCausalLM , _OVModelForWhisper )):
238
253
if config .processor is None :
239
254
raise ValueError (
240
255
"`processor` must be specified in order to run data-aware quantization. Please provide it as a"
@@ -261,8 +276,11 @@ def preprocess_function(item):
261
276
262
277
try :
263
278
inputs = self .model .preprocess_inputs (
264
- text = instruction , image = image , processor = processor , tokenizer = tokenizer ,
265
- config = self .model .config
279
+ text = instruction ,
280
+ image = image ,
281
+ processor = processor ,
282
+ tokenizer = tokenizer ,
283
+ config = self .model .config ,
266
284
)
267
285
except ValueError as value_error :
268
286
if "Tokenizer is required." in str (value_error ) and tokenizer_error is not None :
@@ -278,7 +296,7 @@ def preprocess_function(item):
278
296
preprocess_function = preprocess_function ,
279
297
trust_remote_code = trc ,
280
298
)
281
- elif isinstance (self .model , OVModelForSpeechSeq2Seq ):
299
+ elif isinstance (self .model , _OVModelForWhisper ):
282
300
dataset_metadata = PREDEFINED_SPEECH_TO_TEXT_DATASETS [config .dataset ]
283
301
284
302
def preprocess_function (item ):
@@ -320,12 +338,12 @@ def preprocess_function(item):
320
338
preprocess_function = preprocess_function ,
321
339
streaming = dataset_metadata ["streaming" ],
322
340
)
323
- elif not (isinstance (dataset , list ) and all (isinstance (it , str ) for it in dataset )):
341
+ elif not (isinstance (dataset , list ) and all (isinstance (it , str ) for it in dataset )):
324
342
raise Exception
325
343
326
344
return self .build_from_dataset (config , dataset )
327
345
328
- def _load_dataset (
346
+ def load_dataset (
329
347
self ,
330
348
dataset_name : str ,
331
349
dataset_config_name : Optional [str ] = None ,
@@ -371,7 +389,13 @@ def _load_dataset(
371
389
372
390
from datasets import load_dataset
373
391
374
- datasets_kwargs = {"name" : dataset_config_name , "split" : dataset_split , "token" : token , "cache_dir" : cache_dir , "streaming" : streaming }
392
+ datasets_kwargs = {
393
+ "name" : dataset_config_name ,
394
+ "split" : dataset_split ,
395
+ "token" : token ,
396
+ "cache_dir" : cache_dir ,
397
+ "streaming" : streaming ,
398
+ }
375
399
if is_datasets_version (">=" , "2.20.0" ):
376
400
datasets_kwargs ["trust_remote_code" ] = trust_remote_code
377
401
@@ -393,7 +417,7 @@ def _get_calibration_dataloader(
393
417
if not is_datasets_available ():
394
418
# TODO: update name
395
419
raise ValueError (DATASETS_IMPORT_ERROR .format ("OVQuantizer.get_calibration_dataset" ))
396
-
420
+
397
421
from datasets import Dataset
398
422
399
423
data_collator = data_collator if data_collator is not None else default_data_collator
@@ -433,7 +457,9 @@ def _prepare_decoder_calibration_data(
433
457
434
458
return {"model" : nncf .Dataset (collected_inputs )}
435
459
436
- def _prepare_causal_lm_calibration_data (self , config : OVQuantizationConfigBase , seqlen : Optional [int ] = 32 ) -> Dict [str , nncf .Dataset ]:
460
+ def _prepare_causal_lm_calibration_data (
461
+ self , config : OVQuantizationConfigBase , seqlen : Optional [int ] = 32
462
+ ) -> Dict [str , nncf .Dataset ]:
437
463
from optimum .gptq .data import get_dataset , prepare_dataset
438
464
439
465
tokenizer = AutoTokenizer .from_pretrained (config .tokenizer , trust_remote_code = config .trust_remote_code )
@@ -453,7 +479,9 @@ def _prepare_causal_lm_calibration_data(self, config: OVQuantizationConfigBase,
453
479
454
480
return {"model" : calibration_dataset }
455
481
456
- def _prepare_visual_causal_lm_calibration_data (self , quantization_config : OVQuantizationConfigBase , dataloader : OVDataLoader ) -> Dict [str , nncf .Dataset ]:
482
+ def _prepare_visual_causal_lm_calibration_data (
483
+ self , quantization_config : OVQuantizationConfigBase , dataloader : OVDataLoader
484
+ ) -> Dict [str , nncf .Dataset ]:
457
485
calibration_data = []
458
486
num_samples = quantization_config .num_samples or 32
459
487
for inputs in tqdm (dataloader , desc = "Collecting calibration dataset" , total = num_samples ):
@@ -477,9 +505,11 @@ def _prepare_visual_causal_lm_calibration_data(self, quantization_config: OVQuan
477
505
if len (calibration_data ) >= num_samples :
478
506
break
479
507
480
- return {"language_model " : nncf .Dataset (calibration_data )}
508
+ return {"lm_model " : nncf .Dataset (calibration_data )}
481
509
482
- def _prepare_speech_to_text_calibration_data (self , quantization_config : OVQuantizationConfigBase , dataloader : OVDataLoader ) -> Dict [str , nncf .Dataset ]:
510
+ def _prepare_speech_to_text_calibration_data (
511
+ self , quantization_config : OVQuantizationConfigBase , dataloader : OVDataLoader
512
+ ) -> Dict [str , nncf .Dataset ]:
483
513
encoder_calibration_data = []
484
514
encoder_model = self .model .encoder
485
515
encoder_model ._compile ()
@@ -535,16 +565,6 @@ def _prepare_diffusion_calibration_data(
535
565
size = diffuser .config .get ("sample_size" , 64 ) * self .model .vae_scale_factor
536
566
height , width = 2 * (min (size , 512 ),)
537
567
538
- # TODO: move the logic below to ov_quantizer
539
- # if dataset is not None:
540
- # if isinstance(dataset, nncf.Dataset):
541
- # return dataset
542
- # if is_datasets_available() and isinstance(dataset, Dataset):
543
- # dataset = dataset.select_columns(["caption"])
544
- #
545
- # def transform_fn(data_item):
546
- # return data_item if isinstance(data_item, (list, dict)) else [data_item]
547
-
548
568
num_samples = quantization_config .num_samples or 200
549
569
calibration_data = []
550
570
try :
0 commit comments