quantize-py
python bindings for quantize, a simple, fast quantization library written in rust. quantization stores numbers in fewer bits, trading a little accuracy for a lot less memory.
pip install quantize-py
requires python 3.12 or newer. numpy is installed with it.
from quantize import Scale, quantize
weights = [0.42, -0.10, 0.70, -0.50]
q = quantize(weights, bits=8, block=32, scale=Scale.F16)
back = q.dequantize() # [0.421, -0.098, 0.700, -0.498]
dot = q.dot(weights) # 0.926
bits is the width of each code, from 2 to 16. block is how many values share one scale, and scale is how that scale is stored: Scale.F32 (the default), Scale.F16, or Scale.BF16. values can be a list, a numpy array, or anything else np.asarray reads, like a pytorch tensor. a 2-d array keeps its shape, so q.dequantize() gives back a matrix and q.matmul(x) computes x @ W.T, like a linear layer. q.shape gives its rows and columns, and len(q) the number of values, as in rust.
the scales count toward the size: 4-bit codes with one f16 scale per 32 values cost 4.5 bits per value, or 5 with the default f32 scale. q.bits_per_element reports it. above about 10 bits, use f32 scales with asymmetric.quantize, since f16 and bf16 zero-points cap its accuracy.
the other schemes return the same Quantized type:
asymmetric.quantize(weights, bits=8, block=32)adds a zero-point per block, for values that aren't centered on zeroadaptive.quantize(weights, tolerance=0.1 * weights.std())gives each block the fewest bits, from 2 to 8, that round every weight withintolerance, in the weights' own units. a tenth of their standard deviation gives about 5 bits a block. for a list, usenp.std(weights)learned.refine(q, weights)refits each block's scale, and its zero-point if it has one, to lower the mean squared error. it changesqin place, so callq.copy()first to keep the originallearned.alternate(q, weights)refits too, then rounds each value to the nearest code on its block's new line, and repeats until no code moves. it also changesqin place. both can raise the worst error past an adaptive tensor's toleranceScheme.Q4_32.quantize(weights)picks a scheme at run time
a block with outliers can need more than 8 bits, which raises ToleranceTooTightError. retrying with its smallest_tolerance works, but loosens every block, not just that one:
try:
q = adaptive.quantize(weights, tolerance=0.1 * weights.std())
except ToleranceTooTightError as error:
q = adaptive.quantize(weights, tolerance=error.smallest_tolerance)
quantized values can be pickled, and compared with ==. q.to_bytes() saves one as bytes, in the same format as the rust crate, and Quantized.from_bytes(data) loads it back. to keep it in an np.savez or safetensors file, store np.frombuffer(q.to_bytes(), np.uint8).
to save its parts as plain arrays instead, like with np.savez, pass them back by name to Quantized.from_parts. leave out the one that's None: bits for an adaptive tensor, or block_bits for the others:
parts = dict(kind=q.kind, shape=q.shape, block=q.block, bits=q.bits, block_bits=q.block_bits,
codes=q.codes, scales=q.scales, zero_points=q.zero_points, scale=q.scale.name)
np.savez("layer.npz", **{name: part for name, part in parts.items() if part is not None})
q = Quantized.from_parts(**np.load("layer.npz"))
to load quantized values from a torch.save checkpoint, call torch.serialization.add_safe_globals([Quantized]) before torch.load.
each value decodes as code * scale, or (code - zero_point) * scale with zero-points, using the scale and zero-point of its block. codes are signed and bits wide, and q.codes packs them low bits first. scales can be negative, since a symmetric block puts its value farthest from zero on the most negative code. help(Quantized) has the details.
to build and test from a clone of the repo, with rust 1.88 or newer and just:
just setup
just python
on debian or ubuntu, run sudo apt install python3-venv first.
Metadata
Release files for quantize-py 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| quantize_py-0.3.0.tar.gz | 79.2 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| quantize_py-0.3.0-cp312-abi3-win_amd64.whl | CPython 3.12 | abi3 | Windows x86-64 | Details |
| quantize_py-0.3.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.12 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| quantize_py-0.3.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.12 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| quantize_py-0.3.0-cp312-abi3-macosx_11_0_arm64.whl | CPython 3.12 | abi3 | macOS 11.0+ ARM64 | Details |
| quantize_py-0.3.0-cp312-abi3-macosx_10_12_x86_64.whl | CPython 3.12 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 2.2 MB
Release files / quantize_py-0.3.0.tar.gz
| Download URL | quantize_py-0.3.0.tar.gz |
|---|---|
| Size | 79.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a4a84cf5a16638ced5bdea85294278827b5aacec99d7743d8867d2a1805ba2ac
|
|
BLAKE2b-256 checksum How to use checksums |
b2eb4175f02c04fb4e8a609b9c6c74fb04d93f3d7b47cd5b1678c9253ec778cd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / quantize_py-0.3.0-cp312-abi3-win_amd64.whl
| Download URL | quantize_py-0.3.0-cp312-abi3-win_amd64.whl |
|---|---|
| Size | 321.6 kB |
| Tags | CPython 3.12 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
3c27de0a4bf2be03789e249a39c8a681ba5b2afcdb3f9b2ca744d734aa1184c9
|
|
BLAKE2b-256 checksum How to use checksums |
14704cf9d03d097d7348d63175e76ef1b81a237b7e2703ac89f98593c3f3b579
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / quantize_py-0.3.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | quantize_py-0.3.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 477.2 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
83a9df4771c2ae75419343a2e4d36838c5880c8a569aef78cc87e87e810a72f8
|
|
BLAKE2b-256 checksum How to use checksums |
693d3b8a0faac3c8e81407937859310d1068475b239da824363adfc0703962ba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / quantize_py-0.3.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | quantize_py-0.3.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 465.4 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
d0be0ab577b6fe25cde8c6be5b445348edbfe3083284610935e2596043f19a96
|
|
BLAKE2b-256 checksum How to use checksums |
8d5ef5c5afb94301abdccee16685cf3570945a7a65928ca4bc0bbf4b95d325a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / quantize_py-0.3.0-cp312-abi3-macosx_11_0_arm64.whl
| Download URL | quantize_py-0.3.0-cp312-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 424.8 kB |
| Tags | CPython 3.12 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
fd6087de30a62d6e66ad753edcaf0ece924a911b85319cfd1a05c8a0e9029cce
|
|
BLAKE2b-256 checksum How to use checksums |
c4d7e40e2b89ec7d86ba1b5fc4728706ae2d134692d6b9eabfc9c4fa71050340
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / quantize_py-0.3.0-cp312-abi3-macosx_10_12_x86_64.whl
| Download URL | quantize_py-0.3.0-cp312-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 437.6 kB |
| Tags | CPython 3.12 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
a0f659da9bd9bf33837edfc5c202ad2ca24b333001cd2c686d0e3b8cb89561ca
|
|
BLAKE2b-256 checksum How to use checksums |
8ceadcd81285b68cb01139fc41ce58de5f7a82d9c588c190559cf0d9832b7979
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|