fix the problem with infinite prompts where empty cond would be calculated incorrectly

This commit is contained in:
AUTOMATIC1111 2024-06-28 11:15:34 +03:00
parent 0b64633584
commit 179ae47d64
3 changed files with 10 additions and 11 deletions

View File

@ -177,12 +177,13 @@ class SD3Cond(torch.nn.Module):
self.weights_loaded = False self.weights_loaded = False
def forward(self, prompts: list[str]): def forward(self, prompts: list[str]):
lg_out, vector_out = self.model_lg(prompts) with devices.without_autocast():
lg_out, vector_out = self.model_lg(prompts)
token_count = lg_out.shape[1] token_count = lg_out.shape[1]
t5_out = self.model_t5(prompts, token_count=token_count) t5_out = self.model_t5(prompts, token_count=token_count)
lgt_out = torch.cat([lg_out, t5_out], dim=-2) lgt_out = torch.cat([lg_out, t5_out], dim=-2)
return { return {
'crossattn': lgt_out, 'crossattn': lgt_out,

View File

@ -47,8 +47,7 @@ class SD3Inferencer(torch.nn.Module):
return contextlib.nullcontext() return contextlib.nullcontext()
def get_learned_conditioning(self, batch: list[str]): def get_learned_conditioning(self, batch: list[str]):
with devices.without_autocast(): return self.cond_stage_model(batch)
return self.cond_stage_model(batch)
def apply_model(self, x, t, cond): def apply_model(self, x, t, cond):
return self.model(x, t, c_crossattn=cond['crossattn'], y=cond['vector']) return self.model(x, t, c_crossattn=cond['crossattn'], y=cond['vector'])

View File

@ -718,16 +718,15 @@ def get_empty_cond(sd_model):
p = processing.StableDiffusionProcessingTxt2Img() p = processing.StableDiffusionProcessingTxt2Img()
extra_networks.activate(p, {}) extra_networks.activate(p, {})
if hasattr(sd_model, 'conditioner'): if hasattr(sd_model, 'get_learned_conditioning'):
d = sd_model.get_learned_conditioning([""]) d = sd_model.get_learned_conditioning([""])
return d['crossattn']
else: else:
d = sd_model.cond_stage_model([""]) d = sd_model.cond_stage_model([""])
if isinstance(d, dict): if isinstance(d, dict):
d = d['crossattn'] d = d['crossattn']
return d return d
def send_model_to_cpu(m): def send_model_to_cpu(m):