Repository navigation
Commit 8a08ecd
authored
Leave SDPA calls the Triton kernel cannot take to the regular CUDA lowering (pytorch#23349)
## What is wrong today
When the CUDA backend lowers a model, `ReplaceEdgeOpWithTritonOpPass`
swaps every `scaled_dot_product_attention` call for a Triton SDPA
kernel: the standard one, or split-K for long-cache decode. But those
kernels reject many calls that PyTorch accepts, and a rejected call
fails the whole export. For example:
```
RuntimeError: attn_mask must have dtype torch.bool
RuntimeError: Expected bfloat16 inputs
RuntimeError: attn_mask shape mismatch: expected [B=1, 1, L_q=8, L_kv=8], got torch.Size([1, 1, 1, 8])
RuntimeError: Head dimension must match across Q, K, V; got D_q=16, D_k=16, D_v=32.
RuntimeError: Causal masking requires L_q == L_kv; got L_q=4, L_kv=8.
```
The same happens with dropout, or a key/value batch or head count that
only broadcasts. The only way around it today is
`triton_kernel_mode="OFF"`, which also gives up the Triton kernels for
the calls they do support.
## What this change does
The pass still picks the kernel as before. It now runs that kernel's own
input checks on the fake tensors first (`_validate_sdpa_inputs`,
`_validate_qkv_shapes` and `_prepare_mask_params`, plus the standard
kernel's causal length rule), and replaces the call only if they pass.
Any other call stays in the graph, and the regular AOTInductor lowering
compiles it, as it does with `triton_kernel_mode="OFF"`. The pass logs
the kernel's own reason for each skipped call.
Because the pass asks the kernels instead of copying their rules, the
two cannot drift apart. Calls that were replaced before are still
replaced, with the same kernel. Masked decode and causal decode still
use split-K.
## What was tested
- New export tests in `test_sdpa_splitk_replacement.py` for a float
mask, float32 inputs, a broadcast mask, a batch-1 mask under batch 2,
dropout, a different value head size, a key/value batch of 1 under batch
2, one shared key/value head without `enable_gqa`, and causal attention
with different lengths. Each export now finishes and replaces no node;
each fails before this change. Exports with a full boolean mask still
replace the call, and masked decode, causal decode and decode with one
shared key/value head still use split-K on CUDA. Hand-built graphs cover
2D inputs and query, key and value passed by name.
- Removing any one of the kernel checks from the pass makes the matching
tests fail.
- The existing split-K replacement tests give the same result before and
after.
- Ran on a Linux aarch64 machine with a CUDA GPU.1 parent ecf5c39 commit 8a08ecd
3 files changed
Lines changed: 208 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
769 | 769 | | |
770 | 770 | | |
771 | 771 | | |
772 | | - | |
| 772 | + | |
773 | 773 | | |
774 | 774 | | |
775 | 775 | | |
| |||
929 | 929 | | |
930 | 930 | | |
931 | 931 | | |
932 | | - | |
933 | | - | |
| 932 | + | |
934 | 933 | | |
935 | 934 | | |
936 | 935 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | | - | |
10 | | - | |
11 | | - | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
12 | 13 | | |
13 | 14 | | |
| 15 | + | |
14 | 16 | | |
15 | 17 | | |
16 | 18 | | |
| |||
24 | 26 | | |
25 | 27 | | |
26 | 28 | | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
27 | 34 | | |
28 | 35 | | |
29 | 36 | | |
| |||
199 | 206 | | |
200 | 207 | | |
201 | 208 | | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
202 | 358 | | |
203 | 359 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
16 | 21 | | |
17 | 22 | | |
18 | 23 | | |
| |||
114 | 119 | | |
115 | 120 | | |
116 | 121 | | |
117 | | - | |
118 | 122 | | |
119 | 123 | | |
120 | 124 | | |
| |||
145 | 149 | | |
146 | 150 | | |
147 | 151 | | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
148 | 190 | | |
149 | 191 | | |
150 | 192 | | |
| |||
166 | 208 | | |
167 | 209 | | |
168 | 210 | | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
169 | 214 | | |
170 | 215 | | |
171 | 216 | | |
| |||
0 commit comments