comdoleger commited on
Commit
8c25371
·
verified ·
1 Parent(s): e3e3fdf

Upload extensions_built_in/diffusion_models/omnigen2/src/models/transformers/transformer_omnigen2.py with huggingface_hub

Browse files
extensions_built_in/diffusion_models/omnigen2/src/models/transformers/transformer_omnigen2.py ADDED
@@ -0,0 +1,621 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import warnings
2
+ import itertools
3
+ from typing import Any, Dict, List, Optional, Tuple, Union
4
+
5
+ import torch
6
+ import torch.nn as nn
7
+
8
+ from einops import rearrange
9
+
10
+ from diffusers.configuration_utils import ConfigMixin, register_to_config
11
+ from diffusers.loaders import PeftAdapterMixin
12
+ from diffusers.loaders.single_file_model import FromOriginalModelMixin
13
+ from diffusers.utils import USE_PEFT_BACKEND, logging, scale_lora_layers, unscale_lora_layers
14
+ from diffusers.models.attention_processor import Attention
15
+ from diffusers.models.modeling_outputs import Transformer2DModelOutput
16
+ from diffusers.models.modeling_utils import ModelMixin
17
+
18
+ from ..attention_processor import OmniGen2AttnProcessorFlash2Varlen, OmniGen2AttnProcessor
19
+ from .repo import OmniGen2RotaryPosEmbed
20
+ from .block_lumina2 import LuminaLayerNormContinuous, LuminaRMSNormZero, LuminaFeedForward, Lumina2CombinedTimestepCaptionEmbedding
21
+
22
+ from ...utils.import_utils import is_triton_available, is_flash_attn_available
23
+
24
+ if is_triton_available():
25
+ from ...ops.triton.layer_norm import RMSNorm
26
+ else:
27
+ from torch.nn import RMSNorm
28
+
29
+ logger = logging.get_logger(__name__)
30
+
31
+
32
+ class OmniGen2TransformerBlock(nn.Module):
33
+ """
34
+ Transformer block for OmniGen2 model.
35
+
36
+ This block implements a transformer layer with:
37
+ - Multi-head attention with flash attention
38
+ - Feed-forward network with SwiGLU activation
39
+ - RMS normalization
40
+ - Optional modulation for conditional generation
41
+
42
+ Args:
43
+ dim: Dimension of the input and output tensors
44
+ num_attention_heads: Number of attention heads
45
+ num_kv_heads: Number of key-value heads
46
+ multiple_of: Multiple of which the hidden dimension should be
47
+ ffn_dim_multiplier: Multiplier for the feed-forward network dimension
48
+ norm_eps: Epsilon value for normalization layers
49
+ modulation: Whether to use modulation for conditional generation
50
+ use_fused_rms_norm: Whether to use fused RMS normalization
51
+ use_fused_swiglu: Whether to use fused SwiGLU activation
52
+ """
53
+
54
+ def __init__(
55
+ self,
56
+ dim: int,
57
+ num_attention_heads: int,
58
+ num_kv_heads: int,
59
+ multiple_of: int,
60
+ ffn_dim_multiplier: float,
61
+ norm_eps: float,
62
+ modulation: bool = True,
63
+ ) -> None:
64
+ """Initialize the transformer block."""
65
+ super().__init__()
66
+ self.head_dim = dim // num_attention_heads
67
+ self.modulation = modulation
68
+
69
+ try:
70
+ processor = OmniGen2AttnProcessorFlash2Varlen()
71
+ except ImportError:
72
+ processor = OmniGen2AttnProcessor()
73
+
74
+ # Initialize attention layer
75
+ self.attn = Attention(
76
+ query_dim=dim,
77
+ cross_attention_dim=None,
78
+ dim_head=dim // num_attention_heads,
79
+ qk_norm="rms_norm",
80
+ heads=num_attention_heads,
81
+ kv_heads=num_kv_heads,
82
+ eps=1e-5,
83
+ bias=False,
84
+ out_bias=False,
85
+ processor=processor,
86
+ )
87
+
88
+ # Initialize feed-forward network
89
+ self.feed_forward = LuminaFeedForward(
90
+ dim=dim,
91
+ inner_dim=4 * dim,
92
+ multiple_of=multiple_of,
93
+ ffn_dim_multiplier=ffn_dim_multiplier
94
+ )
95
+
96
+ # Initialize normalization layers
97
+ if modulation:
98
+ self.norm1 = LuminaRMSNormZero(
99
+ embedding_dim=dim,
100
+ norm_eps=norm_eps,
101
+ norm_elementwise_affine=True
102
+ )
103
+ else:
104
+ self.norm1 = RMSNorm(dim, eps=norm_eps)
105
+
106
+ self.ffn_norm1 = RMSNorm(dim, eps=norm_eps)
107
+ self.norm2 = RMSNorm(dim, eps=norm_eps)
108
+ self.ffn_norm2 = RMSNorm(dim, eps=norm_eps)
109
+
110
+ self.initialize_weights()
111
+
112
+ def initialize_weights(self) -> None:
113
+ """
114
+ Initialize the weights of the transformer block.
115
+
116
+ Uses Xavier uniform initialization for linear layers and zero initialization for biases.
117
+ """
118
+ nn.init.xavier_uniform_(self.attn.to_q.weight)
119
+ nn.init.xavier_uniform_(self.attn.to_k.weight)
120
+ nn.init.xavier_uniform_(self.attn.to_v.weight)
121
+ nn.init.xavier_uniform_(self.attn.to_out[0].weight)
122
+
123
+ nn.init.xavier_uniform_(self.feed_forward.linear_1.weight)
124
+ nn.init.xavier_uniform_(self.feed_forward.linear_2.weight)
125
+ nn.init.xavier_uniform_(self.feed_forward.linear_3.weight)
126
+
127
+ if self.modulation:
128
+ nn.init.zeros_(self.norm1.linear.weight)
129
+ nn.init.zeros_(self.norm1.linear.bias)
130
+
131
+ def forward(
132
+ self,
133
+ hidden_states: torch.Tensor,
134
+ attention_mask: torch.Tensor,
135
+ image_rotary_emb: torch.Tensor,
136
+ temb: Optional[torch.Tensor] = None,
137
+ ) -> torch.Tensor:
138
+ """
139
+ Forward pass of the transformer block.
140
+
141
+ Args:
142
+ hidden_states: Input hidden states tensor
143
+ attention_mask: Attention mask tensor
144
+ image_rotary_emb: Rotary embeddings for image tokens
145
+ temb: Optional timestep embedding tensor
146
+
147
+ Returns:
148
+ torch.Tensor: Output hidden states after transformer block processing
149
+ """
150
+ import time
151
+ if self.modulation:
152
+ if temb is None:
153
+ raise ValueError("temb must be provided when modulation is enabled")
154
+
155
+ norm_hidden_states, gate_msa, scale_mlp, gate_mlp = self.norm1(hidden_states, temb)
156
+ attn_output = self.attn(
157
+ hidden_states=norm_hidden_states,
158
+ encoder_hidden_states=norm_hidden_states,
159
+ attention_mask=attention_mask,
160
+ image_rotary_emb=image_rotary_emb,
161
+ )
162
+ hidden_states = hidden_states + gate_msa.unsqueeze(1).tanh() * self.norm2(attn_output)
163
+ mlp_output = self.feed_forward(self.ffn_norm1(hidden_states) * (1 + scale_mlp.unsqueeze(1)))
164
+ hidden_states = hidden_states + gate_mlp.unsqueeze(1).tanh() * self.ffn_norm2(mlp_output)
165
+ else:
166
+ norm_hidden_states = self.norm1(hidden_states)
167
+ attn_output = self.attn(
168
+ hidden_states=norm_hidden_states,
169
+ encoder_hidden_states=norm_hidden_states,
170
+ attention_mask=attention_mask,
171
+ image_rotary_emb=image_rotary_emb,
172
+ )
173
+ hidden_states = hidden_states + self.norm2(attn_output)
174
+ mlp_output = self.feed_forward(self.ffn_norm1(hidden_states))
175
+ hidden_states = hidden_states + self.ffn_norm2(mlp_output)
176
+
177
+ return hidden_states
178
+
179
+
180
+ class OmniGen2Transformer2DModel(ModelMixin, ConfigMixin, PeftAdapterMixin, FromOriginalModelMixin):
181
+ """
182
+ OmniGen2 Transformer 2D Model.
183
+
184
+ A transformer-based diffusion model for image generation with:
185
+ - Patch-based image processing
186
+ - Rotary position embeddings
187
+ - Multi-head attention
188
+ - Conditional generation support
189
+
190
+ Args:
191
+ patch_size: Size of image patches
192
+ in_channels: Number of input channels
193
+ out_channels: Number of output channels (defaults to in_channels)
194
+ hidden_size: Size of hidden layers
195
+ num_layers: Number of transformer layers
196
+ num_refiner_layers: Number of refiner layers
197
+ num_attention_heads: Number of attention heads
198
+ num_kv_heads: Number of key-value heads
199
+ multiple_of: Multiple of which the hidden dimension should be
200
+ ffn_dim_multiplier: Multiplier for feed-forward network dimension
201
+ norm_eps: Epsilon value for normalization layers
202
+ axes_dim_rope: Dimensions for rotary position embeddings
203
+ axes_lens: Lengths for rotary position embeddings
204
+ text_feat_dim: Dimension of text features
205
+ timestep_scale: Scale factor for timestep embeddings
206
+ use_fused_rms_norm: Whether to use fused RMS normalization
207
+ use_fused_swiglu: Whether to use fused SwiGLU activation
208
+ """
209
+
210
+ _supports_gradient_checkpointing = True
211
+ _no_split_modules = ["Omnigen2TransformerBlock"]
212
+ _skip_layerwise_casting_patterns = ["x_embedder", "norm"]
213
+
214
+ @register_to_config
215
+ def __init__(
216
+ self,
217
+ patch_size: int = 2,
218
+ in_channels: int = 16,
219
+ out_channels: Optional[int] = None,
220
+ hidden_size: int = 2304,
221
+ num_layers: int = 26,
222
+ num_refiner_layers: int = 2,
223
+ num_attention_heads: int = 24,
224
+ num_kv_heads: int = 8,
225
+ multiple_of: int = 256,
226
+ ffn_dim_multiplier: Optional[float] = None,
227
+ norm_eps: float = 1e-5,
228
+ axes_dim_rope: Tuple[int, int, int] = (32, 32, 32),
229
+ axes_lens: Tuple[int, int, int] = (300, 512, 512),
230
+ text_feat_dim: int = 1024,
231
+ timestep_scale: float = 1.0
232
+ ) -> None:
233
+ """Initialize the OmniGen2 transformer model."""
234
+ super().__init__()
235
+
236
+ # Validate configuration
237
+ if (hidden_size // num_attention_heads) != sum(axes_dim_rope):
238
+ raise ValueError(
239
+ f"hidden_size // num_attention_heads ({hidden_size // num_attention_heads}) "
240
+ f"must equal sum(axes_dim_rope) ({sum(axes_dim_rope)})"
241
+ )
242
+
243
+ self.out_channels = out_channels or in_channels
244
+
245
+ # Initialize embeddings
246
+ self.rope_embedder = OmniGen2RotaryPosEmbed(
247
+ theta=10000,
248
+ axes_dim=axes_dim_rope,
249
+ axes_lens=axes_lens,
250
+ patch_size=patch_size,
251
+ )
252
+
253
+ self.x_embedder = nn.Linear(
254
+ in_features=patch_size * patch_size * in_channels,
255
+ out_features=hidden_size,
256
+ )
257
+
258
+ self.ref_image_patch_embedder = nn.Linear(
259
+ in_features=patch_size * patch_size * in_channels,
260
+ out_features=hidden_size,
261
+ )
262
+
263
+ self.time_caption_embed = Lumina2CombinedTimestepCaptionEmbedding(
264
+ hidden_size=hidden_size,
265
+ text_feat_dim=text_feat_dim,
266
+ norm_eps=norm_eps,
267
+ timestep_scale=timestep_scale
268
+ )
269
+
270
+ # Initialize transformer blocks
271
+ self.noise_refiner = nn.ModuleList([
272
+ OmniGen2TransformerBlock(
273
+ hidden_size,
274
+ num_attention_heads,
275
+ num_kv_heads,
276
+ multiple_of,
277
+ ffn_dim_multiplier,
278
+ norm_eps,
279
+ modulation=True
280
+ )
281
+ for _ in range(num_refiner_layers)
282
+ ])
283
+
284
+ self.ref_image_refiner = nn.ModuleList([
285
+ OmniGen2TransformerBlock(
286
+ hidden_size,
287
+ num_attention_heads,
288
+ num_kv_heads,
289
+ multiple_of,
290
+ ffn_dim_multiplier,
291
+ norm_eps,
292
+ modulation=True
293
+ )
294
+ for _ in range(num_refiner_layers)
295
+ ])
296
+
297
+ self.context_refiner = nn.ModuleList(
298
+ [
299
+ OmniGen2TransformerBlock(
300
+ hidden_size,
301
+ num_attention_heads,
302
+ num_kv_heads,
303
+ multiple_of,
304
+ ffn_dim_multiplier,
305
+ norm_eps,
306
+ modulation=False
307
+ )
308
+ for _ in range(num_refiner_layers)
309
+ ]
310
+ )
311
+
312
+ # 3. Transformer blocks
313
+ self.layers = nn.ModuleList(
314
+ [
315
+ OmniGen2TransformerBlock(
316
+ hidden_size,
317
+ num_attention_heads,
318
+ num_kv_heads,
319
+ multiple_of,
320
+ ffn_dim_multiplier,
321
+ norm_eps,
322
+ modulation=True
323
+ )
324
+ for _ in range(num_layers)
325
+ ]
326
+ )
327
+
328
+ # 4. Output norm & projection
329
+ self.norm_out = LuminaLayerNormContinuous(
330
+ embedding_dim=hidden_size,
331
+ conditioning_embedding_dim=min(hidden_size, 1024),
332
+ elementwise_affine=False,
333
+ eps=1e-6,
334
+ bias=True,
335
+ out_dim=patch_size * patch_size * self.out_channels
336
+ )
337
+
338
+ # Add learnable embeddings to distinguish different images
339
+ self.image_index_embedding = nn.Parameter(torch.randn(5, hidden_size)) # support max 5 ref images
340
+
341
+ self.gradient_checkpointing = False
342
+
343
+ self.initialize_weights()
344
+
345
+ def initialize_weights(self) -> None:
346
+ """
347
+ Initialize the weights of the model.
348
+
349
+ Uses Xavier uniform initialization for linear layers.
350
+ """
351
+ nn.init.xavier_uniform_(self.x_embedder.weight)
352
+ nn.init.constant_(self.x_embedder.bias, 0.0)
353
+
354
+ nn.init.xavier_uniform_(self.ref_image_patch_embedder.weight)
355
+ nn.init.constant_(self.ref_image_patch_embedder.bias, 0.0)
356
+
357
+ nn.init.zeros_(self.norm_out.linear_1.weight)
358
+ nn.init.zeros_(self.norm_out.linear_1.bias)
359
+ nn.init.zeros_(self.norm_out.linear_2.weight)
360
+ nn.init.zeros_(self.norm_out.linear_2.bias)
361
+
362
+ nn.init.normal_(self.image_index_embedding, std=0.02)
363
+
364
+ def img_patch_embed_and_refine(
365
+ self,
366
+ hidden_states,
367
+ ref_image_hidden_states,
368
+ padded_img_mask,
369
+ padded_ref_img_mask,
370
+ noise_rotary_emb,
371
+ ref_img_rotary_emb,
372
+ l_effective_ref_img_len,
373
+ l_effective_img_len,
374
+ temb
375
+ ):
376
+ batch_size = len(hidden_states)
377
+ max_combined_img_len = max([img_len + sum(ref_img_len) for img_len, ref_img_len in zip(l_effective_img_len, l_effective_ref_img_len)])
378
+
379
+ hidden_states = self.x_embedder(hidden_states)
380
+ ref_image_hidden_states = self.ref_image_patch_embedder(ref_image_hidden_states)
381
+
382
+ for i in range(batch_size):
383
+ shift = 0
384
+ for j, ref_img_len in enumerate(l_effective_ref_img_len[i]):
385
+ ref_image_hidden_states[i, shift:shift + ref_img_len, :] = ref_image_hidden_states[i, shift:shift + ref_img_len, :] + self.image_index_embedding[j]
386
+ shift += ref_img_len
387
+
388
+ for layer in self.noise_refiner:
389
+ hidden_states = layer(hidden_states, padded_img_mask, noise_rotary_emb, temb)
390
+
391
+ flat_l_effective_ref_img_len = list(itertools.chain(*l_effective_ref_img_len))
392
+ num_ref_images = len(flat_l_effective_ref_img_len)
393
+ max_ref_img_len = max(flat_l_effective_ref_img_len)
394
+
395
+ batch_ref_img_mask = ref_image_hidden_states.new_zeros(num_ref_images, max_ref_img_len, dtype=torch.bool)
396
+ batch_ref_image_hidden_states = ref_image_hidden_states.new_zeros(num_ref_images, max_ref_img_len, self.config.hidden_size)
397
+ batch_ref_img_rotary_emb = hidden_states.new_zeros(num_ref_images, max_ref_img_len, ref_img_rotary_emb.shape[-1], dtype=ref_img_rotary_emb.dtype)
398
+ batch_temb = temb.new_zeros(num_ref_images, *temb.shape[1:], dtype=temb.dtype)
399
+
400
+ # sequence of ref imgs to batch
401
+ idx = 0
402
+ for i in range(batch_size):
403
+ shift = 0
404
+ for ref_img_len in l_effective_ref_img_len[i]:
405
+ batch_ref_img_mask[idx, :ref_img_len] = True
406
+ batch_ref_image_hidden_states[idx, :ref_img_len] = ref_image_hidden_states[i, shift:shift + ref_img_len]
407
+ batch_ref_img_rotary_emb[idx, :ref_img_len] = ref_img_rotary_emb[i, shift:shift + ref_img_len]
408
+ batch_temb[idx] = temb[i]
409
+ shift += ref_img_len
410
+ idx += 1
411
+
412
+ # refine ref imgs separately
413
+ for layer in self.ref_image_refiner:
414
+ batch_ref_image_hidden_states = layer(batch_ref_image_hidden_states, batch_ref_img_mask, batch_ref_img_rotary_emb, batch_temb)
415
+
416
+ # batch of ref imgs to sequence
417
+ idx = 0
418
+ for i in range(batch_size):
419
+ shift = 0
420
+ for ref_img_len in l_effective_ref_img_len[i]:
421
+ ref_image_hidden_states[i, shift:shift + ref_img_len] = batch_ref_image_hidden_states[idx, :ref_img_len]
422
+ shift += ref_img_len
423
+ idx += 1
424
+
425
+ combined_img_hidden_states = hidden_states.new_zeros(batch_size, max_combined_img_len, self.config.hidden_size)
426
+ for i, (ref_img_len, img_len) in enumerate(zip(l_effective_ref_img_len, l_effective_img_len)):
427
+ combined_img_hidden_states[i, :sum(ref_img_len)] = ref_image_hidden_states[i, :sum(ref_img_len)]
428
+ combined_img_hidden_states[i, sum(ref_img_len):sum(ref_img_len) + img_len] = hidden_states[i, :img_len]
429
+
430
+ return combined_img_hidden_states
431
+
432
+ def flat_and_pad_to_seq(self, hidden_states, ref_image_hidden_states):
433
+ batch_size = len(hidden_states)
434
+ p = self.config.patch_size
435
+ device = hidden_states[0].device
436
+
437
+ img_sizes = [(img.size(1), img.size(2)) for img in hidden_states]
438
+ l_effective_img_len = [(H // p) * (W // p) for (H, W) in img_sizes]
439
+
440
+ if ref_image_hidden_states is not None:
441
+ ref_img_sizes = [[(img.size(1), img.size(2)) for img in imgs] if imgs is not None else None for imgs in ref_image_hidden_states]
442
+ l_effective_ref_img_len = [[(ref_img_size[0] // p) * (ref_img_size[1] // p) for ref_img_size in _ref_img_sizes] if _ref_img_sizes is not None else [0] for _ref_img_sizes in ref_img_sizes]
443
+ else:
444
+ ref_img_sizes = [None for _ in range(batch_size)]
445
+ l_effective_ref_img_len = [[0] for _ in range(batch_size)]
446
+
447
+ max_ref_img_len = max([sum(ref_img_len) for ref_img_len in l_effective_ref_img_len])
448
+ max_img_len = max(l_effective_img_len)
449
+
450
+ # ref image patch embeddings
451
+ flat_ref_img_hidden_states = []
452
+ for i in range(batch_size):
453
+ if ref_img_sizes[i] is not None:
454
+ imgs = []
455
+ for ref_img in ref_image_hidden_states[i]:
456
+ C, H, W = ref_img.size()
457
+ ref_img = rearrange(ref_img, 'c (h p1) (w p2) -> (h w) (p1 p2 c)', p1=p, p2=p)
458
+ imgs.append(ref_img)
459
+
460
+ img = torch.cat(imgs, dim=0)
461
+ flat_ref_img_hidden_states.append(img)
462
+ else:
463
+ flat_ref_img_hidden_states.append(None)
464
+
465
+ # image patch embeddings
466
+ flat_hidden_states = []
467
+ for i in range(batch_size):
468
+ img = hidden_states[i]
469
+ C, H, W = img.size()
470
+
471
+ img = rearrange(img, 'c (h p1) (w p2) -> (h w) (p1 p2 c)', p1=p, p2=p)
472
+ flat_hidden_states.append(img)
473
+
474
+ padded_ref_img_hidden_states = torch.zeros(batch_size, max_ref_img_len, flat_hidden_states[0].shape[-1], device=device, dtype=flat_hidden_states[0].dtype)
475
+ padded_ref_img_mask = torch.zeros(batch_size, max_ref_img_len, dtype=torch.bool, device=device)
476
+ for i in range(batch_size):
477
+ if ref_img_sizes[i] is not None:
478
+ padded_ref_img_hidden_states[i, :sum(l_effective_ref_img_len[i])] = flat_ref_img_hidden_states[i]
479
+ padded_ref_img_mask[i, :sum(l_effective_ref_img_len[i])] = True
480
+
481
+ padded_hidden_states = torch.zeros(batch_size, max_img_len, flat_hidden_states[0].shape[-1], device=device, dtype=flat_hidden_states[0].dtype)
482
+ padded_img_mask = torch.zeros(batch_size, max_img_len, dtype=torch.bool, device=device)
483
+ for i in range(batch_size):
484
+ padded_hidden_states[i, :l_effective_img_len[i]] = flat_hidden_states[i]
485
+ padded_img_mask[i, :l_effective_img_len[i]] = True
486
+
487
+ return (
488
+ padded_hidden_states,
489
+ padded_ref_img_hidden_states,
490
+ padded_img_mask,
491
+ padded_ref_img_mask,
492
+ l_effective_ref_img_len,
493
+ l_effective_img_len,
494
+ ref_img_sizes,
495
+ img_sizes,
496
+ )
497
+
498
+ def forward(
499
+ self,
500
+ hidden_states: Union[torch.Tensor, List[torch.Tensor]],
501
+ timestep: torch.Tensor,
502
+ text_hidden_states: torch.Tensor,
503
+ freqs_cis: torch.Tensor,
504
+ text_attention_mask: torch.Tensor,
505
+ ref_image_hidden_states: Optional[List[List[torch.Tensor]]] = None,
506
+ attention_kwargs: Optional[Dict[str, Any]] = None,
507
+ return_dict: bool = False,
508
+ ) -> Union[torch.Tensor, Transformer2DModelOutput]:
509
+ if attention_kwargs is not None:
510
+ attention_kwargs = attention_kwargs.copy()
511
+ lora_scale = attention_kwargs.pop("scale", 1.0)
512
+ else:
513
+ lora_scale = 1.0
514
+
515
+ if USE_PEFT_BACKEND:
516
+ # weight the lora layers by setting `lora_scale` for each PEFT layer
517
+ scale_lora_layers(self, lora_scale)
518
+ else:
519
+ if attention_kwargs is not None and attention_kwargs.get("scale", None) is not None:
520
+ logger.warning(
521
+ "Passing `scale` via `attention_kwargs` when not using the PEFT backend is ineffective."
522
+ )
523
+
524
+ # 1. Condition, positional & patch embedding
525
+ batch_size = len(hidden_states)
526
+ is_hidden_states_tensor = isinstance(hidden_states, torch.Tensor)
527
+
528
+ if is_hidden_states_tensor:
529
+ assert hidden_states.ndim == 4
530
+ hidden_states = [_hidden_states for _hidden_states in hidden_states]
531
+
532
+ device = hidden_states[0].device
533
+
534
+ temb, text_hidden_states = self.time_caption_embed(timestep, text_hidden_states, hidden_states[0].dtype)
535
+
536
+ (
537
+ hidden_states,
538
+ ref_image_hidden_states,
539
+ img_mask,
540
+ ref_img_mask,
541
+ l_effective_ref_img_len,
542
+ l_effective_img_len,
543
+ ref_img_sizes,
544
+ img_sizes,
545
+ ) = self.flat_and_pad_to_seq(hidden_states, ref_image_hidden_states)
546
+
547
+ (
548
+ context_rotary_emb,
549
+ ref_img_rotary_emb,
550
+ noise_rotary_emb,
551
+ rotary_emb,
552
+ encoder_seq_lengths,
553
+ seq_lengths,
554
+ ) = self.rope_embedder(
555
+ freqs_cis,
556
+ text_attention_mask,
557
+ l_effective_ref_img_len,
558
+ l_effective_img_len,
559
+ ref_img_sizes,
560
+ img_sizes,
561
+ device,
562
+ )
563
+
564
+ # 2. Context refinement
565
+ for layer in self.context_refiner:
566
+ text_hidden_states = layer(text_hidden_states, text_attention_mask, context_rotary_emb)
567
+
568
+ combined_img_hidden_states = self.img_patch_embed_and_refine(
569
+ hidden_states,
570
+ ref_image_hidden_states,
571
+ img_mask,
572
+ ref_img_mask,
573
+ noise_rotary_emb,
574
+ ref_img_rotary_emb,
575
+ l_effective_ref_img_len,
576
+ l_effective_img_len,
577
+ temb,
578
+ )
579
+
580
+ # 3. Joint Transformer blocks
581
+ max_seq_len = int(max(seq_lengths))
582
+
583
+ attention_mask = hidden_states.new_zeros(batch_size, max_seq_len, dtype=torch.bool)
584
+ joint_hidden_states = hidden_states.new_zeros(batch_size, max_seq_len, self.config.hidden_size)
585
+ for i, (encoder_seq_len, seq_len) in enumerate(zip(encoder_seq_lengths, seq_lengths)):
586
+ encoder_seq_len = int(encoder_seq_len)
587
+ seq_len = int(seq_len)
588
+ attention_mask[i, :seq_len] = True
589
+ joint_hidden_states[i, :encoder_seq_len] = text_hidden_states[i, :encoder_seq_len]
590
+ joint_hidden_states[i, encoder_seq_len:seq_len] = combined_img_hidden_states[i, :seq_len - encoder_seq_len]
591
+
592
+ hidden_states = joint_hidden_states
593
+
594
+ for layer_idx, layer in enumerate(self.layers):
595
+ if torch.is_grad_enabled() and self.gradient_checkpointing:
596
+ hidden_states = self._gradient_checkpointing_func(
597
+ layer, hidden_states, attention_mask, rotary_emb, temb
598
+ )
599
+ else:
600
+ hidden_states = layer(hidden_states, attention_mask, rotary_emb, temb)
601
+
602
+ # 4. Output norm & projection
603
+ hidden_states = self.norm_out(hidden_states, temb)
604
+
605
+ p = self.config.patch_size
606
+ output = []
607
+ for i, (img_size, img_len, seq_len) in enumerate(zip(img_sizes, l_effective_img_len, seq_lengths)):
608
+ img_len = int(img_len)
609
+ seq_len = int(seq_len)
610
+ height, width = img_size
611
+ output.append(rearrange(hidden_states[i][seq_len - img_len:seq_len], '(h w) (p1 p2 c) -> c (h p1) (w p2)', h=height // p, w=width // p, p1=p, p2=p))
612
+ if is_hidden_states_tensor:
613
+ output = torch.stack(output, dim=0)
614
+
615
+ if USE_PEFT_BACKEND:
616
+ # remove `lora_scale` from each PEFT layer
617
+ unscale_lora_layers(self, lora_scale)
618
+
619
+ if not return_dict:
620
+ return output
621
+ return Transformer2DModelOutput(sample=output)