ai-simple-engine-runtime-diffusers 0.0.1__tar.gz → 0.0.3__tar.gz

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 (27) hide show
  1. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/PKG-INFO +5 -5
  2. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/pyproject.toml +5 -5
  3. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/executor/diffusers_latent_diffusion_model_executor.py +14 -5
  4. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/loader/latent_diffusion_model_loader.py +24 -5
  5. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/scheduler/registry/diffusers_scheduler_registry.py +4 -2
  6. ai_simple_engine_runtime_diffusers-0.0.3/src/ai_simple_engine_runtime_diffusers/models/scheduler/utils.py +22 -0
  7. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/plugin.py +21 -29
  8. ai_simple_engine_runtime_diffusers-0.0.1/src/ai_simple_engine_runtime_diffusers/models/scheduler/utils.py +0 -44
  9. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/LICENSE +0 -0
  10. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/README.md +0 -0
  11. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/__init__.py +0 -0
  12. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/__init__.py +0 -0
  13. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/executor/__init__.py +0 -0
  14. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/executor/noise/__init__.py +0 -0
  15. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/executor/noise/pytorch_noise_generator.py +0 -0
  16. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/executor/prompt_embeddings/__init__.py +0 -0
  17. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/executor/prompt_embeddings/prompt_embeddings.py +0 -0
  18. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/executor/text_encoder_model_executor_abstract.py +0 -0
  19. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/executor/unet_model_executor_abstract.py +0 -0
  20. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/executor/vae_model_executor_abstract.py +0 -0
  21. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/loader/__init__.py +0 -0
  22. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/runtime/__init__.py +0 -0
  23. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/runtime/diffusers_latent_diffusion_model.py +0 -0
  24. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/runtime/utils.py +0 -0
  25. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/scheduler/__init__.py +0 -0
  26. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/scheduler/diffusers_scheduler.py +0 -0
  27. {ai_simple_engine_runtime_diffusers-0.0.1 → ai_simple_engine_runtime_diffusers-0.0.3}/src/ai_simple_engine_runtime_diffusers/models/scheduler/registry/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ai-simple-engine-runtime-diffusers
3
- Version: 0.0.1
3
+ Version: 0.0.3
4
4
  Summary: AI Simple Engine Runtime Diffusers Module
5
5
  License-File: LICENSE
6
6
  Author: danialcala94
@@ -9,11 +9,11 @@ Requires-Python: >=3.10,<3.12
9
9
  Classifier: Programming Language :: Python :: 3
10
10
  Classifier: Programming Language :: Python :: 3.10
11
11
  Classifier: Programming Language :: Python :: 3.11
12
- Requires-Dist: ai-simple-engine (>=0.2.6,<1.0.0)
12
+ Requires-Dist: ai-simple-engine (>=0.2.8,<1.0.0)
13
13
  Requires-Dist: ai-simple-engine-common (>=0.0.3,<1.0.0)
14
- Requires-Dist: ai-simple-engine-diffusion (>=0.0.2,<1.0.0)
15
- Requires-Dist: diffusers (>=0.38.0,<1.0.0)
16
- Requires-Dist: transformers (>=0.0.1,<1.0.0)
14
+ Requires-Dist: ai-simple-engine-diffusion (>=0.0.3,<1.0.0)
15
+ Requires-Dist: diffusers (>=0.38.0,<9999.0.0)
16
+ Requires-Dist: transformers (>=5.13.0,<9999.0.0)
17
17
  Description-Content-Type: text/markdown
18
18
 
19
19
  # AI Simple Engine Runtime Diffusers Module
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ai-simple-engine-runtime-diffusers"
3
- version = "0.0.1"
3
+ version = "0.0.3"
4
4
  description = "AI Simple Engine Runtime Diffusers Module"
5
5
  authors = [
6
6
  {name = "danialcala94", email = "danielalcalavalera@gmail.com"}
@@ -10,11 +10,11 @@ requires-python = ">=3.10,<3.12"
10
10
 
11
11
  [tool.poetry.dependencies]
12
12
  # Mandatory
13
- ai-simple-engine = { version = ">=0.2.6,<1.0.0", optional = false }
13
+ ai-simple-engine = { version = ">=0.2.8,<1.0.0", optional = false }
14
14
  ai-simple-engine-common = { version = ">=0.0.3,<1.0.0", optional = false }
15
- ai-simple-engine-diffusion = { version = ">=0.0.2,<1.0.0", optional = false }
16
- transformers = { version = ">=0.0.1,<1.0.0", optional = false }
17
- diffusers = { version = ">=0.38.0,<1.0.0", optional = false }
15
+ ai-simple-engine-diffusion = { version = ">=0.0.3,<1.0.0", optional = false }
16
+ transformers = { version = ">=5.13.0,<9999.0.0", optional = false }
17
+ diffusers = { version = ">=0.38.0,<9999.0.0", optional = false }
18
18
  # Optional
19
19
 
20
20
  [tool.poetry]
@@ -4,6 +4,7 @@ from ai_simple_engine.execution.execution_context import ExecutionContext
4
4
  from ai_simple_engine_runtime_diffusers.models.executor.prompt_embeddings.prompt_embeddings import PromptEmbeddings
5
5
  from ai_simple_engine_runtime_diffusers.models.scheduler.registry.diffusers_scheduler_registry import DiffusersSchedulerRegistry
6
6
  from ai_simple_engine.models.loaded_model import LoadedModel
7
+ from ai_simple_engine.types.image import Image
7
8
 
8
9
  import torch
9
10
 
@@ -26,9 +27,9 @@ class DiffusersLatentDiffusionModelExecutor (
26
27
  context: ExecutionContext,
27
28
  model: LoadedModel,
28
29
  ):
29
- scheduler_registry = context.services.resolve(DiffusersSchedulerRegistry)
30
+ scheduler_registry = context.services.get(DiffusersSchedulerRegistry)
30
31
 
31
- scheduler_class = scheduler_registry.resolve(model.info.scheduler.name)
32
+ scheduler_class = scheduler_registry.resolve(model.info.scheduler.identifier)
32
33
 
33
34
  scheduler = scheduler_class.from_config(
34
35
  model.instance.scheduler_config,
@@ -109,15 +110,23 @@ class DiffusersLatentDiffusionModelExecutor (
109
110
  async def decode_latents(
110
111
  self,
111
112
  *,
112
- model,
113
+ model: LoadedModel,
113
114
  latents
114
- ):
115
- runtime_model = model.model
115
+ ) -> Image:
116
+ runtime_model = model.instance
116
117
 
117
118
  vae = runtime_model.vae
118
119
 
119
120
  latents = latents / vae.config.scaling_factor
120
121
 
121
122
  image = vae.decode(latents).sample
123
+ """
124
+ TODO: I don't know if this must be done always
125
+ or depending or what, but I should pay attention
126
+ and refactor it.
127
+ """
128
+ image = (image / 2 + 0.5).clamp(0, 1)
129
+ image = image.cpu().permute(0, 2, 3, 1).float().detach().numpy()
130
+ image = Image(image)
122
131
 
123
132
  return image
@@ -9,12 +9,17 @@ from ai_simple_engine.models.loaded_model import LoadedModel
9
9
  from transformers import CLIPTokenizer, CLIPTextModel
10
10
  from diffusers import UNet2DConditionModel, AutoencoderKL
11
11
 
12
- import torch
13
-
14
12
 
15
13
  class LatentDiffusionModelLoader(
16
14
  ModelLoader
17
15
  ):
16
+
17
+ @property
18
+ def family(
19
+ self
20
+ ) -> str:
21
+ # TODO: Transform into const
22
+ return 'latent_diffusion'
18
23
 
19
24
  async def load(
20
25
  self,
@@ -27,7 +32,7 @@ class LatentDiffusionModelLoader(
27
32
  path,
28
33
  subfolder = 'tokenizer',
29
34
  torch_dtype = get_torch_dtype_for(device)
30
- ).to(str(device))
35
+ )#.to(str(device))
31
36
 
32
37
  text_encoder = CLIPTextModel.from_pretrained(
33
38
  path,
@@ -47,11 +52,25 @@ class LatentDiffusionModelLoader(
47
52
  torch_dtype = get_torch_dtype_for(device)
48
53
  ).to(str(device))
49
54
 
55
+ # TODO: This is if I want its own Scheduler
56
+ # DDIMScheduler.from_pretrained(
57
+ # path,
58
+ # subfolder = 'scheduler',
59
+ # torch_dtype = get_torch_dtype_for(device)
60
+ # )#.to(str(device))
61
+
62
+ # TODO: We had this before but was failing
50
63
  scheduler_config = AutoencoderKL.load_config(
51
- path,
64
+ path + '/scheduler/scheduler_config.json',
52
65
  subfolder = 'scheduler',
53
66
  torch_dtype = get_torch_dtype_for(device)
54
- ).to(str(device))
67
+ )#.to(str(device))
68
+
69
+ # Free memory
70
+ # TODO: Explain why (?)
71
+ unet.eval()
72
+ text_encoder.eval()
73
+ vae.eval()
55
74
 
56
75
  runtime_model = DiffusersLatentDiffusionModel(
57
76
  tokenizer = tokenizer,
@@ -5,8 +5,10 @@ from diffusers.schedulers.scheduling_utils import SchedulerMixin
5
5
  class DiffusersSchedulerRegistry(
6
6
  ResolverRegistry[
7
7
  str,
8
- type[SchedulerMixin]
9
- ]
8
+ type[SchedulerMixin],
9
+ str
10
+ ],
11
+ # Generic[TModel, TExecutor]
10
12
  ):
11
13
  """
12
14
  Class that will register the different
@@ -0,0 +1,22 @@
1
+ """
2
+ TODO: Maybe rename and move this module.
3
+ """
4
+ from diffusers.schedulers import (
5
+ DDIMScheduler,
6
+ EulerDiscreteScheduler,
7
+ EulerAncestralDiscreteScheduler,
8
+ DPMSolverMultistepScheduler,
9
+ FlowMatchEulerDiscreteScheduler
10
+ )
11
+
12
+ SCHEDULERS = {
13
+ 'ddim': DDIMScheduler,
14
+ 'euler': EulerDiscreteScheduler,
15
+ 'euler_a': EulerAncestralDiscreteScheduler,
16
+ 'dpmpp_2m': DPMSolverMultistepScheduler,
17
+ 'flow_match_euler': FlowMatchEulerDiscreteScheduler
18
+ }
19
+ """
20
+ The list including all the schedulers we are
21
+ accepting.
22
+ """
@@ -1,11 +1,15 @@
1
1
  from ai_simple_engine_runtime_diffusers.models.loader.latent_diffusion_model_loader import LatentDiffusionModelLoader
2
- from ai_simple_engine_runtime_diffusers.models.scheduler.utils import SCHEDULERS
2
+ from ai_simple_engine_runtime_diffusers.models.executor.noise.pytorch_noise_generator import TorchNoiseGenerator
3
3
  from ai_simple_engine_runtime_diffusers.models.scheduler.registry.diffusers_scheduler_registry import DiffusersSchedulerRegistry
4
+ from ai_simple_engine.models.executor.registry.family_model_executor_registry import FamilyModelExecutorRegistry
5
+ from ai_simple_engine_runtime_diffusers.models.executor.diffusers_latent_diffusion_model_executor import DiffusersLatentDiffusionModelExecutor
6
+ from ai_simple_engine_runtime_diffusers.models.scheduler.utils import SCHEDULERS
7
+ from ai_simple_engine_diffusion.noise.noise_generator_abstract import NoiseGenerator
4
8
  from ai_simple_engine.engine_builder import EngineBuilder
5
9
  from ai_simple_engine.plugins.plugin import Plugin
6
10
 
7
11
 
8
- class DiffusersRuntimeMusicgenPlugin(
12
+ class DiffusersRuntimePlugin(
9
13
  Plugin
10
14
  ):
11
15
  """
@@ -19,10 +23,15 @@ class DiffusersRuntimeMusicgenPlugin(
19
23
  self,
20
24
  builder: EngineBuilder
21
25
  ):
22
-
26
+ (
27
+ builder.add_model_loader(LatentDiffusionModelLoader())
28
+ )
23
29
 
24
30
  (
25
- builder.add_model_loader(LatentDiffusionModelLoader)
31
+ builder.add_service(
32
+ NoiseGenerator,
33
+ TorchNoiseGenerator()
34
+ )
26
35
  )
27
36
 
28
37
  # TODO: Register the SchedulerRegistry
@@ -36,34 +45,17 @@ class DiffusersRuntimeMusicgenPlugin(
36
45
  scheduler_spec.identifier
37
46
  )
38
47
  """
48
+ model_executor_registry = builder.get_or_add_service(FamilyModelExecutorRegistry)
49
+
50
+ model_executor_registry.register(
51
+ 'latent_diffusion',
52
+ DiffusersLatentDiffusionModelExecutor()
53
+ )
54
+
39
55
  scheduler_registry = builder.get_or_add_service(DiffusersSchedulerRegistry)
40
56
 
41
57
  for identifier, cls in SCHEDULERS.items():
42
58
  scheduler_registry.register(
43
59
  identifier,
44
60
  cls
45
- )
46
-
47
- # scheduler_registry.register(
48
- # 'euler',
49
- # EulerDiscreteScheduler
50
- # )
51
-
52
- # TODO: This below was the 'musicgen'
53
- # (
54
- # builder
55
- # .add_model_loader(MusicgenModelLoader())
56
- # )
57
-
58
- # """
59
- # We obtain the registry that handles the
60
- # model executors by the model's family,
61
- # and we register our specific model
62
- # executor that uses transformers.
63
- # """
64
- # registry = builder.get_or_add_service(FamilyModelExecutorRegistry)
65
-
66
- # registry.register(
67
- # MUSICGEN_MODEL_FAMILY,
68
- # TransformersMusicgenModelExecutor()
69
- # )
61
+ )
@@ -1,44 +0,0 @@
1
- """
2
- TODO: Maybe rename and move this module.
3
- """
4
- from diffusers.schedulers import (
5
- DDIMScheduler,
6
- EulerDiscreteScheduler,
7
- EulerAncestralDiscreteScheduler,
8
- DPMSolverMultistepScheduler,
9
- FlowMatchEulerDiscreteScheduler
10
- )
11
-
12
- SCHEDULERS = {
13
- 'ddim': DDIMScheduler,
14
- 'euler': EulerDiscreteScheduler,
15
- 'euler_a': EulerAncestralDiscreteScheduler,
16
- 'dpmpp_2m': DPMSolverMultistepScheduler,
17
- 'flow_match_euler': FlowMatchEulerDiscreteScheduler
18
- }
19
- """
20
- The list including all the schedulers we are
21
- accepting.
22
- """
23
-
24
-
25
- def get_scheduler_class(
26
- scheduler: str,
27
- model: LoadedModel
28
- ) -> Union[SchedulerMixin, None]:
29
- scheduler_class = SCHEDULERS.get(scheduler, None)
30
-
31
- if scheduler_class is None:
32
- raise Exception(f'The scheduler "{scheduler}" is not accepted by our system.')
33
-
34
- return scheduler_class
35
-
36
- scheduler_cls = registry.resolve(model.info.scheduler.identifier)
37
-
38
- scheduler = scheduler_cls.from_config(...)
39
-
40
- return scheduler
41
-
42
- return scheduler_cls.from_config(
43
- model.model.scheduler.config
44
- )