Skip to content

Chunk weight quantization to bound fp32 VRAM spikes - #1659

Open
dxqb wants to merge 1 commit into
Nerogar:masterfrom
dxqb:chunked-weight-quantization-squashed
Open

Chunk weight quantization to bound fp32 VRAM spikes#1659
dxqb wants to merge 1 commit into
Nerogar:masterfrom
dxqb:chunked-weight-quantization-squashed

Conversation

@dxqb

@dxqb dxqb commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

Summary

Quantizing a W8A8 weight upcast the whole tensor to fp32, and the non-in-place mul made a second full-size copy, so one large layer transiently needed several times its own size in VRAM. On small GPUs that was enough to OOM during quantization.

Test plan

  • pre-commit run --all-files passes
  • Launched the affected UI or script and exercised the change
  • Tested with at least one real preset / config when relevant (note which: ____)

AI assistance

  • AI-assisted — I have read every line in this diff and can defend each change

Quantizing a W8A8 weight upcast the whole tensor to fp32, and the non-in-place
`mul` made a second full-size copy, so one large layer transiently needed
several times its own size in VRAM. On small GPUs that was enough to OOM during
quantization.

`quantize_int8_tensorwise_chunked` / `quantize_fp8_tensorwise_chunked` quantize
the weight in row-blocks of `_QUANTIZE_CHUNK_ELEMENTS`, bounding the fp32
transient to one block; `LinearW8A8.quantize` uses them. The tensorwise scale
now comes from `torch.aminmax` instead of `abs().max()`, dropping another
full-tensor copy. The shared `quantize_int8` / `quantize_fp8` cores take an
explicit fp32 copy and then scale in place, so an already-fp32 caller tensor is
never clobbered.

Output is unchanged, bit for bit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant