[ExecuTorch][WebGPU] Reuse pool for single-op scratch (-86.7 MiB)#20797
Open
JCNTH wants to merge 1 commit into
Open
[ExecuTorch][WebGPU] Reuse pool for single-op scratch (-86.7 MiB)#20797JCNTH wants to merge 1 commit into
JCNTH wants to merge 1 commit into
Conversation
🔗 Helpful Links🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/20797
Note: Links to docs will display an error until the docs builds have been completed. ❌ 6 New FailuresAs of commit cf7c21f with merge base 4af91c3 ( NEW FAILURES - The following jobs have failed:
This comment was automatically generated by Dr. CI and updates every 15 minutes. |
This was referenced Jul 9, 2026
Open
This PR needs a
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stack from ghstack (oldest at bottom):
Problem:
WebGPUGraph::create_scratch_bufferkeeps every fused-op scratchWGPUBufferalive inscratch_buffers_until graph teardown. The SDPA prefill workspace (attn_weights+attn_weights_softmax, eachHq*S*Cmax*4bytes) and the FlashDecoding partials (part_o/part_ml) are allocated fresh in every decoder layer's lowering, so a 16-layer Llama holds ~16x copies of scratch that is only live during a single op — a large slice of the device compute/scratch footprint.Solution: add an acquire/release reuse pool for SINGLE-OP-LIFETIME scratch.
acquire_scratch()returns a free slot (best-fit, size in[n, 2n]) or creates one; the caller releases it at op-lowering scope exit via the RAIIScopedScratchguard. Across the layers the SDPA/FD scratch now recycles a small constant of buffers instead of Nx. Whole-graph-lifetime scratch stays oncreate_scratch_bufferunchanged.Correctness: reuse is bit-identical because WebGPU/Dawn auto-inserts RAW hazard barriers between dispatches that share a storage buffer regardless of pass structure — the same guarantee the shipped
mem_obj_idtensor aliasing already relies on. A still-in_useslot is never handed to a co-live requester (co-live safety).WEBGPU_NO_SCRATCH_POOLfalls back to the per-call path for A/B.Differential Revision: D110948389