From a31cf04d997e1e90a76b02e99a9dd2bd17df95b2 Mon Sep 17 00:00:00 2001 From: Jerry Zhang Date: Tue, 30 Apr 2024 14:16:57 -0700 Subject: [PATCH] Refactor `quantize_activation_per_token_absmax` to use general quant primitives Summary: att Test Plan: OSS CI Reviewers: Subscribers: Tasks: Tags: --- torchao/quantization/quant_primitives.py | 22 ++++++++++++---------- tutorials/quantize_vit/quant.json.gz | Bin 16168 -> 20229 bytes 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/torchao/quantization/quant_primitives.py b/torchao/quantization/quant_primitives.py index bd4bcce1aa..7fdeb65d96 100644 --- a/torchao/quantization/quant_primitives.py +++ b/torchao/quantization/quant_primitives.py @@ -323,21 +323,23 @@ def dynamically_quantize_per_tensor( def quantize_activation_per_token_absmax(t): - n_bits = 8 # if the shape of t is [B, N, K], the shape of scales will be [B, N, 1] + mapping_type = MappingType.SYMMETRIC + block_size = list(t.shape) + for i in range(len(block_size) - 1): + block_size[i] = 1 + dtype = torch.int8 + eps = 1e-5 + scale, zero_point = choose_qparams_affine(t, mapping_type, block_size, dtype, eps=eps, scale_dtype=torch.float) - scales = t.abs().amax(dim=-1, keepdim=True) - if scales.dtype == torch.float16: - scales = ( - scales.float() - ) # want float scales to avoid overflows for fp16, (bf16 has wide enough range) - q_max = 2 ** (n_bits - 1) - 1 - scales = scales.clamp(min=1e-5).div(q_max) # Note: the original smoothquant does not clamp to qmin/qmax here, # but some of the tests with bfloat16 ended up with a flipped sign # if we don't clamp. TODO(future) look into this further. - t = torch.round(t / scales).clamp(-127, 127).to(torch.int8) - return t, scales + quant_min = -127 + quant_max = 127 + quantized = quantize_affine(t, block_size, scale, zero_point, dtype, quant_min, quant_max) + + return quantized, scale def dynamically_quantize_per_channel(x, quant_min, quant_max, target_dtype): diff --git a/tutorials/quantize_vit/quant.json.gz b/tutorials/quantize_vit/quant.json.gz index a207cefc5fae899263e3d00f4d85fcb3832b37ca..0b3200eeb5a0be28019833de35c95036c50f694d 100644 GIT binary patch literal 20229 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 WfBWzM4*&rF{{sM8;kLmFs|Ns6|LQIP literal 16168 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

Q;su$e3aR;dj`vx*)Ju!_El_vOPh|I8>% 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