Skip to content

[distributed] Context parallelism: padding masks, sliding windows and chunked attention with sdpa - #50516

Closed
3outeille wants to merge 2 commits into
cp-7-auto-padfrom
cp-8-masks
Closed

3outeille wants to merge 2 commits into
cp-7-auto-padfrom
cp-8-masks

Conversation

@3outeille

@3outeille 3outeille commented Nov 9, 2026 •

Copy link
Copy Markdown
Member

🤗 Transformers CI

What does this PR do?

Stack: #50493 → #50496 → #50511 → #50514 → #50515 → this PR → #50499 → #50521 (Trainer) → #50522 (docs)

After the all-to-all, attention sees the whole sequence, so the mask of the whole sequence can be rebuilt there. This PR rebuilds it with the masking_utils mask functions, so it matches what the model builds on an unsharded run. That lifts three refusals:

  • Padded batches: a 2D attention_mask is kept for the full sequence. sdpa gets the full mask. Flash kernels get the 2D mask and unpad, as on an unsharded run. 4D masks are still refused.
  • Sliding windows with sdpa: each layer's window comes from the sliding_window the model passes to the attention call, else module.sliding_window, else the config for layers that layer_types marks as sliding.
  • Chunked attention (llama4) with sdpa. It is still refused with flash kernels.

With sdpa, the whole-sequence mask takes batch × seq × seq booleans, so a flash kernel is the better choice for long sequences (the docs PR says so).

Tests

tests/context_parallel, CPU (gloo). Loss, logits slice and every gradient match an unsharded run for: right and left padding, a sliding window with sdpa (unpacked and packed), a gemma3-style layer_types mix, chunked attention, and padding combined with the automatic padding to a multiple of cp_size.

CP test from #50499 on every causal LM, with the tester configs unchanged:

result classes
pass (plain and packed) 60, now including the sliding-window models (gemma3, mistral, cohere2, ministral, olmo3, exaone4, mellum, gemma4_unified, ...)
fail afmoe packed and hrm_text (both fail on an unsharded or FSDP-only run too, see #50499), gemma4_text (float32 rounding of the embedding gradient; passes at atol=1e-4)

On 2× H100 (Qwen3-0.6B, bf16), CP gives the same loss and logits as an unsharded run for batches with left and right padding (sdpa and the FA3 hub kernel), and for alternating sliding-window layers with sdpa, unpacked and packed.

…Ulysses context parallelism

The all-to-all gathers the sequence before every attention call, so the mask of the whole sequence can be built there
from transformers' own mask primitives: causal, packed documents, padding, sliding window and chunked attention.

- `_shard_inputs` keeps the full 2D padding mask on the implementation and passes `attention_mask=None` to the model.
- `UlyssesCP.attention` rebuilds the `sdpa` mask for the whole sequence, or returns `None` when it is plain causal so
  that the kernel relies on `is_causal`.
- flash kernels get the full 2D mask, which unpads and rebuilds the sequence boundaries.
- `UlyssesCP.check` only refuses sliding-window layers whose window is not visible at the attention call, and
  `chunked_attention` layers with a flash kernel.
…h context parallelism

- the mask rebuilt over the whole sequence is compared with the one the model builds on an unsharded run, for causal,
  packed, padded, sliding-window and chunked attention;
- right and left padding batches, a sliding-window model, a mix of sliding and full layers, and a chunked model are
  compared with the same weights on full sequences (loss, this rank's logits, every gradient);
- the flash padding test runs on 2 GPUs with `require_flash_attn`;
- the checks now accept sliding windows and chunked attention with `sdpa`, and refuse what they cannot rebuild.
@HuggingFaceDocBuilderDev

Copy link
Copy Markdown

The docs for this PR live here. All of your documentation changes will be reflected on that endpoint. The docs are available until 30 days after the last update.

@3outeille

Copy link
Copy Markdown
Member Author

Not needed any more: with the plan-based rewrite the model builds its own masks over the whole sequence, so padding masks, sliding windows and chunked attention work without context parallel code (now tested in #50496).

@3outeille 3outeille closed this Nov 10, 2026
@3outeille
3outeille deleted the cp-8-masks branch November 10, 2026 02:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants