Skip to content

Commit d02e281

Browse files
committed
OV Tokenizer Leftovers
- Support SD Pipeline Slow Tokenizer Conversion - Support SD Mixed Quantization - Move Converted OV Tokenizers to a Separate Folder
1 parent b017856 commit d02e281

File tree

5 files changed

+45
-10
lines changed

5 files changed

+45
-10
lines changed

optimum/commands/export/openvino.py

+9
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from huggingface_hub.constants import HUGGINGFACE_HUB_CACHE
2222

2323
from ...exporters import TasksManager
24+
from ...exporters.openvino.convert import export_tokenizer
2425
from ...intel.utils.import_utils import DIFFUSERS_IMPORT_ERROR, is_diffusers_available
2526
from ..base import BaseOptimumCLICommand, CommandInfo
2627

@@ -261,6 +262,14 @@ def run(self):
261262
)
262263
model.save_pretrained(self.args.output)
263264

265+
output = Path(self.args.output)
266+
tokenizer = getattr(model, "tokenizer", None)
267+
if tokenizer is not None:
268+
export_tokenizer(tokenizer, output / "tokenizer")
269+
270+
tokenizer_2 = getattr(model, "tokenizer_2", None)
271+
if tokenizer_2 is not None:
272+
export_tokenizer(tokenizer_2, output / "tokenizer_2")
264273
else:
265274
if self.args.convert_tokenizer:
266275
logger.warning("`--convert-tokenizer` option is deprecated. Tokenizer will be converted by default.")

optimum/exporters/openvino/__main__.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from optimum.exporters.onnx.base import OnnxConfig
2626
from optimum.exporters.onnx.constants import SDPA_ARCHS_ONNX_EXPORT_NOT_SUPPORTED
2727
from optimum.exporters.openvino.convert import export_from_model, export_tokenizer
28+
from optimum.intel.openvino.utils import OV_TOKENIZER_FLOLDER
2829
from optimum.intel.utils.import_utils import is_openvino_tokenizers_available, is_transformers_version
2930
from optimum.utils.save_utils import maybe_load_preprocessors
3031

@@ -364,7 +365,7 @@ class StoreAttr(object):
364365

365366
if tokenizer is not None:
366367
try:
367-
export_tokenizer(tokenizer, output)
368+
export_tokenizer(tokenizer, output / OV_TOKENIZER_FLOLDER)
368369
except Exception as exception:
369370
logger.warning(
370371
"Could not load tokenizer using specified model ID or path. OpenVINO tokenizer/detokenizer "
@@ -373,11 +374,11 @@ class StoreAttr(object):
373374
else:
374375
tokenizer = getattr(model, "tokenizer", None)
375376
if tokenizer is not None:
376-
export_tokenizer(tokenizer, output)
377+
export_tokenizer(tokenizer, output / "tokenizer")
377378

378379
tokenizer_2 = getattr(model, "tokenizer_2", None)
379380
if tokenizer_2 is not None:
380-
export_tokenizer(tokenizer_2, output, suffix="_2")
381+
export_tokenizer(tokenizer_2, output / "tokenizer_2")
381382
elif convert_tokenizer and not is_openvino_tokenizers_available():
382383
logger.warning("Tokenizer won't be converted.")
383384

optimum/exporters/openvino/convert.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -667,20 +667,21 @@ def export_tokenizer(
667667
output: Union[str, Path],
668668
suffix: Optional[str] = "",
669669
):
670-
from optimum.intel.openvino import OV_DETOKENIZER_NAME, OV_TOKENIZER_NAME # avoid circular imports
670+
# avoid circular imports
671+
from optimum.intel.openvino import OV_DETOKENIZER_NAME, OV_TOKENIZER_NAME
672+
from optimum.intel.openvino.utils import maybe_convert_tokenizer_to_fast
671673

672674
try:
673675
from openvino_tokenizers import convert_tokenizer
674676
except ModuleNotFoundError:
675-
# avoid this message before tokenizers are part of the openvino dependencies
676-
# logger.info(
677-
# "Run `pip install openvino-tokenizers[transformers]` to get OpenVINO tokenizer/detokenizer models."
678-
# )
679677
return
680678

681679
if not isinstance(output, Path):
682680
output = Path(output)
683681

682+
if output.exists():
683+
tokenizer = maybe_convert_tokenizer_to_fast(tokenizer, output)
684+
684685
try:
685686
converted = convert_tokenizer(tokenizer, with_detokenizer=True)
686687
except NotImplementedError:

optimum/intel/openvino/utils.py

+24
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@
1717
import logging
1818
import os
1919
from glob import glob
20+
from pathlib import Path
21+
from typing import List, Union
2022

2123
import numpy as np
2224
from huggingface_hub import model_info
2325
from openvino.runtime import Core, Type, properties
26+
from transformers import AutoTokenizer, CLIPTokenizer, PreTrainedTokenizer, PreTrainedTokenizerFast
2427
from transformers.onnx.utils import ParameterFormat, compute_serialized_parameters_size
2528

2629

@@ -31,6 +34,7 @@
3134
OV_DECODER_NAME = "openvino_decoder_model.xml"
3235
OV_DECODER_WITH_PAST_NAME = "openvino_decoder_with_past_model.xml"
3336

37+
OV_TOKENIZER_FLOLDER = "openvino_tokenizer"
3438
OV_TOKENIZER_NAME = "openvino_tokenizer{}.xml"
3539
OV_DETOKENIZER_NAME = "openvino_detokenizer{}.xml"
3640

@@ -107,6 +111,26 @@
107111
}
108112

109113

114+
NEED_CONVERT_TO_FAST_TOKENIZER: List[PreTrainedTokenizer] = [
115+
CLIPTokenizer,
116+
]
117+
118+
119+
def maybe_convert_tokenizer_to_fast(
120+
hf_tokenizer: PreTrainedTokenizer, tokenizer_path: Path
121+
) -> Union[PreTrainedTokenizer, PreTrainedTokenizerFast]:
122+
if isinstance(hf_tokenizer, PreTrainedTokenizerFast):
123+
return hf_tokenizer
124+
125+
if any(isinstance(type(hf_tokenizer), slow_class) for slow_class in NEED_CONVERT_TO_FAST_TOKENIZER):
126+
try:
127+
return AutoTokenizer.from_pretrained(tokenizer_path)
128+
except Exception:
129+
return hf_tokenizer
130+
131+
return hf_tokenizer
132+
133+
110134
def use_external_data_format(num_parameters: int) -> bool:
111135
"""
112136
Returns whether or not the model requires using external data format for the ONNX export

tests/openvino/test_exporters_cli.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ class OVCLIExportTestCase(unittest.TestCase):
7474
"wav2vec2": 0, # no tokenizer
7575
"bert": 1, # no detokenizer
7676
"blenderbot": 2,
77-
"stable-diffusion": 0, # not supported
78-
"stable-diffusion-xl": 0, # not supported
77+
"stable-diffusion": 2,
78+
"stable-diffusion-xl": 2,
7979
}
8080

8181
SUPPORTED_SD_HYBRID_ARCHITECTURES = (

0 commit comments

Comments
 (0)