Skip to content

MiniMax H3: SageAttention FP8 PV kernels produce noise above ~160k tokens on sm_120 #15263

Description

@AI4VFX

Edit 2026-08-09. Read this, the report below is old.

This works now on ComfyUI 0.31.1. 1920x1088, 15 s, sage on via the KJNodes node set to auto, 54 min against 94 with sage off. Same sage build as when it broke. Two things changed though, ComfyUI and my text encoder, so I'm not calling it fixed yet. More here.

If you're on 0.30.1 or older and getting noise on sm_120, update first.

Ignore the workaround I put here on 08-08. I said to use the KJNodes node on sageattn_qk_int8_pv_fp16_cuda. It doesn't work on sm_120, it aborts on the first attention call, and fp16_triton throws cudaErrorIllegalAddress. auto is the only mode that runs on that arch, and it isn't any of the entries under it in the dropdown. Table. Sorry if anyone tried it.

What it looked like on 0.30.1, counting tokens as ceil(frames/4) * (W/32) * (H/32), all on an RTX PRO 6000 with the bf16 models:

res duration frames tokens result
1920x832 15 s 362 142k clean
1920x1088 12 s 294 151k clean
1216x704 (2 pass) 30 s 736 154k clean
1920x1088 13 s 328 167k noise
1920x832 18 s 447 175k noise
1920x1088 15 s 362 186k noise

Clean under about 154k, noise from about 167k, nothing in between. The same 186k render with sage off was always fine, so the wall was never in H3.

Don't merge the one line fix below. It turns sage off for H3 everywhere, including Ampere where it works fine. @pepikir's breakdown is still the best account of what's going on.

The rest is the original report. The smooth_k theory in it is dead. The audio VAE bit still holds.


Summary

Running MiniMax H3 with --use-sage-attention produces pure noise in both the video and audio streams. Not degraded output — noise. The H3 DiT's attention call does not pass low_precision_attention=False, so it gets routed to attention_sage like any other model, and SageAttention's int8 QK path breaks it completely.

Every comparable model in the tree already opts out. H3 (added in #15224, merged as e2ab36d) appears to be the omission.

Expected vs actual

  • Expected: either correct output, or (like LTX) an automatic fallback to PyTorch attention.
  • Actual: 55 minutes of sampling → noise, no warning, no error.

Root cause

⚠️ Superseded, see the edit note at the top. The opt-out is not missing in any meaningful sense; the kernel selected on sm_120 is the actual fault.

comfy/ldm/modules/attention.py:550 provides the opt-out:

def attention_sage(q, k, v, heads, mask=None, attn_precision=None, skip_reshape=False, skip_output_reshape=False, **kwargs):
    if kwargs.get("low_precision_attention", True) is False or (mask is not None and not SAGE_ATTENTION_SUPPORTS_MASK):
        return attention_pytorch(q, k, v, heads, mask=mask, skip_reshape=skip_reshape, skip_output_reshape=skip_output_reshape, **kwargs)

Models that use it today:

File Line
comfy/ldm/lightricks/model.py 405 — comment: "sageattn mask support is unreliable"
comfy/ldm/audio/dit.py 433, 434, 437
comfy/ldm/audio/vae_sa3.py 141, 142, 145
comfy/ldm/ace/ace_step15.py 244
comfy/ldm/hunyuan3dv2_1/hunyuandit.py 346, 416
comfy/ldm/sam3/{sam,detector,tracker}.py several
comfy/image_encoders/dino3.py 97
comfy/ldm/triposplat/model.py 106

MiniMax H3 does not — comfy/ldm/minimax/model.py:181:

out = optimized_attention(q, k, v, self.heads, mask=None, skip_reshape=True, transformer_options=transformer_options)

Proposed fix (one line)

⚠️ Retracted, don't merge this. It would disable sage for H3 on every GPU and kernel, including the ones where it works. See the edit note at the top.

out = optimized_attention(q, k, v, self.heads, mask=None, skip_reshape=True,
                          low_precision_attention=False, transformer_options=transformer_options)

All attention backends (attention_basic, attention_sub_quad, attention_split, attention_xformers, attention_pytorch, attention_sage, attention_flash) declare **kwargs, so this is inert for every non-sage path — verified locally, no behavioural change with sage disabled.

I've applied this locally and it resolves the issue. Happy to open a PR if useful.

Evidence that the fault is in the DiT, not the VAEs

Worth recording, since it rules out a decode-side explanation:

Decoder Attention call Sage-swapped?
Video VAE comfy/ldm/minimax/vae.py:239 optimized_attention(...) yes
Audio VAE comfy/ldm/minimax/audio_vae.py:247 comfy.ops.scaled_dot_product_attention(...) no

The audio VAE never imports optimized_attention, so --use-sage-attention cannot have affected it — yet the audio output was still noise. The audio latent was therefore already corrupt leaving the sampler, placing the fault upstream of both decoders in the DiT's attention.

(This part still holds.)

Possible contributing factor

⚠️ Retracted. @pepikir probed this directly and smooth_k=True vs False gave identical relative error, so it isn't the trigger.

comfy/ldm/modules/attention.py:573 hardcodes smooth_k=False:

sage_kwargs = {"is_causal": False, "tensor_layout": tensor_layout, "sm_scale": kwargs.get("scale", None), "smooth_k": False}

SageAttention's own default is smooth_k=True, and channel-wise mean subtraction of K before int8 quantization is what its paper credits for keeping int8 QK accurate. H3's attention (model.py:156-181) applies QK-RMSNorm plus a partial rope (rot = rope_freqs.shape[-3] * 2, 96 of 128 dims rotated), which leaves rotated and unrotated channels with markedly different statistics — the kind of channel-wise outlier structure smooth_k exists to handle. Speculative and not instrumented; the opt-out above makes it moot for H3, but it may explain why other models needed the same escape hatch.

Reproduction

  • ComfyUI v0.30.1, torch 2.11.0+cu130, Python 3.13, Windows 11
  • RTX PRO 6000 Blackwell (96 GB), sageattention installed
  • minimax_h3_fl2va_bf16.safetensors + qwen3vl_32b_minimax_h3_bf16.safetensors
  • MiniMaxH3ImageToVideoBasicGuiderSamplerCustomAdvanced (res_multistep, 20 steps), 1920x1088, 362 frames
  • Launch with --fast-disk --use-sage-attention → noise.
  • Identical graph and seed without --use-sage-attention → correct output.

Same seed both runs, so the two are directly comparable.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions