Commit Graph
1368 Commits
Author SHA1 Message Date
George HotzandGitHub 60cc1d7827 add Ops.RETURNED, remove TUPLE/GETTUPLE (#17804)
* delete Ops.FUNCTION/GETTUPLE/TUPLE: call outputs are AFTER on RETURNED placeholders

value-producing calls: the body is a plain parametric program that stores outputs
into output PARAMs (slots after the input PARAMs). the RETURNED placeholders are
inputs to the call, bound to the output PARAMs positionally wherever the call is
resolved, and callers AFTER on them like normal buffers. gradient flows through
the generic AFTER rule; everything is just Ops.CALL.

* RETURNED identity is its placement in the call srcs, not a nonce

slot=-1 merging collapses duplicate-signature outputs into one uop (t+1,t+2 grads
and multi-grad backward calls dedupe wrongly), and skipping the uop cache breaks
schedule_cache (stale linear hits since structural keys assume interning). instead
the RETURNED's placement (output index among call srcs) is its identity: identical
call constructions merge deterministically, positions never collide.

* resolve RETURNED afters in the tensor graph like values (master parity with gettuple)

- remove the CONTIGUOUS wrap of tagged call-output afters, it forced call outputs
  (e.g. local shard amax) into their own buffer/kernel instead of inlining
- inline RETURNED afters at transform time via returned_after_finalize, dissolving
  to values for consumers; calls with bound-variable or unresolved UNSHARD args
  keep the schedule-time resolution path
- allow movement ops (flat-storage views) in kernel graph value positions in the spec
- port embedding backward + extra/llama_kernels (local_abs_max, rmsnorm) to the new API

* use SINK, not GROUP, for gradient value containers

spec.py only blesses GROUP of stores/groups/loops; the gradient value bundles
(the forward values, root_grad seeds, and the after->call gradient edge) are
plain value containers, and SINK-of-values is already in the spec.

also fix extra/llama_kernels/rmsnorm: returned_outputs is a property

* CALL is positional: RETURNS work in any src position, convention lives in call_outputs

- all resolution paths (gradient, precompile transform, binding) locate RETURNEDs
  by identity, not by "last srcs"; only call_outputs builds the args-first layout
- grad_fxn padding aligns grads with the call's actual src positions
- add test_two_return/precompiled

* source-compat shim for maketuple/gettuple so foreign code built before the redesign keeps working

UOp.maketuple returns a _LegacyTupleValues holder; .call builds call_outputs;
CALL.gettuple(i) is returned_outputs[i]. the produced graphs are identical to
the new-api versions, so nn/extra/mlperf code is reverted to upstream text

* simplify function.py call construction + drop the resolved-call cache

- function.py: single and tuple returns both build the call through call_outputs
- tensor.py: resolve_function is deterministic and interned, the global cache was unneeded

* bind zero-offset views of flat storage to the storage instead of padding them

call args need offset 0 and enough length, not views: flat_storage collapses the
zero-offset contiguous view chain to the sized storage base, so resolved call args
are storage-bare like master (no PAD/SHRINK chains in the kernel graph)

* spec.py: drop stray rebase-collision edits, keep only the RETURNED changes

* test_multitensor: revert to master, the gettuple shim covers it

* materialize all tagged RETURNED afters into real buffers

call outputs need real storage regardless of whether they are finals of the current
realize: deferred/stateful outputs (the fp8 grad-amax mailbox) are consumed by later
realize steps as call args, where a resolved value would have no ranges

* call input buffers: wrap RETURNED-based afters, not real-buffer afters

precompiled call input binding kept any AFTER unwrapped; an AFTER on a RETURNED
placeholder has no storage behind it, so its value leaked into the kernel graph with
no consumer able to register ranges (llama3 8B fp8 mailbox pipeline crash).
materialize afters whose base has no buffer identity instead.

this was the fix matching master for the REDUCE-has-no-ranges crash and restores
the llama-kernels amax kernel count

* call slots are src positions, always; never rearrange

one upstream cause behind the three P1 findings: the raw CALL machinery binds
positionally (resolve_function params, gradient padding) but a second args-first
convention crept in where RETURNEDs get moved to trailing slots. position is
identity now:

- transform_precompiled_call keeps RETURNEDs' original src positions: outs take
  their places, other args become input buffers; no slot renumbering
- implicit gradients are emitted aligned to original src positions (None at
  RETURNED positions)
- flat_storage drops the hand-rolled contiguity analysis: reshape itself is the
  flat-prefix check (it raises ValueError); strided views materialize first

* nits on call slot positions; regression tests for interspersed RETURNED

- flat_storage back to pad_to().reshape() (reshape keeps movement views, it is not a contiguity check)
- input_buffer checks has_buffer_identity(after_ok=True)
- TestArgOrder: interspersed RETURNED (plain + precompiled transform), its gradient,
  padded and strided function inputs

* device fixes

* TestArgOrder: padded regression uses zero-start padded/shrunk view

* TestArgOrder: clone to force buffer identity in padded/strided regression tests

* slim: revert prepare formatting, drop reverted-bug tests, restore viz guards, clean comments, mirror returned on param

* gut transform_precompiled_call, delete returned_after_finalize

the transform keeps master's shape; the prepare-stage resolve_AFTER rule already
inlines plain call outputs, and materialization is owned by the input-buffer rule
(afters on real buffers bind, afters on RETURNEDs contiguous)

* update spec for returned

* transform_precompiled_call: inline the input-buffer rule, drop sorted() (body stores are already slot-ordered)

* drop dead RETURNED-era rules: prepare's after-shell strip (leftover from returned_after_finalize, which is gone), redundant pattern-covered SINK check, defensive slot-sorts (bodies are slot-ordered by construction)

* drop final_tags: final outputs of value calls materialize at sink construction

The set of finals is already known precisely (the big_sink's srcs), so track
nothing: wrap each final AFTER-on-RETURNED in CONTIGUOUS right after numbering.
Precompiled calls are excluded - transform_precompiled_call in the flatten
pass gives their outputs real buffers, and wrapping before that transform
leaves a stale tag that breaks the output copy.

* drop unused default_dtype import
2026-08-31 08:51:49 -07:00
b1tgandGitHub af079e8cc8 llm: fix q6k fastpath (#17847) 2026-08-31 06:55:37 -07:00
chenyuandGitHub 85841ce0d1 more const cast cleanups [PR] (#17854) 2026-08-30 15:33:59 -04:00
f5b00de319 fix weak const promote dropping the movement ops (#17846)
Co-authored-by: chenyu <[email protected]>
2026-08-30 13:17:26 -04:00
chenyuandGitHub 902a1efe06 Revert "fix promote weak in _broadcasted [pr] (#17849)" (#17851)
This reverts commit 9c49e35aab.
2026-08-30 13:09:36 -04:00
chenyuandGitHub 9c49e35aab fix promote weak in _broadcasted [pr] (#17849) 2026-08-30 12:38:18 -04:00
chenyuandGitHub 1a5a364f3e weak dtype overflow touchups [pr] (#17843)
* weak dtype overflow touchups [pr]

* one more
2026-08-29 21:25:41 -04:00
chenyuandGitHub 0bd725376b fix weak const overflow with movements [pr] (#17840)
* fix weak const overflow with movements [pr]

* fix
2026-08-29 17:38:45 -04:00
George HotzandGitHub 812d5cef62 delete Ops.FUNCTION (#17824)
* delete Ops.FUNCTION: value-producing calls are just CALLs with a TUPLE body

a CALL with a TUPLE body (always void dtype) is value-producing and gradient-able,
outputs are extracted with GETTUPLE like before; all other CALLs are opaque.
TUPLE/GETTUPLE are untouched

* match the TUPLE body in the UPat, not in the rewrite

* remove FUNCTION from tinyspec (regen pdf) and viz

* fix and spec
2026-08-28 15:54:58 -07:00
chenyuandGitHub 086f45cb81 dtype is not a UOp field anymore (#17821) 2026-08-28 16:17:29 -04:00
Joel LisenbyandGitHub 7fdc58b1cc add support for UD quants (#17806) 2026-08-28 09:38:34 -07:00
George HotzandGitHub 6b361e4de7 move shape into arg for param/buffer (#17783)
* move shape into arg for param/buffer

* no param_from_shape

* drop gratuitous syntax changes

* image is a in-graph view, folded into the param arg at render; drop dead multi param sharding

* view_as helper, simpler resolve_function, spec update

* spec: param/buffer are flat storage, no shape input

* image dims live in the param arg from transform_to_image; tighten kernel graph spec

* kernel graph spec: only RESHAPE/SHRINK over storage values, not all movement

* kernel graph: call args are storage, not views (pm_no_view_args); assert in spec

* strip views at the kernel graph level (pm_no_views), move into rangeify

* touchups
2026-08-27 18:13:24 -07:00
geohot ee3161e924 hotfix: decrease dims in test_attention to get below the 90s limit
Unit Tests / Models (push) Successful in 1m43s
Unit Tests / Linters (push) Successful in 1m57s
Unit Tests / Linux (DSP) (push) Successful in 2m2s
Unit Tests / Test LLM (push) Failing after 2m29s
Unit Tests / Fuzzing (push) Successful in 2m30s
Unit Tests / Docs (push) Successful in 2m51s
Unit Tests / hcq2 (push) Successful in 3m0s
Unit Tests / AMD ASM IDE (push) Successful in 3m6s
Unit Tests / Python Backend (push) Successful in 3m15s
Unit Tests / openpilot Compile Tests (push) Successful in 3m19s
Unit Tests / Null Tests (push) Successful in 3m22s
Unit Tests / Unit Tests (push) Successful in 3m23s
Unit Tests / Torch Backend Training (push) Successful in 3m26s
Unit Tests / CL IMAGE Tests (push) Successful in 3m37s
Unit Tests / Linux (DEV=CPU:X86) (push) Successful in 3m36s
Unit Tests / SPEC=2 (2) (push) Successful in 3m58s
Unit Tests / Linux (amdllvm gfx1100) (push) Successful in 3m52s
Unit Tests / Linux (DEV=CPU:LVP) (push) Successful in 3m54s
Unit Tests / Linux (amdllvm gfx1201) (push) Successful in 4m0s
Unit Tests / SPEC=2 (1) (push) Successful in 4m9s
Unit Tests / Linux (DEV=CPU:LLVM) (push) Successful in 4m8s
Unit Tests / Optimization Tests (push) Successful in 4m18s
Unit Tests / Linux (am) (push) Successful in 4m16s
Unit Tests / Linux (DEV=CL) (push) Successful in 4m19s
Unit Tests / Torch Backend Tests (push) Successful in 4m25s
Unit Tests / Linux (amd gfx1100) (push) Successful in 4m19s
Unit Tests / ONNX (CPU) Tests (push) Failing after 4m26s
Unit Tests / Linux (amd gfx1201) (push) Successful in 4m22s
Unit Tests / Linux (DEV=WEBGPU) (push) Successful in 4m24s
Unit Tests / Compile-only (DEV=NULL:NAK:sm_120) (push) Successful in 1m44s
Deploy Docs / deploy (push) Successful in 4m52s
Unit Tests / Linux (DEV=CPU:CLANG) (push) Successful in 4m54s
Unit Tests / Compile-only (DEV=NULL:IR3:a630) (push) Successful in 2m31s
Unit Tests / Linux (amdllvm gfx950) (push) Successful in 3m31s
Unit Tests / Linux (ptx) (push) Successful in 3m25s
Unit Tests / Linux (nv) (push) Successful in 4m17s
Unit Tests / Linux (amd gfx950) (push) Successful in 4m59s
Unit Tests / Compile-only (DEV=NULL:QCOMCL:a630) (push) Successful in 4m29s
Autogen / In-tree Autogen (push) Successful in 12m31s
Autogen / In-tree Autogen (macos) (push) Canceled after 0s
Benchmarks / Mac pytest (push) Canceled after 0s
Benchmarks / LLM (DEV=AMD) (push) Canceled after 0s
Benchmarks / LLM (DEV=METAL) (push) Canceled after 0s
Benchmarks / LLM (DEV=NV) (push) Canceled after 0s
Benchmarks / HLB-CIFAR10 (DEV=AMD) (push) Canceled after 0s
Benchmarks / HLB-CIFAR10 (DEV=METAL) (push) Canceled after 0s
Benchmarks / HLB-CIFAR10 (DEV=NV) (push) Canceled after 0s
Benchmarks / MLPerf (AMD) (push) Canceled after 0s
Benchmarks / MLPerf (NV) (push) Canceled after 0s
Benchmarks / Stable Diffusion (DEV=AMD) (push) Canceled after 0s
Benchmarks / Stable Diffusion (DEV=METAL) (push) Canceled after 0s
Benchmarks / Stable Diffusion (DEV=NV) (push) Canceled after 0s
Benchmarks / Multi-GPU Benchmarks (DEV=AMD) (push) Canceled after 0s
Benchmarks / Multi-GPU Benchmarks (DEV=NV) (push) Canceled after 0s
Benchmarks / Tests (DEV=AMD) (push) Canceled after 0s
Benchmarks / Tests (DEV=METAL) (push) Canceled after 0s
Benchmarks / Tests (DEV=NV) (push) Canceled after 0s
Benchmarks / UsbGPU Benchmark (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 dmonitoring (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.2 compile3 dmonitoring (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 policy (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.2 compile3 supercombo (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 vision (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 dmonitoring (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / openpilot 0.11.2 compile3 dmonitoring (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 policy (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / openpilot 0.11.2 compile3 supercombo (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 vision (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / DSP Benchmark (push) Canceled after 0s
Benchmarks / UsbGPU Benchmark (comma) (push) Canceled after 0s
Benchmarks / PCI Driver Benchmark (DEV=AMD) (push) Canceled after 0s
Benchmarks / PCI Driver Benchmark (DEV=NV) (push) Canceled after 0s
Benchmarks / LLVM Speed (push) Canceled after 0s
Platform Tests / MacOS (unit) (push) Canceled after 0s
Platform Tests / MacOS (unit, mock) (push) Canceled after 0s
Platform Tests / MacOS (DEV=METAL) (1) (push) Canceled after 0s
Platform Tests / MacOS (DEV=METAL) (2) (push) Canceled after 0s
Platform Tests / MacOS (DEV=CPU:CLANG) (push) Canceled after 0s
Platform Tests / MacOS (DEV=CPU:LLVM) (push) Canceled after 0s
Platform Tests / MacOS (DEV=CPU:LVP) (push) Canceled after 0s
Platform Tests / MacOS (DEV=WEBGPU) (push) Canceled after 0s
Platform Tests / Windows (DEV=CPU:CLANG) (push) Canceled after 0s
Platform Tests / Windows (DEV=CPU:LLVM) (push) Canceled after 0s
Platform Tests / Windows (DEV=CPU:X86) (push) Canceled after 0s
Platform Tests / Windows (DEV=WEBGPU) (push) Canceled after 0s
2026-08-27 14:44:06 -07:00
George HotzandGitHub f267a49639 UOp.param accepts single sint as shape (int,) (#17784)
* UOp.param accepts single sint as shape (int,)

Change UOp.param signature from shape:tuple[sint, ...]|None to shape:tuple[sint, ...]|sint|None.
A single sint means 1D shape (sint,). Update all callers from (n,) to n syntax.
No param_from_shape — multi-dim shapes stay as tuples.

* use single int syntax in hcq2 copy_with_kernel
2026-08-27 14:07:33 -07:00
chenyuandGitHub 54d69f439f fix test_assign for no subbuffer backends (#17757)
Autogen / In-tree Autogen (comgr 2) (push) Failing after 45s
Unit Tests / Models (push) Successful in 1m37s
Unit Tests / Linux (DSP) (push) Successful in 1m39s
Unit Tests / Fuzzing (push) Successful in 1m58s
Unit Tests / Linters (push) Successful in 2m0s
Unit Tests / Test LLM (push) Failing after 2m22s
Unit Tests / Docs (push) Successful in 2m57s
Unit Tests / hcq2 (push) Successful in 3m7s
Unit Tests / AMD ASM IDE (push) Successful in 3m12s
Unit Tests / openpilot Compile Tests (push) Successful in 3m17s
Unit Tests / Null Tests (push) Successful in 3m20s
Unit Tests / Python Backend (push) Successful in 3m22s
Unit Tests / CL IMAGE Tests (push) Successful in 3m24s
Unit Tests / Torch Backend Training (push) Successful in 3m25s
Unit Tests / Linux (DEV=CPU:X86) (push) Successful in 3m28s
Unit Tests / Linux (DEV=CPU:LLVM) (push) Successful in 3m58s
Unit Tests / Unit Tests (push) Successful in 4m7s
Unit Tests / Linux (amdllvm gfx1100) (push) Successful in 4m3s
Unit Tests / Linux (DEV=CPU:LVP) (push) Successful in 4m5s
Unit Tests / SPEC=2 (2) (push) Successful in 4m8s
Unit Tests / Linux (DEV=WEBGPU) (push) Successful in 4m8s
Unit Tests / Linux (DEV=CL) (push) Successful in 4m13s
Unit Tests / Optimization Tests (push) Successful in 4m15s
Unit Tests / Linux (am) (push) Successful in 4m20s
Unit Tests / Linux (amdllvm gfx1201) (push) Successful in 3m41s
Unit Tests / SPEC=2 (1) (push) Successful in 4m28s
Unit Tests / Linux (amd gfx1100) (push) Successful in 4m27s
Unit Tests / Torch Backend Tests (push) Successful in 4m33s
Unit Tests / Linux (amd gfx1201) (push) Successful in 4m27s
Unit Tests / Compile-only (DEV=NULL:NAK:sm_120) (push) Successful in 1m38s
Deploy Docs / deploy (push) Successful in 4m39s
Unit Tests / Linux (DEV=CPU:CLANG) (push) Successful in 4m42s
Unit Tests / Compile-only (DEV=NULL:IR3:a630) (push) Successful in 2m22s
Unit Tests / Linux (amdllvm gfx950) (push) Successful in 3m20s
Unit Tests / Linux (ptx) (push) Successful in 3m12s
Unit Tests / ONNX (CPU) Tests (push) Successful in 5m38s
Unit Tests / Linux (amd gfx950) (push) Successful in 4m25s
Unit Tests / Linux (nv) (push) Successful in 4m13s
Unit Tests / Compile-only (DEV=NULL:QCOMCL:a630) (push) Successful in 3m44s
Autogen / In-tree Autogen (push) Successful in 11m23s
Autogen / In-tree Autogen (macos) (push) Canceled after 0s
Benchmarks / Mac pytest (push) Canceled after 0s
Benchmarks / LLM (DEV=AMD) (push) Canceled after 0s
Benchmarks / LLM (DEV=METAL) (push) Canceled after 0s
Benchmarks / LLM (DEV=NV) (push) Canceled after 0s
Benchmarks / HLB-CIFAR10 (DEV=AMD) (push) Canceled after 0s
Benchmarks / HLB-CIFAR10 (DEV=METAL) (push) Canceled after 0s
Benchmarks / HLB-CIFAR10 (DEV=NV) (push) Canceled after 0s
Benchmarks / MLPerf (AMD) (push) Canceled after 0s
Benchmarks / MLPerf (NV) (push) Canceled after 0s
Benchmarks / Stable Diffusion (DEV=AMD) (push) Canceled after 0s
Benchmarks / Stable Diffusion (DEV=METAL) (push) Canceled after 0s
Benchmarks / Stable Diffusion (DEV=NV) (push) Canceled after 0s
Benchmarks / Multi-GPU Benchmarks (DEV=AMD) (push) Canceled after 0s
Benchmarks / Multi-GPU Benchmarks (DEV=NV) (push) Canceled after 0s
Benchmarks / Tests (DEV=AMD) (push) Canceled after 0s
Benchmarks / Tests (DEV=METAL) (push) Canceled after 0s
Benchmarks / Tests (DEV=NV) (push) Canceled after 0s
Benchmarks / UsbGPU Benchmark (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 dmonitoring (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.2 compile3 dmonitoring (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 policy (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.2 compile3 supercombo (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 vision (DEV=QCOM) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 dmonitoring (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / openpilot 0.11.2 compile3 dmonitoring (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 policy (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / openpilot 0.11.2 compile3 supercombo (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / openpilot 0.11.0 compile3 vision (DEV=QCOM:IR3) (push) Canceled after 0s
Benchmarks / DSP Benchmark (push) Canceled after 0s
Benchmarks / UsbGPU Benchmark (comma) (push) Canceled after 0s
Benchmarks / PCI Driver Benchmark (DEV=AMD) (push) Canceled after 0s
Benchmarks / PCI Driver Benchmark (DEV=NV) (push) Canceled after 0s
Benchmarks / LLVM Speed (push) Canceled after 0s
Platform Tests / MacOS (unit) (push) Canceled after 0s
Platform Tests / MacOS (unit, mock) (push) Canceled after 0s
Platform Tests / MacOS (DEV=METAL) (1) (push) Canceled after 0s
Platform Tests / MacOS (DEV=METAL) (2) (push) Canceled after 0s
Platform Tests / MacOS (DEV=CPU:CLANG) (push) Canceled after 0s
Platform Tests / MacOS (DEV=CPU:LLVM) (push) Canceled after 0s
Platform Tests / MacOS (DEV=CPU:LVP) (push) Canceled after 0s
Platform Tests / MacOS (DEV=WEBGPU) (push) Canceled after 0s
Platform Tests / Windows (DEV=CPU:CLANG) (push) Canceled after 0s
Platform Tests / Windows (DEV=CPU:LLVM) (push) Canceled after 0s
Platform Tests / Windows (DEV=CPU:X86) (push) Canceled after 0s
Platform Tests / Windows (DEV=WEBGPU) (push) Canceled after 0s
* test_assign to test/backend

* fix
2026-08-27 10:47:21 -04:00
nimlgenandGitHub 7eb763a3c2 bnxt to extra (#17772)
* bnxt to extra

* x

* x

* les
2026-08-27 17:29:17 +03:00
qazalandGitHub 118e812b31 simplify more same device copies (#17766)
* simplify more same device copies

* stack of contigs or copies

* rename
2026-08-27 12:54:12 +09:00
George HotzandGitHub a0a901c8e4 faster qwen 3.8 (#17720)
* faster qwen

* test fix

* dead code

* fix gguf issue

* pretty nt loads

* lil

* use warp
2026-08-26 15:23:25 -07:00
qazalandGitHub ecf79e260d better all2all schedule test (#17746)
* better all2all schedule test

* deconstruct those numbers

* reorder
2026-08-26 15:46:10 +09:00
chenyuandGitHub 9f01775cf4 dtype_from_uop for THREEFRY and FDIV (#17727) 2026-08-25 08:43:59 -04:00
chenyuandGitHub a7df1a1ace const are weak 3 [pr] (#17695) 2026-08-24 20:32:57 -04:00
George HotzandGitHub 7e561fcb97 mergable fast RDNA3 Qwen 3.8 (#17512)
* mergable fast RDNA3 Qwen 3.6

* AMD

* quant 256 multiple

* cleanup cast

* llm kernels: adapt to Ops.BIND removal

Variables are 0-d ALU BUFFERs in the tensor graph and take the ALU PARAM form
inside kernels (UOp.variable(param=True)). Add kernel_var helper for the
conversion, and keep start_pos in bound form at the graph level so function
implicit-input collection and the schedule's binds rename-back line up.

* adaptive prefill chunk sizes for recurrent models + iq4xs model entry

one TinyJit per static prefill chunk size: capture 128 and 32 at warmup,
generate picks the largest that fits the remaining prompt. long prompts
prefill 2x faster (555 tok/s on Qwen3.6-27B IQ4_XS) without pushing short
prompts through token-by-token decode.

* minimize diff: early-return custom attention path, keep master state init

* minimize: master _attention with gated fused-scan swap, kernels/amd only, single chunk size

- GatedDeltaNetBlock._attention keeps master's symbolic-padding structure;
  the recurrent scan is swapped for the fused gated_delta_prefill kernel only
  on RDNA3 with static shapes (fast_scan), everything else uses the old path
- all AMD kernel code lives in tinygrad/llm/kernels/amd.py (drop kernels/__init__.py,
  drop the generic fallback kernel - the old scan covers non-RDNA3)
- single prefill chunk size 32; non-RDNA3 recurrent keeps master's chunk_size=1
- the conv+normalize miscompile doesn't trigger with master's window-buffer conv,
  so the contiguous workaround is dropped

* warmup: single code path for fast and old recurrent

* drop fast_scan/fast_recurrent flags, inline the RDNA3 gate (cached)

* generate: chunk size is always 32, no device gating

static chunks for recurrent models everywhere: the fused kernel path on RDNA3,
the old scan elsewhere (which is also faster chunked than token-by-token)

* warmup: drop redundant _init_state loop (lazy init in the eager step covers it)

* symbolic-length prefill with the custom kernels

the prefill path is fully symbolic again (master's generate, one prefill graph
for every chunk size, no static-tail decode): padded steps are exact no-ops in
the scan (beta=0, alpha=exp(0)=1), flash attention positions queries at
start_pos instead of valid_kv_len-M, and quant linears pad to the chunk bucket

prefill 401 tok: 284 -> 348 tok/s on Qwen3.8-27B IQ4_XS (tail chunks no longer
decode token-by-token), decode unchanged at 45 tok/s

* cli: default qwen3.6:27b to the fast IQ4_XS quant, add qwen3.8:27b

Q4_K_M falls back to slow inline dequant with the custom kernels, IQ4_XS is
the fast path. qwen3.8 quants use unsloth's UD (dynamic) naming

* warmup: back to master's two-liner plus a cache reset

with symbolic prefill, generate([0])'s 1-token chunk captures the symbolic
prefill graph that serves every chunk size, and JIT batching on capture
measurably doesn't matter with the fused kernels (347.7 tok/s either way)

* cli: pin qwen3.8:27b to the pre-UD revision

the UD-IQ4_XS replacement mixes in Q3_K tensors (ggml type 11) the loader
doesn't support; the pinned revision is byte-identical to the known-good file

* warmup: identical to master

the leftover cache is self-consistent: get_start_pos only reuses a full
strict-prefix match, everything else restarts with a state reset

* model: hoist the quantized_attention import to the top level

* hoist the GDN query scale out of the branch, restore master dtype.py

the scale is the same op in both paths, apply it once after the transpose.
the dtype.py diff was a stale pre-SPEC=2 copy, not intentional work

* gated_delta_prefill: don't pass the bound start_pos as a call src

device-less param buffers in call srcs crash hcq2's _get_enqueue_devs. the
var already reaches the graph through the state AFTER chain (conv state
store), same as the flash kernels' valid_end

* llm: half KV cache with custom flash kernels, drop the int8 quantized cache

matches master's new half cache default: no scales, no packing, one less
buffer. the store casts to half explicitly (buffer-only half usage misses
the renderer's half define). 45.5 tok/s decode, 348.7 tok/s prefill —
same as int8

* llm: zero-init the KV cache

the int8 path was accidentally protected from uninitialized memory by its
zero-initialized scale buffer; with a plain half cache the flash prefill
kernel's P*V wmma computes 0*NaN=NaN on masked lanes past the valid region
(manifested as garbage tokens at 32k context where the allocator reuses
dirty VRAM)

* gate that

* llm/kernels/amd: reorganize by kernel family, drop the clutter

sections: shared helpers, quant linear, flash attention, gated delta prefill.
no AxisType.WEAK (default), no ALLOW_DEVICE_USAGE override (unneeded), magic
numbers become names (QUANT_SIZES, Q5_K/Q6_K/IQ4_XS), merged wrapper layers
(flash_attention_causal_cached folded into flash_attention), one _unbind
helper for the bound-var dance

* test: universal recurrent reuse assertion, fix lambda lint

* 1-token chunks have a static shape: they are decode steps

a 1-token chunk routes to the decode graph via the existing dispatch, so
warmup and decode-only workloads never build the big symbolic prefill graph:
CI benchmark command 12m50s -> 5m29s (master: 6m48s), 220 -> 123 compile jobs

also restores the ALLOW_DEVICE_USAGE override in amd_custom_kernels_supported:
Device[] asserts inside @function contexts (ALLOW_DEVICE_USAGE=0), and the
first gate call can happen there depending on test order

* generate: back to plain symbolic binding, the static-1 rule wasn't worth it

* custom kernels: Q4_K support (ggml type 12)

Q4_K is Q5_K without the high-bit array: same d/dmin/scales layout (so
_q5_scales works unchanged), 144-byte blocks, qs at word 4. both the dp4a
decode kernel and the WMMA prefill kernel take a ggml_type branch now.

Qwen3-8B Q4_K_M: decode 16.5 -> 114.8 tok/s, prefill 69 -> 536 tok/s

* raise line count to 26500 (qwen did it)

* benchmark qwen3.8

* little updates
2026-08-23 22:46:35 -07:00
chenyuandGitHub 356f665377 test update for weak const (#17675) 2026-08-21 21:50:29 -04:00
chenyuandGitHub 7204d46786 delete dtype_from_uop INDEX exempt (#17674) 2026-08-21 21:08:06 -04:00
George HotzandGitHub 1cb0600086 fix llm vars regression (kimi) (#17644)
* fix llm regression (kimi)

* unneeded

* more principled
2026-08-20 21:31:43 -07:00
b1tgandGitHub 9216aa494c llm prefill failing test (#17630) 2026-08-20 18:58:34 -07:00
George HotzandGitHub c31038ff37 use KernelCountException when kernel count is being compared (#17584) 2026-08-18 16:06:03 -07:00
chenyuandGitHub a1366e2f6c alu(long, weakint) can do math in int too [pr] (#17579)
* alu(long, weakint) can do math in int too [pr]

* remove
2026-08-18 09:08:35 -04:00
George HotzandGitHub 8d2cc64b69 llm: refactor delta attention (#17564)
* refactor delta attention

* cleanups

* bugfixes

* stack

* recurrent w chunk_size 1

* revert that

* extra test
2026-08-17 19:24:03 -07:00
b1tgandGitHub b757437f64 llm: respect expert_gating_func (#17458)
* llm: respect expert_gating_func

* test

* enum

* clean
2026-08-17 12:19:33 -07:00
b1tgandGitHub 2776c5b369 fix call arg indexing in shard scheduling (#17519) 2026-08-17 09:57:50 -07:00
chenyuandGitHub 138fb4a783 delete dead DType.scalar [PR] (#17561) 2026-08-16 21:12:17 -04:00
chenyuandGitHub 5ca87f1bac fix cast to weak twice [pr] (#17548)
also no gradient for weak target
2026-08-15 12:39:54 -04:00
chenyuandGitHub 539a03343a no casted const from sub and div [pr] (#17543) 2026-08-15 07:47:40 -04:00
qazalandGitHub a57569349c renumber invalids before callify (#17542)
* renumber invalids before callify

* change

* Revert "change"

This reverts commit 6f4df1541e79721a85ee3f5801114454f264c973.

* renumber in tensor

* scope renumber_invalid_outputs

* cleanup
2026-08-15 18:00:54 +09:00
qazalandGitHub 5c43a89fb1 precompile_backward tests for sched_cache (#17544)
* work

* back

* work

* keep +
2026-08-15 15:25:31 +09:00
qazalandGitHub e6f5bb9c09 simple test for Invalid clone cache miss regression (#17541)
* simple test for Invalid clone cache miss regression

* xfail

* _
2026-08-15 11:00:21 +09:00
chenyuandGitHub 89ab344c42 fix assign into bitcast with no explicit realize (#17531) 2026-08-14 09:23:01 -04:00
nimlgenandGitHub 6b35220622 cpu hcq2 (#17503)
* cpu hcq2

* temp

* slop

* test with backpressure

* x

* x

* x

* x

* x

* x

* Dx

* save reverts

* um?

* x

* x

* call from py

* x?

* x

* submitters gone

* x

* x

* z

* Dx

* Dx

* x

* x

* fixes

* repl

* x

* f

* for now keep hcqbuffer
2026-08-14 15:06:03 +03:00
George HotzandGitHub e103fb2a10 more lil llm improvements (#17514)
* more lil llm improvements

* default float
2026-08-12 20:13:20 -07:00
George HotzandGitHub 2297118541 lil llm improvements (#17513) 2026-08-12 19:29:32 -07:00
sirhcmandGitHub 479ffb0cda remove Ops.SLICE (#17492) 2026-08-11 18:50:04 -04:00
b1tgandGitHub abe2256299 fix symbolic sharded reshape (#17463) 2026-08-08 09:18:02 -07:00
b1tgandGitHub 8c49a7a34b support symbolic shapes in copy (#17461)
* pad_to is no-op when same shape

* support symbolic shapes in copy
2026-08-08 09:16:59 -07:00
chenyuandGitHub baa6148066 fix var of large half input (#17444)
* fix var of large half input

similar to mean, we use sum_acc_dtype for denominator

* mypy
2026-08-06 23:14:32 -04:00
chenyuandGitHub 7a9cd8e329 move weak function and pm to uop/weak [PR] (#17429) 2026-08-05 22:27:40 -04:00
sirhcmandGitHub be25207a7a scope variable names inside CALLs (#17424) 2026-08-05 20:59:09 -04:00
chenyuandGitHub c2f1e5ae2a fix weak cast to strong dtype [pr] (#17418)
weak can mean higher than that strong dtype, so always use that strong dtype is wrong
2026-08-05 15:32:23 -04:00
chenyuandGitHub 6cb419b9b7 regression test for bert nan with weak (#17412) 2026-08-05 12:14:26 -04:00
chenyuandGitHub 3bf9e70b19 Revert "don't cast weak in _broadcasted [pr] (#17408)" (#17409)
This reverts commit b45058b5ec.
2026-08-05 02:40:33 -04:00