ai-simple-engine-runtime-diffusers 0.0.2__tar.gz → 0.0.4__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.2 → ai_simple_engine_runtime_diffusers-0.0.4}/PKG-INFO +4 -4
  2. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/pyproject.toml +4 -4
  3. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/executor/diffusers_latent_diffusion_model_executor.py +14 -5
  4. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/loader/latent_diffusion_model_loader.py +24 -5
  5. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/scheduler/diffusers_scheduler.py +11 -6
  6. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/scheduler/registry/diffusers_scheduler_registry.py +4 -2
  7. ai_simple_engine_runtime_diffusers-0.0.4/src/ai_simple_engine_runtime_diffusers/models/scheduler/utils.py +22 -0
  8. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/plugin.py +20 -2
  9. ai_simple_engine_runtime_diffusers-0.0.2/src/ai_simple_engine_runtime_diffusers/models/scheduler/utils.py +0 -44
  10. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/LICENSE +0 -0
  11. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/README.md +0 -0
  12. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/__init__.py +0 -0
  13. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/__init__.py +0 -0
  14. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/executor/__init__.py +0 -0
  15. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/executor/noise/__init__.py +0 -0
  16. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/executor/noise/pytorch_noise_generator.py +0 -0
  17. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/executor/prompt_embeddings/__init__.py +0 -0
  18. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/executor/prompt_embeddings/prompt_embeddings.py +0 -0
  19. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/executor/text_encoder_model_executor_abstract.py +0 -0
  20. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/executor/unet_model_executor_abstract.py +0 -0
  21. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/executor/vae_model_executor_abstract.py +0 -0
  22. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/loader/__init__.py +0 -0
  23. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/runtime/__init__.py +0 -0
  24. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/runtime/diffusers_latent_diffusion_model.py +0 -0
  25. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/runtime/utils.py +0 -0
  26. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/src/ai_simple_engine_runtime_diffusers/models/scheduler/__init__.py +0 -0
  27. {ai_simple_engine_runtime_diffusers-0.0.2 → ai_simple_engine_runtime_diffusers-0.0.4}/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.2
3
+ Version: 0.0.4
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.9,<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)
14
+ Requires-Dist: ai-simple-engine-diffusion (>=0.0.4,<1.0.0)
15
15
  Requires-Dist: diffusers (>=0.38.0,<9999.0.0)
16
- Requires-Dist: transformers (>=5.12.1,<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.2"
3
+ version = "0.0.4"
4
4
  description = "AI Simple Engine Runtime Diffusers Module"
5
5
  authors = [
6
6
  {name = "danialcala94", email = "danielalcalavalera@gmail.com"}
@@ -10,10 +10,10 @@ 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.9,<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 = ">=5.12.1,<9999.0.0", optional = false }
15
+ ai-simple-engine-diffusion = { version = ">=0.0.4,<1.0.0", optional = false }
16
+ transformers = { version = ">=5.13.0,<9999.0.0", optional = false }
17
17
  diffusers = { version = ">=0.38.0,<9999.0.0", optional = false }
18
18
  # Optional
19
19
 
@@ -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,
@@ -1,9 +1,4 @@
1
- from ai_simple_engine_diffusion.scheduler.abstract import Scheduler
2
-
3
-
4
- class DiffusersScheduler(
5
- Scheduler
6
- ):
1
+ class DiffusersScheduler:
7
2
 
8
3
  def __init__(
9
4
  self,
@@ -11,6 +6,16 @@ class DiffusersScheduler(
11
6
  ):
12
7
  self._scheduler = scheduler
13
8
 
9
+ @property
10
+ def init_noise_sigma(
11
+ self
12
+ ):
13
+ """
14
+ The `gamma` that must be used when starting
15
+ to create the noise.
16
+ """
17
+ return self._scheduler.init_noise_sigma
18
+
14
19
  @property
15
20
  def timesteps(
16
21
  self
@@ -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,6 +1,10 @@
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
 
@@ -20,7 +24,14 @@ class DiffusersRuntimePlugin(
20
24
  builder: EngineBuilder
21
25
  ):
22
26
  (
23
- builder.add_model_loader(LatentDiffusionModelLoader)
27
+ builder.add_model_loader(LatentDiffusionModelLoader())
28
+ )
29
+
30
+ (
31
+ builder.add_service(
32
+ NoiseGenerator,
33
+ TorchNoiseGenerator()
34
+ )
24
35
  )
25
36
 
26
37
  # TODO: Register the SchedulerRegistry
@@ -34,6 +45,13 @@ class DiffusersRuntimePlugin(
34
45
  scheduler_spec.identifier
35
46
  )
36
47
  """
48
+ model_executor_registry = builder.get_or_add_service(FamilyModelExecutorRegistry)
49
+
50
+ model_executor_registry.register(
51
+ 'latent_diffusion',
52
+ DiffusersLatentDiffusionModelExecutor()
53
+ )
54
+
37
55
  scheduler_registry = builder.get_or_add_service(DiffusersSchedulerRegistry)
38
56
 
39
57
  for identifier, cls in SCHEDULERS.items():
@@ -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
- )