Gligen fails with directml backend + --use-split-cross-attention
- Dominant language
- Python
- Stars
- 133k
- Forks
- 15.7k
- Avg merge
- 1d 7h
- Merged PRs (30d)
- 158
Description
Because memory management with directml currently... well, doesn't exist, I'd been running with --use-split-cross-attention. I can't recall if quadratic was slower or if I was hitting OOM or both, doesn't really matter. The issue seems to be the if block at line 310 of comfy/ldm/modules/attention.py
```python
if _ATTN_PRECISION =="fp32":
with torch.autocast(enabled=False, device_type = 'cuda'):
s1 = einsum('b i d, b j d -> b i j', q[:, i:end].float(), k.float()) * self.scale
else:
s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * self.scale
```
In the
This outputs an enormous stack trace when it hits the KSampler node, but the main problem seems to be assigning the CUDA device type to whatever it is autocast produces in CrossAttentionDoggettx then calling Einsum with no CUDA backend; the einsum implementation is in the native libs and I'm not about to go digging around there, so I'm just guessing it throws the invalid parameter error at the end of the stack trace when it can't find a backend. Similar code exists in the regular CrossAttention class but I don't know when that's used. Quadratic and Pytorch are missing these problems
I don't know why Gligen was the first thing that triggered this issue for me, I was able to generate images via multiple other example methods fine without it (and indeed the same node tree with gligen bypassed still works, so it's not a recent code change).
I switched to pytorch cross attention and was able to generate a 1280x768 image (no upscaling) so it might be a better option than quadratic for AMD. I'll have to try the SDXL workflow with it to see how it handles that, it would OOM with split cross attention on 1024x1024 base followed by 1536x1536 latent upscale and refiner about 30% of the time
```
Traceback (most recent call last):
File "C:\Programs\ComfyUI\execution.py", line 151, in recursive_execute
output_data, output_ui = get_output_data(obj, input_data_all)
File "C:\Programs\ComfyUI\execution.py", line 81, in get_output_data
return_values = map_node_over_list(obj, input_data_all, obj.FUNCTION, allow_interrupt=True)
File "C:\Programs\ComfyUI\execution.py", line 74, in map_node_over_list
results.append(getattr(obj, func)(**slice_dict(input_data_all, i)))
File "C:\Programs\ComfyUI\nodes.py", line 1206, in sample
return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)
File "C:\Programs\ComfyUI\nodes.py", line 1176, in common_ksampler
samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,
File "C:\Programs\ComfyUI\comfy\sample.py", line 88, in sample
samples = sampler.sample(noise, positive_copy, negative_copy, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)
File "C:\Programs\ComfyUI\comfy\samplers.py", line 720, in sample
samples = getattr(k_diffusion_sampling, "sample_{}".format(self.sampler))(self.model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar)
File "C:\Programs\Python310\lib\site-packages\torch\utils\_contextlib.py", line 115, in decorate_context
return func(*args, **kwargs)
File "C:\Programs\ComfyUI\comfy\k_diffusion\sampling.py", line 613, in sample_dpmpp_2m_sde
denoised = model(x, sigmas[i] * s_in, **extra_args)
File "C:\Programs\Python310\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Programs\ComfyUI\comfy\samplers.py", line 323, in forward
out = self.inner_model(x, sigma, cond=cond, uncond=uncond, cond_scale=cond_scale, cond_concat=cond_concat, model_options=model_options, seed=seed)
File "C:\Programs\Python310\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Programs\ComfyUI\comfy\k_diffusion\external.py", line 125, in forward
eps = self.get_eps(input * c_in, self.sigma_to_t(sigma), **kwargs)
File "C:\Programs\ComfyUI\comfy\k_diffusion\external.py", line 151, in get_eps
return self.inner_model.apply_model(*args, **kwargs)
File "C:\Programs\ComfyUI\comfy\samplers.py", line 311, in apply_model
out = sampling_function(self.inner_model.apply_model, x, timestep, uncond, cond, cond_scale, cond_concat, model_options=model_options, seed=seed)
File "C:\Programs\ComfyUI\comfy\samplers.py", line 289, in sampling_function
cond, uncond = calc_cond_uncond_batch(model_function, cond, uncond, x, timestep, max_total_area, cond_concat, model_options)
File "C:\Programs\ComfyUI\comfy\samplers.py", line 263, in calc_cond_uncond_batch
output = model_function(input_x, timestep_, **c).chunk(batch_chunks)
File "C:\Programs\ComfyUI\comfy\model_base.py", line 61, in apply_model
return self.diffusion_model(xc, t, context=context, y=c_adm, control=control, transformer_options=transformer_options).float()
File "C:\Programs\Python310\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Programs\ComfyUI\comfy\ldm\modules\diffusionmodules\openaimodel.py", line 620, in forward
h = forward_timestep_embed(module, h, emb, context, transformer_options)
File "C:\Programs\ComfyUI\comfy\ldm\modules\diffusionmodules\openaimodel.py", line 58, in forward_timestep_embed
x = layer(x, context, transformer_options)
File "C:\Programs\Python310\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Programs\ComfyUI\comfy\ldm\modules\attention.py", line 695, in forward
x = block(x, context=context[i], transformer_options=transformer_options)
File "C:\Programs\Python310\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Programs\ComfyUI\comfy\ldm\modules\attention.py", line 527, in forward
return checkpoint(self._forward, (x, context, transformer_options), self.parameters(), self.checkpoint)
File "C:\Programs\ComfyUI\comfy\ldm\modules\diffusionmodules\util.py", line 123, in checkpoint
return func(*inputs)
File "C:\Programs\ComfyUI\comfy\ldm\modules\attention.py", line 601, in _forward
x = p(x, extra_options)
File "C:\Programs\ComfyUI\comfy\gligen.py", line 269, in func
return module(x, objs)
File "C:\Programs\Python310\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Programs\ComfyUI\comfy\gligen.py", line 115, in forward
x = x + self.scale * torch.tanh(self.alpha_attn) * self.attn(
File "C:\Programs\Python310\lib\site-packages\torch\nn\modules\module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Programs\ComfyUI\comfy\ldm\modules\attention.py", line 312, in forward
s1 = einsum('b i d, b j d -> b i j', q[:, i:end].float(), k.float()) * self.scale
File "C:\Programs\Python310\lib\site-packages\torch\functional.py", line 378, in einsum
return _VF.einsum(equation, operands) # type: ignore[attr-defined]
RuntimeError: The parameter is incorrect.
```
Contributor guide
Assessment
This issue has not been assessed yet.