Skip to content

Commit fa47379

Browse files
committed
Quality
Signed-off-by: Fynn Schmitt-Ulms <fschmitt@redhat.com>
1 parent d03dab2 commit fa47379

8 files changed

Lines changed: 29 additions & 41 deletions

File tree

src/speculators/models/dflash/attention.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def create_anchor_block_mask_mod(
2929
- may not attend to other synthetic blocks or later base tokens
3030
3131
Args:
32-
document_ids: [total_seq_len] maps each position to its document index, -1 for padding
32+
document_ids: [total_seq_len] maps each position to its doc index, pad -1
3333
total_seq_len: padded packed sequence width
3434
anchor_positions: [n_anchors] absolute positions into the packed base sequence
3535
block_size: number of query tokens per anchor block

src/speculators/models/dflash/core.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import functools
21
from typing import ClassVar
32

43
import torch

src/speculators/models/dflash/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ def select_anchors(
5555
k = min(num_anchors, valid_indices.numel())
5656

5757
# Constrain value of k for torch dynamo
58-
torch._check(k <= valid_indices.numel())
59-
torch._check(k >= 0)
58+
torch._check(k <= valid_indices.numel()) # noqa: SLF001
59+
torch._check(k >= 0) # noqa: SLF001
6060

6161
perm = torch.randperm(valid_indices.numel(), device=loss_mask.device)
6262
anchors[:k] = torch.gather(valid_indices, 0, perm[:k])

src/speculators/models/eagle3/core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def load_verifier_weights(self):
129129
)
130130

131131
@conditional_torch_compile
132-
def forward( # noqa: C901
132+
def forward(
133133
self,
134134
hidden_states: torch.Tensor, # shape: [1, total_seq_len, 3 * hidden_size]
135135
input_ids: torch.Tensor, # shape: [1, total_seq_len]

src/speculators/models/peagle/core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def forward(
6565
Args:
6666
hidden_states: Verifier hidden states [batch, seq_len, 3*hidden_size]
6767
input_ids: Input token IDs [batch, seq_len]
68-
document_ids: Document IDs [1, seq_len], maps positions to document index, -1 for padding
68+
document_ids: Document IDs [1, seq_len], maps positions to doc index, pad -1
6969
position_ids: Position IDs [batch, seq_len] (optional)
7070
loss_mask: Loss mask for which tokens to compute loss on
7171
[batch, seq_len]

src/speculators/models/utils.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import functools
21
import warnings
32
from functools import partial
43

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
"""Unit tests for the DFlash anchor-block attention mask."""
22

3-
import pytest
43
import torch
54
from torch.nn.attention.flex_attention import create_mask
65

76
from speculators.models.dflash.attention import create_anchor_block_mask_mod
87

98

9+
def _lengths_to_document_ids(lengths, total_seq_len):
10+
document_ids = torch.full((total_seq_len,), -1, dtype=torch.long)
11+
document_ids[: lengths.sum()] = torch.repeat_interleave(
12+
torch.arange(lengths.shape[0], dtype=torch.long), lengths
13+
)
14+
return document_ids
15+
16+
1017
def _reference_dense_from_mask_mod(
11-
lengths,
18+
document_ids,
1219
total_seq_len,
1320
anchor_positions,
1421
block_size,
@@ -17,7 +24,7 @@ def _reference_dense_from_mask_mod(
1724
):
1825
"""Ground truth: evaluate the flex mask_mod element-wise over the q x kv grid."""
1926
mask_mod, q_len, kv_len = create_anchor_block_mask_mod(
20-
lengths=lengths,
27+
document_ids=document_ids,
2128
total_seq_len=total_seq_len,
2229
anchor_positions=anchor_positions,
2330
block_size=block_size,
@@ -33,15 +40,15 @@ def _reference_dense_from_mask_mod(
3340

3441

3542
def _dense_from_create_mask(
36-
lengths,
43+
document_ids,
3744
total_seq_len,
3845
anchor_positions,
3946
block_size,
4047
sliding_window=None,
4148
sliding_window_non_causal=False,
4249
):
4350
mask_mod, q_len, kv_len = create_anchor_block_mask_mod(
44-
lengths=lengths,
51+
document_ids=document_ids,
4552
total_seq_len=total_seq_len,
4653
anchor_positions=anchor_positions,
4754
block_size=block_size,
@@ -54,7 +61,7 @@ def _dense_from_create_mask(
5461
H=None,
5562
Q_LEN=q_len,
5663
KV_LEN=kv_len,
57-
device=lengths.device,
64+
device=document_ids.device,
5865
)
5966

6067

@@ -63,13 +70,14 @@ def test_create_mask_matches_mask_mod_full_attention():
6370
device = torch.device("cpu")
6471
total_seq_len, block_size = 16, 4
6572
lengths = torch.tensor([10, 6]) # two packed documents summing to total_seq_len
73+
document_ids = _lengths_to_document_ids(lengths, total_seq_len)
6674
anchor_positions = torch.tensor([3, 8, 12])
6775

6876
ref = _reference_dense_from_mask_mod(
69-
lengths, total_seq_len, anchor_positions, block_size
77+
document_ids, total_seq_len, anchor_positions, block_size
7078
)
7179
dense = _dense_from_create_mask(
72-
lengths.to(device), total_seq_len, anchor_positions, block_size
80+
document_ids.to(device), total_seq_len, anchor_positions, block_size
7381
)
7482

7583
assert dense.shape == (1, 1, ref.shape[0], ref.shape[1])
@@ -81,18 +89,19 @@ def test_create_mask_matches_mask_mod_sliding_window():
8189
device = torch.device("cpu")
8290
total_seq_len, block_size = 16, 4
8391
lengths = torch.tensor([16]) # single document
92+
document_ids = _lengths_to_document_ids(lengths, total_seq_len)
8493
anchor_positions = torch.tensor([5, 9, 14])
8594
sliding_window = 4
8695

8796
ref = _reference_dense_from_mask_mod(
88-
lengths,
97+
document_ids,
8998
total_seq_len,
9099
anchor_positions,
91100
block_size,
92101
sliding_window=sliding_window,
93102
)
94103
dense = _dense_from_create_mask(
95-
lengths.to(device),
104+
document_ids.to(device),
96105
total_seq_len,
97106
anchor_positions,
98107
block_size,
@@ -107,32 +116,11 @@ def test_create_mask_each_query_sees_its_own_block():
107116
device = torch.device("cpu")
108117
total_seq_len, block_size = 12, 4
109118
lengths = torch.tensor([12])
119+
document_ids = _lengths_to_document_ids(lengths, total_seq_len)
110120
anchor_positions = torch.tensor([2, 7, 10])
111121

112122
dense = _dense_from_create_mask(
113-
lengths.to(device), total_seq_len, anchor_positions, block_size
123+
document_ids.to(device), total_seq_len, anchor_positions, block_size
114124
)
115125

116126
assert bool(dense[0, 0].any(dim=-1).all())
117-
118-
119-
def test_mask_mod_rejects_lengths_overflow():
120-
"""sum(lengths) > total_seq_len raises."""
121-
with pytest.raises(ValueError, match="exceeds total_seq_len"):
122-
create_anchor_block_mask_mod(
123-
lengths=torch.tensor([10, 10]), # sum = 20 > total_seq_len
124-
total_seq_len=16,
125-
anchor_positions=torch.tensor([3, 8]),
126-
block_size=4,
127-
)
128-
129-
130-
def test_mask_mod_rejects_out_of_range_anchor():
131-
"""anchor_positions outside [0, total_seq_len) raises."""
132-
with pytest.raises(ValueError, match="out of range"):
133-
create_anchor_block_mask_mod(
134-
lengths=torch.tensor([16]),
135-
total_seq_len=16,
136-
anchor_positions=torch.tensor([3, 20]), # 20 >= total_seq_len
137-
block_size=4,
138-
)

tests/unit/train/test_eagle3_attention.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ def test_diagonal_draft_tokens_mask_mod(lengths):
5050
document_ids = torch.repeat_interleave(
5151
torch.arange(lengths.shape[0], dtype=torch.long), lengths
5252
)
53-
mask_mod = create_combined_mask_mod(document_ids, total_seq_len=lengths.sum().item())
53+
mask_mod = create_combined_mask_mod(
54+
document_ids, total_seq_len=lengths.sum().item()
55+
)
5456

5557
N = lengths.sum().item()
5658

0 commit comments

Comments
 (0)