[Fix] Stamp sequence-parallel state on dummy forward batches (#38564)

Co-authored-by: pranjalssh <pranjalssh@fb.com>
This commit is contained in:
Pranjal Shankhdhar
2026-09-09 01:03:03 -07:00
committed by GitHub
co-authored by pranjalssh
parent 13469c16d3
commit 35df2fecde
2 changed files with 37 additions and 0 deletions
@@ -1508,6 +1508,10 @@ class ModelRunner:
def prepare_dummy_forward_batch(self, forward_batch: ForwardBatch) -> ForwardBatch:
"""Customize a runner-created dummy batch before attention metadata initialization."""
# Dummy runs bypass the MLP-sync/scatter passes that stamp real batches.
forward_batch.attn_tp_sequence_sharded = self.attn_tp_sequence_sharded(
forward_batch._forward_num_tokens()
)
return forward_batch
def attn_tp_sequence_sharded(self, num_tokens: int) -> bool:
@@ -107,6 +107,39 @@ class TestPrefillCudaGraphRunnerChunkedPrefix(CustomTestCase):
self.assertTrue(runner.attn_tp_sequence_sharded(num_tokens=4))
mock_require_gathered_buffer.assert_called_once_with()
def test_dummy_batch_sharding_tracks_forward_token_width(self):
"""Warmup must use the runner's SP policy, including embedding widths."""
class TokenGatedRunner(ModelRunner):
def attn_tp_sequence_sharded(self, num_tokens):
return num_tokens == 4
runner = TokenGatedRunner.__new__(TokenGatedRunner)
for num_ids, num_embeds, expected in (
(4, None, True),
(5, None, False),
(5, 4, True),
(4, 5, False),
(0, None, False),
):
with self.subTest(num_ids=num_ids, num_embeds=num_embeds):
batch = ForwardBatch(
forward_mode=ForwardMode.EXTEND,
batch_size=1,
input_ids=torch.arange(num_ids),
input_embeds=(
torch.empty(num_embeds, 8) if num_embeds is not None else None
),
req_pool_indices=torch.tensor([0]),
seq_lens=torch.tensor([num_ids]),
out_cache_loc=torch.arange(num_ids),
seq_lens_sum=num_ids,
attn_tp_sequence_sharded=not expected,
)
self.assertIs(runner.prepare_dummy_forward_batch(batch), batch)
self.assertEqual(batch.attn_tp_sequence_sharded, expected)
def test_low_free_memory_still_captures_prefill_graph(self):
eager_runner = object()
prefill_runner = object()