optimum-rbln 0.1.11__py3-none-any.whl → 0.1.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- optimum/rbln/__init__.py +14 -7
- optimum/rbln/__version__.py +1 -1
- optimum/rbln/diffusers/models/autoencoder_kl.py +30 -63
- optimum/rbln/diffusers/models/controlnet.py +36 -62
- optimum/rbln/diffusers/models/unet_2d_condition.py +57 -156
- optimum/rbln/diffusers/pipelines/__init__.py +40 -12
- optimum/rbln/diffusers/pipelines/controlnet/multicontrolnet.py +11 -0
- optimum/rbln/diffusers/pipelines/controlnet/pipeline_controlnet.py +9 -187
- optimum/rbln/diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +8 -192
- optimum/rbln/diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +8 -206
- optimum/rbln/diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +8 -207
- optimum/rbln/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +3 -111
- optimum/rbln/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +12 -117
- optimum/rbln/diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +4 -123
- optimum/rbln/diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +4 -126
- optimum/rbln/modeling_alias.py +4 -9
- optimum/rbln/modeling_base.py +117 -144
- optimum/rbln/modeling_config.py +51 -0
- optimum/rbln/modeling_diffusers.py +400 -0
- optimum/rbln/transformers/__init__.py +10 -0
- optimum/rbln/transformers/cache_utils.py +5 -9
- optimum/rbln/transformers/modeling_rope_utils.py +283 -0
- optimum/rbln/transformers/models/__init__.py +80 -28
- optimum/rbln/transformers/models/auto/modeling_auto.py +1 -0
- optimum/rbln/transformers/models/bart/__init__.py +1 -1
- optimum/rbln/transformers/models/bart/bart_architecture.py +18 -12
- optimum/rbln/transformers/models/bart/modeling_bart.py +25 -6
- optimum/rbln/transformers/models/bert/modeling_bert.py +1 -2
- optimum/rbln/transformers/models/clip/modeling_clip.py +13 -23
- optimum/rbln/transformers/models/decoderonly/__init__.py +0 -2
- optimum/rbln/transformers/models/decoderonly/decoderonly_architecture.py +376 -218
- optimum/rbln/transformers/models/decoderonly/modeling_decoderonly.py +246 -116
- optimum/rbln/transformers/models/dpt/modeling_dpt.py +0 -1
- optimum/rbln/transformers/models/exaone/__init__.py +32 -0
- optimum/rbln/transformers/models/exaone/exaone_architecture.py +81 -0
- optimum/rbln/transformers/models/exaone/hf_hub_cached/configuration_exaone.py +181 -0
- optimum/rbln/transformers/models/exaone/hf_hub_cached/modeling_exaone.py +1725 -0
- optimum/rbln/transformers/models/exaone/modeling_exaone.py +53 -0
- optimum/rbln/transformers/models/gemma/gemma_architecture.py +12 -2
- optimum/rbln/transformers/models/gemma/modeling_gemma.py +4 -28
- optimum/rbln/transformers/models/gpt2/modeling_gpt2.py +4 -30
- optimum/rbln/transformers/models/llama/modeling_llama.py +4 -28
- optimum/rbln/transformers/models/llava_next/modeling_llava_next.py +166 -151
- optimum/rbln/transformers/models/midm/midm_architecture.py +4 -15
- optimum/rbln/transformers/models/midm/modeling_midm.py +8 -28
- optimum/rbln/transformers/models/mistral/modeling_mistral.py +4 -29
- optimum/rbln/transformers/models/phi/modeling_phi.py +5 -31
- optimum/rbln/transformers/models/phi/phi_architecture.py +75 -159
- optimum/rbln/transformers/models/qwen2/__init__.py +24 -0
- optimum/rbln/transformers/models/qwen2/modeling_qwen2.py +43 -0
- optimum/rbln/transformers/models/qwen2/qwen2_architecture.py +29 -0
- optimum/rbln/transformers/models/seq2seq/__init__.py +24 -0
- optimum/rbln/{modeling_seq2seq.py → transformers/models/seq2seq/modeling_seq2seq.py} +107 -166
- optimum/rbln/transformers/models/t5/__init__.py +1 -0
- optimum/rbln/transformers/models/t5/modeling_t5.py +108 -0
- optimum/rbln/transformers/models/t5/t5_architecture.py +46 -32
- optimum/rbln/transformers/models/wav2vec2/modeling_wav2vec2.py +0 -1
- optimum/rbln/transformers/models/whisper/modeling_whisper.py +38 -13
- optimum/rbln/transformers/models/xlm_roberta/modeling_xlm_roberta.py +1 -2
- optimum/rbln/transformers/utils/rbln_quantization.py +8 -2
- optimum/rbln/utils/context.py +58 -0
- optimum/rbln/utils/decorator_utils.py +55 -0
- optimum/rbln/utils/import_utils.py +21 -0
- optimum/rbln/utils/logging.py +1 -1
- optimum/rbln/utils/runtime_utils.py +4 -4
- optimum/rbln/utils/timer_utils.py +26 -2
- {optimum_rbln-0.1.11.dist-info → optimum_rbln-0.1.13.dist-info}/METADATA +11 -9
- optimum_rbln-0.1.13.dist-info/RECORD +107 -0
- {optimum_rbln-0.1.11.dist-info → optimum_rbln-0.1.13.dist-info}/WHEEL +1 -1
- optimum_rbln-0.1.11.dist-info/RECORD +0 -93
- {optimum_rbln-0.1.11.dist-info → optimum_rbln-0.1.13.dist-info}/entry_points.txt +0 -0
- {optimum_rbln-0.1.11.dist-info → optimum_rbln-0.1.13.dist-info}/licenses/LICENSE +0 -0
optimum/rbln/diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py
CHANGED
@@ -16,131 +16,9 @@
|
|
16
16
|
|
17
17
|
from diffusers import StableDiffusionXLImg2ImgPipeline
|
18
18
|
|
19
|
-
from ....
|
20
|
-
from ....transformers import RBLNCLIPTextModel, RBLNCLIPTextModelWithProjection
|
21
|
-
from ....utils.runtime_utils import ContextRblnConfig
|
22
|
-
from ...models import RBLNAutoencoderKL, RBLNUNet2DConditionModel
|
19
|
+
from ....modeling_diffusers import RBLNDiffusionMixin
|
23
20
|
|
24
21
|
|
25
|
-
class RBLNStableDiffusionXLImg2ImgPipeline(StableDiffusionXLImg2ImgPipeline):
|
26
|
-
|
27
|
-
|
28
|
-
"""
|
29
|
-
Pipeline for image-to-image generation using Stable Diffusion XL.
|
30
|
-
|
31
|
-
This model inherits from [`StableDiffusionXLPipeline`]. Check the superclass documentation for the generic methods the
|
32
|
-
library implements for all the pipelines (such as downloading or saving, running on a particular device, etc.)
|
33
|
-
|
34
|
-
It implements the methods to convert a pre-trained StableDiffusionXL pipeline into a RBLNStableDiffusionXL pipeline by:
|
35
|
-
- transferring the checkpoint weights of the original into an optimized RBLN graph,
|
36
|
-
- compiling the resulting graph using the RBLN compiler.
|
37
|
-
|
38
|
-
Args:
|
39
|
-
model_id (`Union[str, Path]`):
|
40
|
-
Can be either:
|
41
|
-
- A string, the *model id* of a pretrained model hosted inside a model repo on huggingface.co.
|
42
|
-
- A path to a *directory* containing a model saved using [`~OptimizedModel.save_pretrained`],
|
43
|
-
"""
|
44
|
-
export = kwargs.pop("export", None)
|
45
|
-
model_save_dir = kwargs.pop("model_save_dir", None)
|
46
|
-
rbln_config = kwargs.pop("rbln_config", None)
|
47
|
-
rbln_kwargs, _ = RBLNBaseModel.resolve_rbln_config(rbln_config, kwargs)
|
48
|
-
|
49
|
-
device = rbln_kwargs.get("device", None)
|
50
|
-
device_map = rbln_kwargs.get("device_map", None)
|
51
|
-
create_runtimes = rbln_kwargs.get("create_runtimes", None)
|
52
|
-
optimize_host_memory = rbln_kwargs.get("optimize_host_memory", None)
|
53
|
-
|
54
|
-
with ContextRblnConfig(
|
55
|
-
device=device,
|
56
|
-
device_map=device_map,
|
57
|
-
create_runtimes=create_runtimes,
|
58
|
-
optimze_host_mem=optimize_host_memory,
|
59
|
-
):
|
60
|
-
model = super().from_pretrained(pretrained_model_name_or_path=model_id, **kwargs)
|
61
|
-
|
62
|
-
if export is None or export is False:
|
63
|
-
return model
|
64
|
-
|
65
|
-
do_classifier_free_guidance = (
|
66
|
-
rbln_kwargs.pop("guidance_scale", 5.0) > 1.0 and model.unet.config.time_cond_proj_dim is None
|
67
|
-
)
|
68
|
-
|
69
|
-
vae = RBLNAutoencoderKL.from_pretrained(
|
70
|
-
model_id=model_id,
|
71
|
-
subfolder="vae",
|
72
|
-
export=True,
|
73
|
-
model_save_dir=model_save_dir,
|
74
|
-
rbln_unet_sample_size=model.unet.config.sample_size,
|
75
|
-
rbln_use_encode=True,
|
76
|
-
rbln_vae_scale_factor=model.vae_scale_factor,
|
77
|
-
rbln_config={**rbln_kwargs},
|
78
|
-
)
|
79
|
-
text_encoder = RBLNCLIPTextModel.from_pretrained(
|
80
|
-
model_id=model_id,
|
81
|
-
subfolder="text_encoder",
|
82
|
-
export=True,
|
83
|
-
model_save_dir=model_save_dir,
|
84
|
-
rbln_config={**rbln_kwargs},
|
85
|
-
)
|
86
|
-
text_encoder_2 = RBLNCLIPTextModelWithProjection.from_pretrained(
|
87
|
-
model_id=model_id,
|
88
|
-
subfolder="text_encoder_2",
|
89
|
-
export=True,
|
90
|
-
model_save_dir=model_save_dir,
|
91
|
-
rbln_config={**rbln_kwargs},
|
92
|
-
)
|
93
|
-
|
94
|
-
batch_size = rbln_kwargs.pop("batch_size", 1)
|
95
|
-
unet_batch_size = batch_size * 2 if do_classifier_free_guidance else batch_size
|
96
|
-
|
97
|
-
unet = RBLNUNet2DConditionModel.from_pretrained(
|
98
|
-
model_id=model_id,
|
99
|
-
subfolder="unet",
|
100
|
-
export=True,
|
101
|
-
model_save_dir=model_save_dir,
|
102
|
-
rbln_max_seq_len=model.text_encoder.config.max_position_embeddings,
|
103
|
-
rbln_text_model_hidden_size=model.text_encoder_2.config.hidden_size,
|
104
|
-
rbln_batch_size=unet_batch_size,
|
105
|
-
rbln_use_encode=True,
|
106
|
-
rbln_vae_scale_factor=model.vae_scale_factor,
|
107
|
-
rbln_is_controlnet=True if "controlnet" in model.config.keys() else False,
|
108
|
-
rbln_config={**rbln_kwargs},
|
109
|
-
)
|
110
|
-
|
111
|
-
if model_save_dir is not None:
|
112
|
-
# To skip saving original pytorch modules
|
113
|
-
del (model.vae, model.text_encoder, model.unet, model.text_encoder_2)
|
114
|
-
|
115
|
-
# Direct calling of `save_pretrained` causes config.unet = (None, None).
|
116
|
-
# So config must be saved again, later.
|
117
|
-
model.save_pretrained(model_save_dir)
|
118
|
-
|
119
|
-
model.vae = vae
|
120
|
-
model.text_encoder = text_encoder
|
121
|
-
model.unet = unet
|
122
|
-
model.text_encoder_2 = text_encoder_2
|
123
|
-
update_dict = {
|
124
|
-
"vae": ("optimum.rbln", "RBLNAutoencoderKL"),
|
125
|
-
"text_encoder": ("optimum.rbln", "RBLNCLIPTextModel"),
|
126
|
-
"unet": ("optimum.rbln", "RBLNUNet2DConditionModel"),
|
127
|
-
"text_encoder_2": ("optimum.rbln", "RBLNCLIPTextModelWithProjection"),
|
128
|
-
}
|
129
|
-
model.register_to_config(**update_dict)
|
130
|
-
|
131
|
-
if model_save_dir is not None:
|
132
|
-
# overwrite to replace incorrect config
|
133
|
-
model.save_config(model_save_dir)
|
134
|
-
|
135
|
-
model.models = [vae.model[0], vae.model[1], unet.model[0], text_encoder.model[0], text_encoder_2.model[0]]
|
136
|
-
|
137
|
-
if optimize_host_memory is False:
|
138
|
-
model.compiled_models = [
|
139
|
-
vae.compiled_models[0],
|
140
|
-
vae.compiled_models[1],
|
141
|
-
unet.compiled_models[0],
|
142
|
-
text_encoder.compiled_models[0],
|
143
|
-
text_encoder_2.compiled_models[0],
|
144
|
-
]
|
145
|
-
|
146
|
-
return model
|
22
|
+
class RBLNStableDiffusionXLImg2ImgPipeline(RBLNDiffusionMixin, StableDiffusionXLImg2ImgPipeline):
|
23
|
+
original_class = StableDiffusionXLImg2ImgPipeline
|
24
|
+
_submodules = ["text_encoder", "text_encoder_2", "unet", "vae"]
|
optimum/rbln/modeling_alias.py
CHANGED
@@ -28,7 +28,6 @@ from .modeling_base import (
|
|
28
28
|
RBLNModelForQuestionAnswering,
|
29
29
|
RBLNModelForSequenceClassification,
|
30
30
|
)
|
31
|
-
from .modeling_seq2seq import RBLNModelForSeq2SeqLM
|
32
31
|
|
33
32
|
|
34
33
|
class RBLNASTForAudioClassification(RBLNModelForAudioClassification):
|
@@ -47,14 +46,6 @@ class RBLNResNetForImageClassification(RBLNModelForImageClassification):
|
|
47
46
|
pass
|
48
47
|
|
49
48
|
|
50
|
-
class RBLNT5ForConditionalGeneration(RBLNModelForSeq2SeqLM):
|
51
|
-
pass
|
52
|
-
|
53
|
-
|
54
|
-
class RBLNBartForConditionalGeneration(RBLNModelForSeq2SeqLM):
|
55
|
-
pass
|
56
|
-
|
57
|
-
|
58
49
|
class RBLNXLMRobertaForSequenceClassification(RBLNModelForSequenceClassification):
|
59
50
|
rbln_model_input_names = ["input_ids", "attention_mask"]
|
60
51
|
|
@@ -65,3 +56,7 @@ class RBLNRobertaForSequenceClassification(RBLNModelForSequenceClassification):
|
|
65
56
|
|
66
57
|
class RBLNRobertaForMaskedLM(RBLNModelForMaskedLM):
|
67
58
|
rbln_model_input_names = ["input_ids", "attention_mask"]
|
59
|
+
|
60
|
+
|
61
|
+
class RBLNViTForImageClassification(RBLNModelForImageClassification):
|
62
|
+
pass
|
optimum/rbln/modeling_base.py
CHANGED
@@ -21,7 +21,6 @@
|
|
21
21
|
# copied, modified, or distributed without prior written permission
|
22
22
|
# from Rebellions Inc.
|
23
23
|
|
24
|
-
import copy
|
25
24
|
import importlib
|
26
25
|
import inspect
|
27
26
|
import logging
|
@@ -50,9 +49,9 @@ from transformers import (
|
|
50
49
|
PretrainedConfig,
|
51
50
|
)
|
52
51
|
|
53
|
-
from .modeling_config import DEFAULT_COMPILED_MODEL_NAME, RBLNCompileConfig, RBLNConfig
|
52
|
+
from .modeling_config import DEFAULT_COMPILED_MODEL_NAME, RBLNCompileConfig, RBLNConfig, use_rbln_config
|
54
53
|
from .utils.runtime_utils import UnavailableRuntime
|
55
|
-
from .utils.save_utils import maybe_load_preprocessors
|
54
|
+
from .utils.save_utils import maybe_load_preprocessors
|
56
55
|
|
57
56
|
|
58
57
|
if TYPE_CHECKING:
|
@@ -86,13 +85,11 @@ class SubModulesMixin:
|
|
86
85
|
setattr(self, submodule_meta["name"], submodule)
|
87
86
|
|
88
87
|
@classmethod
|
89
|
-
def
|
88
|
+
def _export_submodules_from_model(
|
90
89
|
cls,
|
91
90
|
model: "PreTrainedModel",
|
92
91
|
model_save_dir: str,
|
93
|
-
rbln_sub_configs_dict: Dict[str, Any],
|
94
92
|
rbln_kwargs: Dict[str, Any],
|
95
|
-
subfolder=None, # warning: will be ignored
|
96
93
|
**kwargs,
|
97
94
|
) -> List["RBLNBaseModel"]:
|
98
95
|
rbln_submodules = []
|
@@ -100,18 +97,15 @@ class SubModulesMixin:
|
|
100
97
|
submodule_name = submodule["name"]
|
101
98
|
torch_submodule: "PreTrainedModel" = getattr(model, submodule["name"])
|
102
99
|
cls_name = torch_submodule.__class__.__name__
|
103
|
-
submodule_cls: "
|
100
|
+
submodule_cls: "RBLNModel" = getattr(importlib.import_module("optimum.rbln"), f"RBLN{cls_name}")
|
104
101
|
|
105
|
-
if submodule_name in
|
106
|
-
kwargs["rbln_config"] =
|
102
|
+
if submodule_name in rbln_kwargs:
|
103
|
+
kwargs["rbln_config"] = rbln_kwargs[submodule_name]
|
107
104
|
|
108
|
-
rbln_submodule = submodule_cls.
|
109
|
-
|
110
|
-
config=torch_submodule.config,
|
105
|
+
rbln_submodule = submodule_cls.from_model(
|
106
|
+
model=torch_submodule,
|
111
107
|
subfolder=submodule_name,
|
112
108
|
model_save_dir=model_save_dir,
|
113
|
-
model=torch_submodule,
|
114
|
-
**rbln_kwargs,
|
115
109
|
**kwargs,
|
116
110
|
)
|
117
111
|
|
@@ -120,26 +114,29 @@ class SubModulesMixin:
|
|
120
114
|
return rbln_submodules
|
121
115
|
|
122
116
|
@classmethod
|
123
|
-
def
|
124
|
-
cls,
|
117
|
+
def _load_submodules_from_compiled_models(
|
118
|
+
cls,
|
119
|
+
model_save_dir: str,
|
120
|
+
rbln_kwargs: Dict[str, Any],
|
121
|
+
**kwargs,
|
125
122
|
):
|
126
123
|
rbln_submodules = []
|
127
124
|
for submodule in cls._rbln_submodules:
|
128
125
|
submodule_name = submodule["name"]
|
129
|
-
|
126
|
+
|
127
|
+
if submodule_name in rbln_kwargs:
|
128
|
+
kwargs["rbln_config"] = rbln_kwargs[submodule_name]
|
130
129
|
|
131
130
|
# Get cls name for call the constructor of the rbln class
|
132
131
|
submodule_rbln_config = RBLNConfig.load(Path(model_save_dir) / submodule_name)
|
133
132
|
submodule_cls_name = submodule_rbln_config.meta["cls"]
|
134
133
|
submodule_cls: "RBLNBaseModel" = getattr(importlib.import_module("optimum.rbln"), submodule_cls_name)
|
135
134
|
|
136
|
-
config = OptimizedModel._load_config(Path(model_save_dir) / submodule_name
|
135
|
+
config = OptimizedModel._load_config(Path(model_save_dir) / submodule_name)
|
137
136
|
rbln_submodule = submodule_cls._from_pretrained(
|
138
137
|
model_id=model_save_dir,
|
139
138
|
config=config,
|
140
139
|
subfolder=submodule_name,
|
141
|
-
rbln_config=rbln_submodule_config_dict,
|
142
|
-
**rbln_kwargs,
|
143
140
|
**kwargs,
|
144
141
|
)
|
145
142
|
rbln_submodules.append(rbln_submodule)
|
@@ -149,27 +146,24 @@ class SubModulesMixin:
|
|
149
146
|
def _load_submodules(
|
150
147
|
cls,
|
151
148
|
model_save_dir,
|
152
|
-
rbln_sub_configs_dict,
|
153
149
|
rbln_kwargs,
|
154
150
|
model=None,
|
155
151
|
**kwargs,
|
156
152
|
):
|
157
|
-
# Two
|
153
|
+
# Two ways :
|
158
154
|
# 1. Compile from pytorch object
|
159
155
|
# 2. Load from compiled file
|
160
156
|
if model is not None:
|
161
|
-
return cls.
|
157
|
+
return cls._export_submodules_from_model(
|
162
158
|
model=model,
|
163
159
|
model_save_dir=model_save_dir,
|
164
|
-
rbln_sub_configs_dict=rbln_sub_configs_dict,
|
165
160
|
rbln_kwargs=rbln_kwargs,
|
166
161
|
**kwargs,
|
167
162
|
)
|
168
163
|
|
169
164
|
else:
|
170
|
-
return cls.
|
165
|
+
return cls._load_submodules_from_compiled_models(
|
171
166
|
model_save_dir=model_save_dir,
|
172
|
-
rbln_sub_configs_dict=rbln_sub_configs_dict,
|
173
167
|
rbln_kwargs=rbln_kwargs,
|
174
168
|
**kwargs,
|
175
169
|
)
|
@@ -370,45 +364,7 @@ class RBLNBaseModel(OptimizedModel, ABC, SubModulesMixin):
|
|
370
364
|
return rbln_compiled_models
|
371
365
|
|
372
366
|
@classmethod
|
373
|
-
|
374
|
-
# {"language_model" : {"rbln_tensor_parallel_size":4}}
|
375
|
-
rbln_sub_configs_dict: Dict[str, Dict[str, Any]] = {}
|
376
|
-
|
377
|
-
# Remove submodule-configs from rbln_config
|
378
|
-
if len(cls._rbln_submodules) > 0:
|
379
|
-
keys = list(rbln_config_dict.keys())
|
380
|
-
submodule_names = [m["name"] for m in cls._rbln_submodules]
|
381
|
-
for key in keys:
|
382
|
-
if key in submodule_names:
|
383
|
-
rbln_sub_configs_dict[key] = rbln_config_dict.pop(key)
|
384
|
-
|
385
|
-
return rbln_sub_configs_dict
|
386
|
-
|
387
|
-
@classmethod
|
388
|
-
def resolve_rbln_config(cls, rbln_config: Union[RBLNConfig, Dict[str, Any]], kwargs):
|
389
|
-
if isinstance(rbln_config, RBLNConfig):
|
390
|
-
# Already resolved
|
391
|
-
return rbln_config, None
|
392
|
-
|
393
|
-
else:
|
394
|
-
if rbln_config is None:
|
395
|
-
rbln_config_dict = {}
|
396
|
-
else:
|
397
|
-
rbln_config_dict = rbln_config
|
398
|
-
|
399
|
-
rbln_kwargs = cls.pop_rbln_kwargs_from_kwargs(kwargs)
|
400
|
-
rbln_sub_configs_dict = cls._split_submodule_config(rbln_config_dict)
|
401
|
-
|
402
|
-
for key in rbln_config_dict:
|
403
|
-
if key in rbln_kwargs:
|
404
|
-
raise KeyError(f"duplicate key in both `rbln_config` and {key}")
|
405
|
-
|
406
|
-
merged_rbln_kwargs = copy.deepcopy(rbln_kwargs)
|
407
|
-
merged_rbln_kwargs.update(rbln_config_dict)
|
408
|
-
|
409
|
-
return (merged_rbln_kwargs, rbln_sub_configs_dict)
|
410
|
-
|
411
|
-
@classmethod
|
367
|
+
@use_rbln_config
|
412
368
|
def _from_pretrained(
|
413
369
|
cls,
|
414
370
|
model_id: Union[str, Path],
|
@@ -430,7 +386,7 @@ class RBLNBaseModel(OptimizedModel, ABC, SubModulesMixin):
|
|
430
386
|
|
431
387
|
if not from_export_method:
|
432
388
|
# from compiled dir
|
433
|
-
rbln_kwargs
|
389
|
+
rbln_kwargs = rbln_config or {}
|
434
390
|
|
435
391
|
model_path_subfolder = cls._load_compiled_model_dir(
|
436
392
|
model_id=model_id,
|
@@ -450,7 +406,6 @@ class RBLNBaseModel(OptimizedModel, ABC, SubModulesMixin):
|
|
450
406
|
if len(cls._rbln_submodules) > 0:
|
451
407
|
rbln_submodules = cls._load_submodules(
|
452
408
|
model_save_dir=model_id,
|
453
|
-
rbln_sub_configs_dict=rbln_sub_configs_dict,
|
454
409
|
rbln_kwargs=rbln_kwargs,
|
455
410
|
**kwargs,
|
456
411
|
)
|
@@ -477,9 +432,9 @@ class RBLNBaseModel(OptimizedModel, ABC, SubModulesMixin):
|
|
477
432
|
cls,
|
478
433
|
rbln_compiled_models: Dict[str, rebel.RBLNCompiledModel],
|
479
434
|
rbln_config: RBLNConfig,
|
480
|
-
config,
|
481
|
-
model_save_dir: str,
|
482
|
-
subfolder: str,
|
435
|
+
config: "PretrainedConfig",
|
436
|
+
model_save_dir: Union[Path, str],
|
437
|
+
subfolder: Union[Path, str],
|
483
438
|
rbln_submodules: List["RBLNBaseModel"] = [],
|
484
439
|
**kwargs,
|
485
440
|
):
|
@@ -492,11 +447,18 @@ class RBLNBaseModel(OptimizedModel, ABC, SubModulesMixin):
|
|
492
447
|
rbln_compiled_models = [rbln_compiled_models[cm_name] for cm_name in compiled_model_names]
|
493
448
|
|
494
449
|
# create runtimes only if `rbln_create_runtimes` is enabled
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
450
|
+
try:
|
451
|
+
models = (
|
452
|
+
cls._create_runtimes(rbln_compiled_models, rbln_config.device_map)
|
453
|
+
if rbln_config.create_runtimes
|
454
|
+
else UnavailableRuntime()
|
455
|
+
)
|
456
|
+
|
457
|
+
except rebel.core.exception.RBLNRuntimeError as e:
|
458
|
+
logger.warning(
|
459
|
+
f"Failed to create the runtime for the model due to a runtime error: {e.__class__.__name__} - {e}"
|
460
|
+
)
|
461
|
+
models = UnavailableRuntime()
|
500
462
|
|
501
463
|
return cls(
|
502
464
|
models,
|
@@ -538,25 +500,10 @@ class RBLNBaseModel(OptimizedModel, ABC, SubModulesMixin):
|
|
538
500
|
rbln_config = cls._get_rbln_config(**others, rbln_kwargs=rbln_kwargs)
|
539
501
|
return rbln_config
|
540
502
|
|
541
|
-
@staticmethod
|
542
|
-
def pop_rbln_kwargs_from_kwargs(kwargs: Dict[str, Any], runtime_only=False):
|
543
|
-
keys = list(kwargs.keys())
|
544
|
-
rbln_kwargs = {key[5:]: kwargs.pop(key) for key in keys if key.startswith("rbln_")}
|
545
|
-
|
546
|
-
if runtime_only:
|
547
|
-
rbln_kwargs = {
|
548
|
-
key: value
|
549
|
-
for key, value in rbln_kwargs.items()
|
550
|
-
if key in {"create_runtimes", "optimize_host_memory", "device", "device_map"}
|
551
|
-
}
|
552
|
-
|
553
|
-
return rbln_kwargs
|
554
|
-
|
555
503
|
def can_generate(self):
|
556
504
|
return False
|
557
505
|
|
558
506
|
def to(self, *args, **kwargs):
|
559
|
-
# Do nothing
|
560
507
|
return self
|
561
508
|
|
562
509
|
def __call__(self, *args, **kwargs):
|
@@ -599,12 +546,49 @@ class RBLNBaseModel(OptimizedModel, ABC, SubModulesMixin):
|
|
599
546
|
|
600
547
|
@classmethod
|
601
548
|
@abstractmethod
|
602
|
-
def
|
603
|
-
|
604
|
-
|
605
|
-
|
549
|
+
def get_pytorch_model(cls, *args, **kwargs):
|
550
|
+
pass
|
551
|
+
|
552
|
+
@classmethod
|
553
|
+
@abstractmethod
|
554
|
+
@use_rbln_config
|
555
|
+
def from_model(
|
556
|
+
cls,
|
557
|
+
model: "PreTrainedModel",
|
558
|
+
rbln_config: Dict[str, Any] = {},
|
559
|
+
model_save_dir: Optional[Union[str, Path, TemporaryDirectory]] = None,
|
560
|
+
subfolder: str = "",
|
561
|
+
**kwargs,
|
562
|
+
):
|
606
563
|
pass
|
607
564
|
|
565
|
+
@classmethod
|
566
|
+
@use_rbln_config
|
567
|
+
def _export(
|
568
|
+
cls,
|
569
|
+
model_id: Union[str, Path],
|
570
|
+
config: "PretrainedConfig", # FIXME : optimum passes config, but we ignore it.
|
571
|
+
rbln_config: Optional[Dict[str, Any]] = None,
|
572
|
+
**kwargs,
|
573
|
+
) -> "RBLNModel":
|
574
|
+
subfolder = kwargs.get("subfolder", "")
|
575
|
+
model_save_dir = kwargs.pop("model_save_dir", None)
|
576
|
+
|
577
|
+
rbln_kwargs = rbln_config
|
578
|
+
model: "PreTrainedModel" = cls.get_pytorch_model(
|
579
|
+
model_id=model_id,
|
580
|
+
rbln_kwargs=rbln_kwargs,
|
581
|
+
**kwargs,
|
582
|
+
)
|
583
|
+
preprocessors = maybe_load_preprocessors(model_id, subfolder=subfolder)
|
584
|
+
return cls.from_model(
|
585
|
+
model,
|
586
|
+
rbln_config=rbln_config,
|
587
|
+
preprocessors=preprocessors,
|
588
|
+
model_save_dir=model_save_dir,
|
589
|
+
**kwargs,
|
590
|
+
)
|
591
|
+
|
608
592
|
|
609
593
|
class RBLNModel(RBLNBaseModel):
|
610
594
|
"""
|
@@ -695,25 +679,19 @@ class RBLNModel(RBLNBaseModel):
|
|
695
679
|
return compiled_model
|
696
680
|
|
697
681
|
@classmethod
|
698
|
-
@
|
699
|
-
def
|
682
|
+
@use_rbln_config
|
683
|
+
def from_model(
|
700
684
|
cls,
|
701
|
-
|
702
|
-
|
703
|
-
use_auth_token: Optional[Union[bool, str]] = None,
|
704
|
-
revision: Optional[str] = None,
|
705
|
-
force_download: bool = False,
|
706
|
-
cache_dir: Optional[str] = None,
|
707
|
-
subfolder: str = "",
|
708
|
-
local_files_only: bool = False,
|
709
|
-
trust_remote_code: bool = False,
|
685
|
+
model: "PreTrainedModel",
|
686
|
+
rbln_config: Dict[str, Any] = {},
|
710
687
|
model_save_dir: Optional[Union[str, Path, TemporaryDirectory]] = None,
|
711
|
-
|
712
|
-
rbln_config: Optional[Dict[str, Any]] = None,
|
688
|
+
subfolder: str = "",
|
713
689
|
**kwargs,
|
714
|
-
)
|
715
|
-
|
690
|
+
):
|
691
|
+
preprocessors = kwargs.pop("preprocessors", [])
|
692
|
+
rbln_kwargs = rbln_config
|
716
693
|
|
694
|
+
# Directory to save compile artifacts(.rbln) and original configs
|
717
695
|
if model_save_dir is None:
|
718
696
|
save_dir = TemporaryDirectory()
|
719
697
|
save_dir_path = Path(save_dir.name)
|
@@ -725,43 +703,31 @@ class RBLNModel(RBLNBaseModel):
|
|
725
703
|
save_dir_path = Path(model_save_dir)
|
726
704
|
save_dir_path.mkdir(exist_ok=True)
|
727
705
|
|
728
|
-
#
|
729
|
-
|
730
|
-
|
731
|
-
model_id=model_id,
|
732
|
-
subfolder=subfolder,
|
733
|
-
revision=revision,
|
734
|
-
cache_dir=cache_dir,
|
735
|
-
use_auth_token=use_auth_token,
|
736
|
-
local_files_only=local_files_only,
|
737
|
-
force_download=force_download,
|
738
|
-
trust_remote_code=trust_remote_code,
|
739
|
-
rbln_kwargs=rbln_kwargs,
|
740
|
-
**kwargs,
|
741
|
-
)
|
742
|
-
preprocessors = maybe_save_preprocessors(model_id, save_dir_path, src_subfolder=subfolder)
|
743
|
-
else:
|
744
|
-
preprocessors = []
|
706
|
+
# (Optional) Save preprocessors (tokenizer, image preprocessors, etc)
|
707
|
+
for preprocessor in preprocessors:
|
708
|
+
preprocessor.save_pretrained(save_dir_path)
|
745
709
|
|
746
|
-
#
|
710
|
+
# Save configs
|
711
|
+
# FIXME :: optimum passes AutoConfig. But here we ignore it.
|
747
712
|
config = model.config
|
748
713
|
if hasattr(model, "can_generate") and model.can_generate():
|
749
714
|
generation_config = model.generation_config
|
750
715
|
generation_config.save_pretrained(save_dir_path / subfolder)
|
751
|
-
|
752
716
|
if not isinstance(config, PretrainedConfig): # diffusers config
|
753
717
|
config = PretrainedConfig(**config)
|
754
718
|
config.save_pretrained(save_dir_path / subfolder)
|
755
719
|
|
756
|
-
# Get compilation arguments
|
720
|
+
# Get compilation arguments (e.g. input_info)
|
757
721
|
rbln_config: RBLNConfig = cls.get_rbln_config(
|
758
722
|
preprocessors=preprocessors, model_config=config, rbln_kwargs=rbln_kwargs
|
759
723
|
)
|
724
|
+
# rbln_config.update_runtime_cfg(rbln_kwargs) # This is done in get_rbln_config
|
725
|
+
|
760
726
|
compiled_model: Union[rebel.RBLNCompiledModel, Dict[str, rebel.RBLNCompiledModel]] = cls.get_compiled_model(
|
761
727
|
model, rbln_config=rbln_config
|
762
728
|
)
|
763
729
|
|
764
|
-
# Save compiled models
|
730
|
+
# Save compiled models (.rbln)
|
765
731
|
(save_dir_path / subfolder).mkdir(exist_ok=True)
|
766
732
|
if not isinstance(compiled_model, dict):
|
767
733
|
compiled_models = {DEFAULT_COMPILED_MODEL_NAME: compiled_model}
|
@@ -771,6 +737,7 @@ class RBLNModel(RBLNBaseModel):
|
|
771
737
|
cm.save(save_dir_path / subfolder / f"{compiled_model_name}.rbln")
|
772
738
|
rbln_config.save(save_dir_path / subfolder)
|
773
739
|
|
740
|
+
# Save torch artifacts (e.g. embedding matrix if needed.)
|
774
741
|
cls.save_torch_artifacts(model, save_dir_path=save_dir_path, subfolder=subfolder, rbln_config=rbln_config)
|
775
742
|
|
776
743
|
# Load submodules
|
@@ -778,7 +745,6 @@ class RBLNModel(RBLNBaseModel):
|
|
778
745
|
rbln_submodules = cls._load_submodules(
|
779
746
|
model=model,
|
780
747
|
model_save_dir=save_dir,
|
781
|
-
rbln_sub_configs_dict=rbln_sub_configs_dict,
|
782
748
|
rbln_kwargs=rbln_kwargs,
|
783
749
|
**kwargs,
|
784
750
|
)
|
@@ -790,12 +756,7 @@ class RBLNModel(RBLNBaseModel):
|
|
790
756
|
model_id=save_dir_path,
|
791
757
|
config=config,
|
792
758
|
model_save_dir=save_dir,
|
793
|
-
use_auth_token=use_auth_token,
|
794
|
-
revision=revision,
|
795
|
-
force_download=force_download,
|
796
|
-
cache_dir=cache_dir,
|
797
759
|
subfolder=subfolder,
|
798
|
-
local_files_only=local_files_only,
|
799
760
|
rbln_config=rbln_config,
|
800
761
|
rbln_compiled_models=compiled_models,
|
801
762
|
rbln_submodules=rbln_submodules,
|
@@ -817,7 +778,6 @@ class RBLNModel(RBLNBaseModel):
|
|
817
778
|
|
818
779
|
|
819
780
|
class RBLNModelForQuestionAnswering(RBLNModel):
|
820
|
-
model_type = "rbln_model"
|
821
781
|
auto_model_class = AutoModelForQuestionAnswering
|
822
782
|
rbln_model_input_names = ["input_ids", "attention_mask", "token_type_ids"]
|
823
783
|
|
@@ -878,7 +838,6 @@ class RBLNModelForImageClassification(RBLNModel):
|
|
878
838
|
This is a generic model class that will be instantiated as one of the model classes of the library (with a image classification head) when created with the from_pretrained() class method
|
879
839
|
"""
|
880
840
|
|
881
|
-
model_type = "rbln_model"
|
882
841
|
auto_model_class = AutoModelForImageClassification
|
883
842
|
|
884
843
|
@classmethod
|
@@ -894,8 +853,17 @@ class RBLNModelForImageClassification(RBLNModel):
|
|
894
853
|
if rbln_image_size is None:
|
895
854
|
for processor in preprocessors:
|
896
855
|
if hasattr(processor, "size"):
|
897
|
-
|
856
|
+
if all(required_key in processor.size.keys() for required_key in ["height", "width"]):
|
857
|
+
rbln_image_size = (processor.size["height"], processor.size["width"])
|
858
|
+
elif "shortest_edge" in processor.size.keys():
|
859
|
+
rbln_image_size = (processor.size["shortest_edge"], processor.size["shortest_edge"])
|
860
|
+
elif "longest_edge" in processor.size.keys():
|
861
|
+
rbln_image_size = (processor.size["longest_edge"], processor.size["longest_edge"])
|
898
862
|
break
|
863
|
+
|
864
|
+
if rbln_image_size is None:
|
865
|
+
rbln_image_size = model_config.image_size
|
866
|
+
|
899
867
|
if rbln_image_size is None:
|
900
868
|
raise ValueError("`rbln_image_size` should be specified!")
|
901
869
|
|
@@ -903,12 +871,20 @@ class RBLNModelForImageClassification(RBLNModel):
|
|
903
871
|
rbln_batch_size = 1
|
904
872
|
|
905
873
|
if isinstance(rbln_image_size, int):
|
906
|
-
|
874
|
+
rbln_image_height, rbln_image_width = rbln_image_size, rbln_image_size
|
875
|
+
elif isinstance(rbln_image_size, (list, tuple)):
|
876
|
+
rbln_image_height, rbln_image_width = rbln_image_size[0], rbln_image_size[1]
|
877
|
+
elif isinstance(rbln_image_size, dict):
|
878
|
+
rbln_image_height, rbln_image_width = rbln_image_size["height"], rbln_image_size["width"]
|
879
|
+
else:
|
880
|
+
raise ValueError(
|
881
|
+
"`rbln_image_size` should be `int` (ex. 224), `tuple` (ex. 224, 224), `dict` (ex. {'height': 224, 'width': 224}) format"
|
882
|
+
)
|
907
883
|
|
908
884
|
input_info = [
|
909
885
|
(
|
910
886
|
"pixel_values",
|
911
|
-
[rbln_batch_size, 3,
|
887
|
+
[rbln_batch_size, 3, rbln_image_height, rbln_image_width],
|
912
888
|
"float32",
|
913
889
|
)
|
914
890
|
]
|
@@ -930,7 +906,6 @@ class RBLNModelForAudioClassification(RBLNModel):
|
|
930
906
|
Currently, this model class only supports the 'AST' model from the transformers library. Future updates may include support for additional model types.
|
931
907
|
"""
|
932
908
|
|
933
|
-
model_type = "rbln_model"
|
934
909
|
auto_model_class = AutoModelForAudioClassification
|
935
910
|
|
936
911
|
@classmethod
|
@@ -1005,7 +980,6 @@ class RBLNModelForSequenceClassification(RBLNModel):
|
|
1005
980
|
Currently, this model class supports the 'XLMRoberta' and 'Roberta' model from the transformers library. Future updates may include support for additional model types.
|
1006
981
|
"""
|
1007
982
|
|
1008
|
-
model_type = "rbln_model"
|
1009
983
|
auto_model_class = AutoModelForSequenceClassification
|
1010
984
|
|
1011
985
|
@classmethod
|
@@ -1070,7 +1044,6 @@ class RBLNModelForSequenceClassification(RBLNModel):
|
|
1070
1044
|
|
1071
1045
|
|
1072
1046
|
class RBLNModelForMaskedLM(RBLNModel):
|
1073
|
-
model_type = "rbln_model"
|
1074
1047
|
auto_model_class = AutoModelForMaskedLM
|
1075
1048
|
|
1076
1049
|
@classmethod
|