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.
Files changed (72) hide show
  1. optimum/rbln/__init__.py +14 -7
  2. optimum/rbln/__version__.py +1 -1
  3. optimum/rbln/diffusers/models/autoencoder_kl.py +30 -63
  4. optimum/rbln/diffusers/models/controlnet.py +36 -62
  5. optimum/rbln/diffusers/models/unet_2d_condition.py +57 -156
  6. optimum/rbln/diffusers/pipelines/__init__.py +40 -12
  7. optimum/rbln/diffusers/pipelines/controlnet/multicontrolnet.py +11 -0
  8. optimum/rbln/diffusers/pipelines/controlnet/pipeline_controlnet.py +9 -187
  9. optimum/rbln/diffusers/pipelines/controlnet/pipeline_controlnet_img2img.py +8 -192
  10. optimum/rbln/diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl.py +8 -206
  11. optimum/rbln/diffusers/pipelines/controlnet/pipeline_controlnet_sd_xl_img2img.py +8 -207
  12. optimum/rbln/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py +3 -111
  13. optimum/rbln/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py +12 -117
  14. optimum/rbln/diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py +4 -123
  15. optimum/rbln/diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl_img2img.py +4 -126
  16. optimum/rbln/modeling_alias.py +4 -9
  17. optimum/rbln/modeling_base.py +117 -144
  18. optimum/rbln/modeling_config.py +51 -0
  19. optimum/rbln/modeling_diffusers.py +400 -0
  20. optimum/rbln/transformers/__init__.py +10 -0
  21. optimum/rbln/transformers/cache_utils.py +5 -9
  22. optimum/rbln/transformers/modeling_rope_utils.py +283 -0
  23. optimum/rbln/transformers/models/__init__.py +80 -28
  24. optimum/rbln/transformers/models/auto/modeling_auto.py +1 -0
  25. optimum/rbln/transformers/models/bart/__init__.py +1 -1
  26. optimum/rbln/transformers/models/bart/bart_architecture.py +18 -12
  27. optimum/rbln/transformers/models/bart/modeling_bart.py +25 -6
  28. optimum/rbln/transformers/models/bert/modeling_bert.py +1 -2
  29. optimum/rbln/transformers/models/clip/modeling_clip.py +13 -23
  30. optimum/rbln/transformers/models/decoderonly/__init__.py +0 -2
  31. optimum/rbln/transformers/models/decoderonly/decoderonly_architecture.py +376 -218
  32. optimum/rbln/transformers/models/decoderonly/modeling_decoderonly.py +246 -116
  33. optimum/rbln/transformers/models/dpt/modeling_dpt.py +0 -1
  34. optimum/rbln/transformers/models/exaone/__init__.py +32 -0
  35. optimum/rbln/transformers/models/exaone/exaone_architecture.py +81 -0
  36. optimum/rbln/transformers/models/exaone/hf_hub_cached/configuration_exaone.py +181 -0
  37. optimum/rbln/transformers/models/exaone/hf_hub_cached/modeling_exaone.py +1725 -0
  38. optimum/rbln/transformers/models/exaone/modeling_exaone.py +53 -0
  39. optimum/rbln/transformers/models/gemma/gemma_architecture.py +12 -2
  40. optimum/rbln/transformers/models/gemma/modeling_gemma.py +4 -28
  41. optimum/rbln/transformers/models/gpt2/modeling_gpt2.py +4 -30
  42. optimum/rbln/transformers/models/llama/modeling_llama.py +4 -28
  43. optimum/rbln/transformers/models/llava_next/modeling_llava_next.py +166 -151
  44. optimum/rbln/transformers/models/midm/midm_architecture.py +4 -15
  45. optimum/rbln/transformers/models/midm/modeling_midm.py +8 -28
  46. optimum/rbln/transformers/models/mistral/modeling_mistral.py +4 -29
  47. optimum/rbln/transformers/models/phi/modeling_phi.py +5 -31
  48. optimum/rbln/transformers/models/phi/phi_architecture.py +75 -159
  49. optimum/rbln/transformers/models/qwen2/__init__.py +24 -0
  50. optimum/rbln/transformers/models/qwen2/modeling_qwen2.py +43 -0
  51. optimum/rbln/transformers/models/qwen2/qwen2_architecture.py +29 -0
  52. optimum/rbln/transformers/models/seq2seq/__init__.py +24 -0
  53. optimum/rbln/{modeling_seq2seq.py → transformers/models/seq2seq/modeling_seq2seq.py} +107 -166
  54. optimum/rbln/transformers/models/t5/__init__.py +1 -0
  55. optimum/rbln/transformers/models/t5/modeling_t5.py +108 -0
  56. optimum/rbln/transformers/models/t5/t5_architecture.py +46 -32
  57. optimum/rbln/transformers/models/wav2vec2/modeling_wav2vec2.py +0 -1
  58. optimum/rbln/transformers/models/whisper/modeling_whisper.py +38 -13
  59. optimum/rbln/transformers/models/xlm_roberta/modeling_xlm_roberta.py +1 -2
  60. optimum/rbln/transformers/utils/rbln_quantization.py +8 -2
  61. optimum/rbln/utils/context.py +58 -0
  62. optimum/rbln/utils/decorator_utils.py +55 -0
  63. optimum/rbln/utils/import_utils.py +21 -0
  64. optimum/rbln/utils/logging.py +1 -1
  65. optimum/rbln/utils/runtime_utils.py +4 -4
  66. optimum/rbln/utils/timer_utils.py +26 -2
  67. {optimum_rbln-0.1.11.dist-info → optimum_rbln-0.1.13.dist-info}/METADATA +11 -9
  68. optimum_rbln-0.1.13.dist-info/RECORD +107 -0
  69. {optimum_rbln-0.1.11.dist-info → optimum_rbln-0.1.13.dist-info}/WHEEL +1 -1
  70. optimum_rbln-0.1.11.dist-info/RECORD +0 -93
  71. {optimum_rbln-0.1.11.dist-info → optimum_rbln-0.1.13.dist-info}/entry_points.txt +0 -0
  72. {optimum_rbln-0.1.11.dist-info → optimum_rbln-0.1.13.dist-info}/licenses/LICENSE +0 -0
@@ -16,131 +16,9 @@
16
16
 
17
17
  from diffusers import StableDiffusionXLImg2ImgPipeline
18
18
 
19
- from ....modeling_base import RBLNBaseModel
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
- @classmethod
27
- def from_pretrained(cls, model_id, **kwargs):
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"]
@@ -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
@@ -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, maybe_save_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 _from_model(
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: "RBLNBaseModel" = getattr(importlib.import_module("optimum.rbln"), f"RBLN{cls_name}")
100
+ submodule_cls: "RBLNModel" = getattr(importlib.import_module("optimum.rbln"), f"RBLN{cls_name}")
104
101
 
105
- if submodule_name in rbln_sub_configs_dict:
106
- kwargs["rbln_config"] = rbln_sub_configs_dict[submodule_name]
102
+ if submodule_name in rbln_kwargs:
103
+ kwargs["rbln_config"] = rbln_kwargs[submodule_name]
107
104
 
108
- rbln_submodule = submodule_cls._export(
109
- model_id=None,
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 _submodule_from_compiled_model(
124
- cls, model_save_dir: str, rbln_sub_configs_dict: Dict[str, Any], rbln_kwargs: Dict[str, Any], **kwargs
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
- rbln_submodule_config_dict = rbln_sub_configs_dict.get(submodule_name, None)
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, **kwargs)
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 way :
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._from_model(
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._submodule_from_compiled_model(
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
- def _split_submodule_config(cls, rbln_config_dict: Dict[str, Any] = {}) -> Dict[str, Any]:
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, rbln_sub_configs_dict = cls.resolve_rbln_config(rbln_config, 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
- models = (
496
- cls._create_runtimes(rbln_compiled_models, rbln_config.device_map)
497
- if rbln_config.create_runtimes
498
- else UnavailableRuntime()
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 _export(cls, *args, **kwargs):
603
- """
604
- Exports a vanilla Transformers model into a rbln-compiled Module.
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
- @torch.no_grad()
699
- def _export(
682
+ @use_rbln_config
683
+ def from_model(
700
684
  cls,
701
- model_id: Union[str, Path],
702
- config: "PretrainedConfig",
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
- model: "PreTrainedModel" = None,
712
- rbln_config: Optional[Dict[str, Any]] = None,
688
+ subfolder: str = "",
713
689
  **kwargs,
714
- ) -> "RBLNModel":
715
- rbln_kwargs, rbln_sub_configs_dict = cls.resolve_rbln_config(rbln_config, kwargs)
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
- # Load pytorch model if needed.
729
- if model is None:
730
- model: "PreTrainedModel" = cls.get_pytorch_model(
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
- # FIXME :: optimum passes AutoConfig.
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
- rbln_image_size = processor.size["shortest_edge"]
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
- rbln_image_size = rbln_image_size, rbln_image_size
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, rbln_image_size[0], rbln_image_size[1]],
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