diff --git a/conditioning/embeddings.py b/conditioning/embeddings.py index ca3f4fd..da33b4f 100644 --- a/conditioning/embeddings.py +++ b/conditioning/embeddings.py @@ -163,6 +163,8 @@ def get_attn_mask(img_size=64): def prepare_embeddings(conds, latent_shape, idxs, use_masked_att=False): batch_size, _, latent_height, latent_width = latent_shape + if idxs is None: + idxs = list(range(batch_size)) embeddings = create_zero_input_tensors( batch_size, latent_width, latent_height) if use_masked_att: diff --git a/conditioning/fusers_patch.py b/conditioning/fusers_patch.py index a58f023..69479d2 100644 --- a/conditioning/fusers_patch.py +++ b/conditioning/fusers_patch.py @@ -40,14 +40,7 @@ class FusersPatch(torch.nn.Module): self.idxs = idxs self.device = device - def _get_position_objs(self, extra_options): - idxs = None - if extra_options is not None: - if 'ad_params' in extra_options: - idxs = extra_options['ad_params']['sub_idxs'] - elif 'sub_idxs' in extra_options: - idxs = extra_options['sub_idxs'] - + def _get_position_objs(self, idxs): embeddings = prepare_embeddings( self.conds, self.latent_shape, idxs, True) for key in embeddings: @@ -55,10 +48,34 @@ class FusersPatch(torch.nn.Module): objs, drop_box_mask = self.positionnet(embeddings) return {'objs': objs, 'drop_box_mask': drop_box_mask} + def _get_idxs(self, extra_options): + idxs = None + if extra_options is not None: + if 'ad_params' in extra_options: + idxs = extra_options['ad_params']['sub_idxs'] + elif 'sub_idxs' in extra_options: + idxs = extra_options['sub_idxs'] + + return idxs + @torch.no_grad() def forward(self, x, extra_options): + print('--------', x.shape) block, idx = extra_options['block'] fuser_idx = block_map[block][idx] fuser = self.fusers_list[fuser_idx] - attn = fuser(x, self._get_position_objs(extra_options)) - return attn.to(torch.float16) + attn_total = [] + idxs = self._get_idxs(extra_options) + print('idxs', idxs) + for i in range(0, len(x), self.fusers_batch_size): + batch_idxs = idxs[i:i+self.fusers_batch_size] + x_idxs = list(range(i, i+self.fusers_batch_size)) + # print('batch_idxs', batch_idxs, x_idxs) + # print('x[x_idxs].shape', x[x_idxs].shape) + # print('doing attn') + attn = fuser(x[x_idxs], self._get_position_objs(batch_idxs)) + # print('attn.shape', attn.shape) + attn_total.append(attn) + attn_total = torch.cat(attn_total) + print(attn_total.shape) + return attn_total.to(torch.float16) diff --git a/nodes/instance_diffusion_tracking_prompt_node.py b/nodes/instance_diffusion_tracking_prompt_node.py index f30a9d9..197fe37 100644 --- a/nodes/instance_diffusion_tracking_prompt_node.py +++ b/nodes/instance_diffusion_tracking_prompt_node.py @@ -11,7 +11,7 @@ class InstanceDiffusionTrackingPromptNode: "tracking": ("TRACKING", ), "positionnet": ("POSITIONNET", ), "fusers": ("FUSERS", ), - "fusers_batch_size": ("INT", {"default": 5, "min": 0, "max": 10000, "step": 8}), + "fusers_batch_size": ("INT", {"default": 8, "min": 1, "max": 10000, "step": 1}), "positive_text": ("STRING", {"multiline": True}), "negative_text": ("STRING", {"multiline": True}), }}