[ExecuTorch][WebGPU] Reuse pool for single-op scratch (-86.7 MiB)#20797
[ExecuTorch][WebGPU] Reuse pool for single-op scratch (-86.7 MiB)#20797JCNTH wants to merge 5 commits 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. ❌ 3 New Failures, 10 Pending, 1 Unrelated FailureAs of commit f0ccc41 with merge base f4b01a8 ( NEW FAILURES - The following jobs have failed:
BROKEN TRUNK - The following job failed but were present on the merge base:👉 Rebase onto the `viable/strict` branch to avoid these failures
This comment was automatically generated by Dr. CI and updates every 15 minutes. |
This PR needs a
|
SS-JIA
left a comment
There was a problem hiding this comment.
Review automatically exported from Phabricator review in Meta.
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.@exported-using-ghexport
Differential Revision: D110948389
Differential Revision: D110948389