From a27db6220db127ebd27c6d657c54525ce45a23ab Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 13:45:04 -0400 Subject: [PATCH 01/16] use hadamards database file Signed-off-by: Kyle Sayers --- .../transform/utils/hadamard.py | 69 +++++------------- .../transform/utils/hadamards.safetensors | Bin 0 -> 169453 bytes tests/test_transform/utils/test_hadamard.py | 17 ----- 3 files changed, 18 insertions(+), 68 deletions(-) create mode 100644 src/compressed_tensors/transform/utils/hadamards.safetensors diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index 6312823b..caaf1b1d 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -74,29 +74,26 @@ def random_hadamard_matrix( return _matmul_hadU(Q) / math.sqrt(size) -def _get_hadK(n: int, transpose: bool = False) -> Tuple[torch.Tensor, int]: - # NOTE: we can easily extend the list of supported shapes/sizes - # by adding to these methods - hadK, K = None, None - if n % 20 == 0: - assert _is_pow2(n // 20) - K = 20 - hadK = _get_had20().T if transpose else _get_had20() - elif n % 12 == 0: - assert _is_pow2(n // 12) - K = 12 - hadK = _get_had12().T if transpose else _get_had12() - else: - assert _is_pow2(n) - K = 1 - - return hadK, K - - -def _matmul_hadU(X, transpose=False) -> torch.Tensor: +def _get_hadK(n: int) -> Tuple[torch.Tensor, int]: + import os + + from safetensors import safe_open + + file_path = os.path.join(os.path.dirname(__file__), "hadamards.safetensors") + with safe_open(file_path, framework="pt", device="cpu") as file: + for divisor in file.keys(): + if n % int(divisor) == 0: + return file.get_tensor(str(divisor)), int(divisor) + + else: + assert _is_pow2(n) + return None, 1 + + +def _matmul_hadU(X) -> torch.Tensor: n = X.shape[-1] # Check if we have the determined hadamard matrix - hadK, K = _get_hadK(n, transpose) + hadK, K = _get_hadK(n) # Reshape diag matrix with randomized -1/+1 input = X.clone().view(-1, n, 1) output = input.clone() @@ -129,33 +126,3 @@ def _matmul_hadU(X, transpose=False) -> torch.Tensor: def _is_pow2(n: int) -> bool: return (n & (n - 1) == 0) and (n > 0) - - -def _reshape_bits(packed_bits: numpy.ndarray, original_size: int) -> numpy.ndarray: - had_unpacked = numpy.unpackbits(packed_bits) - had_unpacked = [1 if x == 1 else -1 for x in had_unpacked] - had_unpacked = numpy.array(had_unpacked).reshape((original_size, original_size)) - return had_unpacked - - -# http://www.neilsloane.com/hadamard/index.html -def _get_had12() -> torch.Tensor: - # fmt: off - had_12 = numpy.array([128, 13, 29, 232, 235, 71, 218, - 62, 209, 246, 139, 180, 157, 168, 237, 199, 106, 59], dtype=numpy.uint8) - # fmt: on - # TODO: just unpack during apply - had_12_unpacked = _reshape_bits(had_12, original_size=12) - return torch.tensor(had_12_unpacked) - - -def _get_had20() -> torch.Tensor: - # fmt: off - had_20 = numpy.array([128, 0, 13, 133, 121, 236, 43, 203, 97, 94, 155, 10, 252, - 216, 87, 230, 194, 191, 54, 21, 249, 176, 171, 205, 133, 222, 108, 42, 243, - 97, 215, 155, 10, 188, 216, 149, 230, 200, 175, 54, 133, 121, 188, 43, - 205, 225, 94, 107, 10, 243], dtype=numpy.uint8) - # fmt: on - # TODO: just unpack during apply - had_20_unpacked = _reshape_bits(had_20, original_size=20) - return torch.tensor(had_20_unpacked) diff --git a/src/compressed_tensors/transform/utils/hadamards.safetensors b/src/compressed_tensors/transform/utils/hadamards.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..8c22e6fc68abaf396ecd14722fb3e24e4a818de3 GIT binary patch literal 169453 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 literal 0 HcmV?d00001 diff --git a/tests/test_transform/utils/test_hadamard.py b/tests/test_transform/utils/test_hadamard.py index 41532990..455c33fc 100644 --- a/tests/test_transform/utils/test_hadamard.py +++ b/tests/test_transform/utils/test_hadamard.py @@ -17,28 +17,11 @@ import pytest import torch from compressed_tensors.transform.utils.hadamard import ( - _get_had12, - _get_had20, deterministic_hadamard_matrix, random_hadamard_matrix, ) -@pytest.mark.parametrize( - "had_func", - [ - _get_had12, - _get_had20, - ], -) -def test_packed_hadamard_compliant(had_func): - had_matrix = had_func() - size = had_matrix.size(0) - # HH.T == nI - product = had_matrix @ had_matrix.T - assert torch.equal(product, size * torch.eye(size)) - - @pytest.mark.parametrize( "size", [4096, 2048], From ce639551798d4a148c676026bbadc196e8ef6ec2 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 14:12:42 -0400 Subject: [PATCH 02/16] try manifest Signed-off-by: Kyle Sayers --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) create mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..65fa437b --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include src/compressed_tensors/transform/utils/hadamards.safetensors From 7ae58637c54a43a50d90114cafd3163713723d9e Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 14:31:47 -0400 Subject: [PATCH 03/16] try setup, update hadamards list Signed-off-by: Kyle Sayers --- MANIFEST.in | 1 - setup.py | 1 + .../transform/utils/hadamards.safetensors | Bin 169453 -> 1436901 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 65fa437b..00000000 --- a/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include src/compressed_tensors/transform/utils/hadamards.safetensors diff --git a/setup.py b/setup.py index f74dda8d..a1fb6c49 100644 --- a/setup.py +++ b/setup.py @@ -113,5 +113,6 @@ def _setup_extras() -> Dict: extras_require=_setup_extras(), install_requires=_setup_install_requires(), package_dir={"": "src"}, + package_data={"": "src/compressed_tensors/transform/utils/hadamards.safetensors"}, packages=_setup_packages(), ) diff --git a/src/compressed_tensors/transform/utils/hadamards.safetensors b/src/compressed_tensors/transform/utils/hadamards.safetensors index 8c22e6fc68abaf396ecd14722fb3e24e4a818de3..9624e008623e86678a2da7f27000106e03055257 100644 GIT binary patch literal 1436901 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

Ky4J7 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 It9OnAV--xH#4Yj*)gQZy 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 delta 1083 zcmX|-&1(}u7{*PSgf>adZg#UtlOVDvco>$Q-Pzfhdg)(K=t(_Dx>BJ+Dn%(0edsWYAqaJisquFsMWG3mu=6UwCAHa$Fq@*2Q`*88`Ml(%j~BvNm?#(7NfQtpzZ)s zcR;Y0AXzy}i;?J!So_$}i7BRzVs|*`y3W}XZE-nO6RYX6IFl(iNpgU&fib6ptGM`= zZgk!n;!DanjJ;tf4??LGh7n|f`KaA?PO4p!L6(G10Fm7=aSy4w&l8tM>cUS~_9QD) z$CYD#GUgA)^o-T{X6ix00}A_jVm4zL$pw@+r_Z(R6}hyyo~z#@*&r=CrMkE~RxL3` zT#Oi_L3mV7i1l1u+$mNhmqc-jfq%+1#IIsi1A-WL``i=JctiXySp`6{LH$si*Qo{- z;x6&Pzz65gdbI=yaZE@6&TFNHI8d$@fFSOL1dHjiUw}&e2ccLiQw=J_iQi93L?>Gp zf67%I5aQJ1zA_|CZaE>iAuSa{oCQ1-EraS%A?#w`g-`)J!=_Qw0m%*_KD+}JGtzz3 ztQ7&t4s+#Vjv1DrLKu74hx=&%zAI);2PRuoW>!%`So*zm0fc0q%k6f|P=`u_FvKw0 zH<_(iIw0sU2+1JIjY>^*7)ID9IO(V-_+FVPD1tD-p3J!0Vwx)CKjZyD4mnO)6D36u z4#MQ|XNnEcwQ3p=gsJ@Gr7L?^dseq+rH&nmbN3A`&OK1FsbovZLnV)tJXZ2V%HM^t zQk;Ee=yC43VlR}uRPsv6Ybigc^V#^ryKFPQ{nX5Nx3@+wq`Er=ji%#ulFEo5SI6Tw R+h+6P)P~ue+Nj(_{{h-oBIy7C From 67675c388aa36068f04cf2d96d0d24b83cec7577 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 14:34:02 -0400 Subject: [PATCH 04/16] fix setup Signed-off-by: Kyle Sayers --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a1fb6c49..a8295cf8 100644 --- a/setup.py +++ b/setup.py @@ -113,6 +113,6 @@ def _setup_extras() -> Dict: extras_require=_setup_extras(), install_requires=_setup_install_requires(), package_dir={"": "src"}, - package_data={"": "src/compressed_tensors/transform/utils/hadamards.safetensors"}, + package_data={"": ["src/compressed_tensors/transform/utils/hadamards.safetensors"]}, packages=_setup_packages(), ) From f061db9cc5a8b59da0b46aa4d35029440e273b09 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 15:08:32 -0400 Subject: [PATCH 05/16] add docstrings, cleanup Signed-off-by: Kyle Sayers --- .../transform/utils/hadamard.py | 62 +++++++++++-------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index caaf1b1d..560e69cd 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -13,21 +13,31 @@ # limitations under the License. import math +import os from typing import Optional, Tuple import numpy import torch +from safetensors import safe_open + + +REPO_PATH = os.path.join(os.path.dirname(__file__), "hadamards.safetensors") __all__ = ["random_hadamard_matrix", "deterministic_hadamard_matrix"] -# adapted from: -# https://github.com/scipy/scipy/blob/v1.15.2/scipy/linalg/_special_matrices.py + +# note that hadamard matrix multiplication can be accelerated using a library such as +# https://github.com/Dao-AILab/fast-hadamard-transform/tree/master + + def deterministic_hadamard_matrix(size: int) -> torch.Tensor: """ Construct an n-by-n Hadamard matrix, using Sylvester's construction. `n` must be a power of 2. + Adapated from https://github.com/scipy/scipy/blob/v1.15.2/scipy/linalg/_special_matrices.py # noqa: E501 + :param size: order of the matrix, must be a power of 2 :return: hadamard matrix of size `size` """ @@ -41,20 +51,12 @@ def deterministic_hadamard_matrix(size: int) -> torch.Tensor: H = numpy.array([[1]], dtype=int) # Sylvester's construction - for i in range(0, log2): + for _ in range(0, log2): H = numpy.vstack((numpy.hstack((H, H)), numpy.hstack((H, -H)))) return torch.from_numpy(H / math.sqrt(size)) -# adapted from: -# https://github.com/facebookresearch/SpinQuant/blob/main/utils/hadamard_utils.py - -# TODO: the following library exists for online rotations and should be considered -# in the future: -# https://github.com/Dao-AILab/fast-hadamard-transform/tree/master - - def random_hadamard_matrix( size: int, gen: Optional[torch.Generator] = None ) -> torch.Tensor: @@ -63,6 +65,8 @@ def random_hadamard_matrix( See https://cornell-relaxml.github.io/quip-sharp/ , Section "Randomized Hadamard Transformation" + Adapated from https://github.com/facebookresearch/SpinQuant/blob/main/utils/hadamard_utils.py # noqa: E501 + :param size: The dimension of the hamadard matrix :param gen: Optional generator random values :return: randomly generated hadamard matrix @@ -74,31 +78,39 @@ def random_hadamard_matrix( return _matmul_hadU(Q) / math.sqrt(size) -def _get_hadK(n: int) -> Tuple[torch.Tensor, int]: - import os +def _get_known_hadamard(n: int, file_path: str = REPO_PATH) -> Optional[torch.Tensor]: + """ + Fetch a known hadamard matrix of size `n` from hadamard repo path if it exists - from safetensors import safe_open + Note: This function reopens the safetensors file every time it is called. + This is inefficient, but inconsequential because hadamards are typically + cached by size through the factory that produced them. This is also simpler + than forcing callers to manage the file open context - file_path = os.path.join(os.path.dirname(__file__), "hadamards.safetensors") + :param n: size of known hadamard matrix + :return: a known hadamard matrix of size `n` if one exists, else None + """ with safe_open(file_path, framework="pt", device="cpu") as file: for divisor in file.keys(): if n % int(divisor) == 0: - return file.get_tensor(str(divisor)), int(divisor) + return file.get_tensor(divisor) + + return None - else: - assert _is_pow2(n) - return None, 1 +def _matmul_hadU(X: torch.Tensor) -> torch.Tensor: + size = X.shape[-1] -def _matmul_hadU(X) -> torch.Tensor: - n = X.shape[-1] # Check if we have the determined hadamard matrix - hadK, K = _get_hadK(n) + hadK = _get_known_hadamard(size) + K = hadK.size(0) if hadK is not None else 1 + if hadK is None and not _is_pow2(size): + raise ValueError(f"Cannot construct random hadamard matrix of size {size}") + + # For cases when hadK is not predetermined, determine hadamard matrix # Reshape diag matrix with randomized -1/+1 - input = X.clone().view(-1, n, 1) + input = X.clone().view(-1, size, 1) output = input.clone() - - # for cases when hadK is not predetermined, determine hadamard matrix while input.shape[1] > K: input = input.view(input.shape[0], input.shape[1] // 2, 2, input.shape[2]) output = output.view(input.shape) From 4a84ce1a3efe726c765746682c4c5a53f4dd2984 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 15:38:06 -0400 Subject: [PATCH 06/16] fix setup, thank you @dbarbuzzi Signed-off-by: Kyle Sayers --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a8295cf8..901ec9dd 100644 --- a/setup.py +++ b/setup.py @@ -113,6 +113,6 @@ def _setup_extras() -> Dict: extras_require=_setup_extras(), install_requires=_setup_install_requires(), package_dir={"": "src"}, - package_data={"": ["src/compressed_tensors/transform/utils/hadamards.safetensors"]}, + package_data={"": ["transform/utils/hadamards.safetensors"]}, packages=_setup_packages(), ) From cde10667e9bddc369edf0c4f0bab0c843f9540a4 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 16:21:50 -0400 Subject: [PATCH 07/16] remove numpy, add tests Signed-off-by: Kyle Sayers --- .../transform/utils/hadamard.py | 58 +++++++++---------- tests/test_transform/utils/test_hadamard.py | 39 +++++++++---- 2 files changed, 54 insertions(+), 43 deletions(-) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index 560e69cd..f229a78f 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -14,17 +14,17 @@ import math import os -from typing import Optional, Tuple +from typing import Optional -import numpy import torch from safetensors import safe_open REPO_PATH = os.path.join(os.path.dirname(__file__), "hadamards.safetensors") +DTYPE = torch.int32 -__all__ = ["random_hadamard_matrix", "deterministic_hadamard_matrix"] +__all__ = ["random_hadamard_matrix", "deterministic_hadamard_matrix", "is_pow2"] # note that hadamard matrix multiplication can be accelerated using a library such as @@ -48,13 +48,13 @@ def deterministic_hadamard_matrix(size: int) -> torch.Tensor: if size != 2**log2: raise ValueError("Cannot construct deterministic hadamard of size != 2^n") - H = numpy.array([[1]], dtype=int) + H = torch.tensor([[1]], dtype=DTYPE) # Sylvester's construction for _ in range(0, log2): - H = numpy.vstack((numpy.hstack((H, H)), numpy.hstack((H, -H)))) + H = torch.vstack((torch.hstack((H, H)), torch.hstack((H, -H)))) - return torch.from_numpy(H / math.sqrt(size)) + return H / math.sqrt(size) def random_hadamard_matrix( @@ -72,15 +72,21 @@ def random_hadamard_matrix( :return: randomly generated hadamard matrix """ # Benefits: support other shapes / non powers of 2, support randomization - Q = torch.randint(low=0, high=2, size=(size,), generator=gen, dtype=torch.float64) + Q = torch.randint(low=0, high=2, size=(size,), generator=gen, dtype=DTYPE) Q = Q * 2 - 1 Q = torch.diag(Q) return _matmul_hadU(Q) / math.sqrt(size) -def _get_known_hadamard(n: int, file_path: str = REPO_PATH) -> Optional[torch.Tensor]: +def is_pow2(n: int) -> bool: + return (n & (n - 1) == 0) and (n > 0) + + +def _get_known_divisor(n: int, file_path: str = REPO_PATH) -> Optional[torch.Tensor]: """ - Fetch a known hadamard matrix of size `n` from hadamard repo path if it exists + Fetch a known hadamard matrix from the given file path. The returned matrix will + be of of size `k` such that `n` divides `d` and `n / d` is a power of two. Return + None if no such matrix exists. Note: This function reopens the safetensors file every time it is called. This is inefficient, but inconsequential because hadamards are typically @@ -91,9 +97,10 @@ def _get_known_hadamard(n: int, file_path: str = REPO_PATH) -> Optional[torch.Te :return: a known hadamard matrix of size `n` if one exists, else None """ with safe_open(file_path, framework="pt", device="cpu") as file: - for divisor in file.keys(): - if n % int(divisor) == 0: - return file.get_tensor(divisor) + divisors = sorted([int(key) for key in file.keys()], reverse=True) + for divisor in divisors: + if n % divisor == 0 and is_pow2(n // divisor): + return file.get_tensor(str(divisor)).to(dtype=DTYPE) return None @@ -102,12 +109,11 @@ def _matmul_hadU(X: torch.Tensor) -> torch.Tensor: size = X.shape[-1] # Check if we have the determined hadamard matrix - hadK = _get_known_hadamard(size) - K = hadK.size(0) if hadK is not None else 1 - if hadK is None and not _is_pow2(size): + hadK = _get_known_divisor(size) + if hadK is None: raise ValueError(f"Cannot construct random hadamard matrix of size {size}") + K = hadK.size(0) - # For cases when hadK is not predetermined, determine hadamard matrix # Reshape diag matrix with randomized -1/+1 input = X.clone().view(-1, size, 1) output = input.clone() @@ -120,21 +126,11 @@ def _matmul_hadU(X: torch.Tensor) -> torch.Tensor: (input, output) = (output, input) del output - # K == 1 when hadK is None; this happens when the size dim (n) - # is not comaptible with any of the maintained hadamard matrices - - if K > 1: - # Do not explicitly repeat - OOM - # input = torch.bmm( - # hadK.repeat(len(input), 1, 1).to(input.device).to(input.dtype), input) - # Use bcast instead - - # for cases when hadK is pre-determined - input = hadK.view(1, K, K).to(input) @ input + # Do not explicitly repeat - OOM + # input = torch.bmm( + # hadK.repeat(len(input), 1, 1).to(input.device).to(input.dtype), input) + # Use bcast instead + input = hadK.view(1, K, K).to(input) @ input # normalize return input.view(X.shape) - - -def _is_pow2(n: int) -> bool: - return (n & (n - 1) == 0) and (n > 0) diff --git a/tests/test_transform/utils/test_hadamard.py b/tests/test_transform/utils/test_hadamard.py index 455c33fc..3dae0cb2 100644 --- a/tests/test_transform/utils/test_hadamard.py +++ b/tests/test_transform/utils/test_hadamard.py @@ -13,26 +13,39 @@ # limitations under the License. -import numpy import pytest import torch from compressed_tensors.transform.utils.hadamard import ( deterministic_hadamard_matrix, + is_pow2, random_hadamard_matrix, ) -@pytest.mark.parametrize( - "size", - [4096, 2048], -) +_sizes_to_test = [ + 768, # gpt2 small + 1024, # gpt2 medium + 1280, # qwen_2_5_vl vision + 1600, # gpt2 xl + 2048, # gpt3 small + # 3584, # qwen_2_5_vl + # 3840, # qwen_2_5_vl vision qkv + # 4096, # llama3 + # 14336, # llama3 intermediate + # 18944, # qwen_2_5_vl intermediate +] + + +@pytest.mark.parametrize("size", _sizes_to_test) def test_random_hadamard_matrix_compliant(size): + # (H / sqrt(n))(H.T / sqrt(n)) == I had_matrix = random_hadamard_matrix(size) product = torch.round(had_matrix @ had_matrix.T) - assert torch.equal(product, torch.eye(size)) + assert torch.allclose(product, torch.eye(size, dtype=product.dtype), atol=1e-5) def test_random_hadamard_generator(): + # check that generation is deterministic with a seed generator = torch.Generator().manual_seed(42) one = random_hadamard_matrix(2048, generator) two = random_hadamard_matrix(2048, generator) @@ -56,12 +69,14 @@ def test_random_hadamard_generator(): assert torch.all(two[:3, :3].sign() == two_true.sign()) -@pytest.mark.parametrize( - "size", - [1024], -) +@pytest.mark.parametrize("size", _sizes_to_test) def test_deterministic_hadamard_compliant(size): - had_matrix = deterministic_hadamard_matrix(size) + if not is_pow2(size): + with pytest.raises(ValueError): + had_matrix = deterministic_hadamard_matrix(size) + return + # (H / sqrt(n))(H.T / sqrt(n)) == I + had_matrix = deterministic_hadamard_matrix(size) product = had_matrix @ had_matrix.T - assert numpy.array_equal(product, numpy.eye(size)) + assert torch.allclose(product, torch.eye(size, dtype=product.dtype), atol=1e-5) From 1ba6195e730d3f9774e7eefab93ea6376b44e4be Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 16:38:06 -0400 Subject: [PATCH 08/16] solidify dtype, add gpu tests Signed-off-by: Kyle Sayers --- .../transform/factory/hadamard.py | 2 +- .../transform/factory/random_hadamard.py | 2 +- .../transform/utils/hadamard.py | 24 +++++++---- tests/test_transform/utils/test_hadamard.py | 41 +++++++++++-------- 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/compressed_tensors/transform/factory/hadamard.py b/src/compressed_tensors/transform/factory/hadamard.py index b1da88a3..8a62bd00 100644 --- a/src/compressed_tensors/transform/factory/hadamard.py +++ b/src/compressed_tensors/transform/factory/hadamard.py @@ -59,7 +59,7 @@ def create_transform(self, module: Module, args: TransformArgs): return HadamardTransform(weight, args) def _create_weight(self, size: int, dtype: dtype, device: device) -> Parameter: - data = deterministic_hadamard_matrix(size) + data = deterministic_hadamard_matrix(size, dtype=dtype) data = data.to(dtype=dtype, device=device) return Parameter(data, requires_grad=self.scheme.requires_grad) diff --git a/src/compressed_tensors/transform/factory/random_hadamard.py b/src/compressed_tensors/transform/factory/random_hadamard.py index 98113afe..65dacc81 100644 --- a/src/compressed_tensors/transform/factory/random_hadamard.py +++ b/src/compressed_tensors/transform/factory/random_hadamard.py @@ -29,6 +29,6 @@ class RandomHadamardFactory(HadamardFactory): """ def _create_weight(self, size: int, dtype: dtype, device: device) -> Parameter: - data = random_hadamard_matrix(size, self.generator) + data = random_hadamard_matrix(size, dtype=dtype, gen=self.generator) data = data.to(dtype=dtype, device=device) return Parameter(data, requires_grad=self.scheme.requires_grad) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index f229a78f..6ba337e0 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -21,7 +21,6 @@ REPO_PATH = os.path.join(os.path.dirname(__file__), "hadamards.safetensors") -DTYPE = torch.int32 __all__ = ["random_hadamard_matrix", "deterministic_hadamard_matrix", "is_pow2"] @@ -31,7 +30,9 @@ # https://github.com/Dao-AILab/fast-hadamard-transform/tree/master -def deterministic_hadamard_matrix(size: int) -> torch.Tensor: +def deterministic_hadamard_matrix( + size: int, dtype: torch.dtype = torch.bfloat16 +) -> torch.Tensor: """ Construct an n-by-n Hadamard matrix, using Sylvester's construction. `n` must be a power of 2. @@ -44,11 +45,11 @@ def deterministic_hadamard_matrix(size: int) -> torch.Tensor: if size <= 0: raise ValueError("Cannot construct deterministic hadamard of size <= 0") - log2 = int(math.log(size, 2)) + log2 = int(math.log2(size)) if size != 2**log2: raise ValueError("Cannot construct deterministic hadamard of size != 2^n") - H = torch.tensor([[1]], dtype=DTYPE) + H = torch.tensor([[1]], dtype=dtype) # Sylvester's construction for _ in range(0, log2): @@ -58,7 +59,9 @@ def deterministic_hadamard_matrix(size: int) -> torch.Tensor: def random_hadamard_matrix( - size: int, gen: Optional[torch.Generator] = None + size: int, + dtype: torch.dtype = torch.bfloat16, + gen: Optional[torch.Generator] = None, ) -> torch.Tensor: """ Produces a randomly generated Hadamard matrix. @@ -72,7 +75,7 @@ def random_hadamard_matrix( :return: randomly generated hadamard matrix """ # Benefits: support other shapes / non powers of 2, support randomization - Q = torch.randint(low=0, high=2, size=(size,), generator=gen, dtype=DTYPE) + Q = torch.randint(low=0, high=2, size=(size,), generator=gen, dtype=dtype) Q = Q * 2 - 1 Q = torch.diag(Q) return _matmul_hadU(Q) / math.sqrt(size) @@ -82,7 +85,9 @@ def is_pow2(n: int) -> bool: return (n & (n - 1) == 0) and (n > 0) -def _get_known_divisor(n: int, file_path: str = REPO_PATH) -> Optional[torch.Tensor]: +def _get_known_divisor( + n: int, dtype: torch.dtype, file_path: str = REPO_PATH +) -> Optional[torch.Tensor]: """ Fetch a known hadamard matrix from the given file path. The returned matrix will be of of size `k` such that `n` divides `d` and `n / d` is a power of two. Return @@ -100,16 +105,17 @@ def _get_known_divisor(n: int, file_path: str = REPO_PATH) -> Optional[torch.Ten divisors = sorted([int(key) for key in file.keys()], reverse=True) for divisor in divisors: if n % divisor == 0 and is_pow2(n // divisor): - return file.get_tensor(str(divisor)).to(dtype=DTYPE) + return file.get_tensor(str(divisor)).to(dtype=dtype) return None def _matmul_hadU(X: torch.Tensor) -> torch.Tensor: size = X.shape[-1] + dtype = X.dtype # Check if we have the determined hadamard matrix - hadK = _get_known_divisor(size) + hadK = _get_known_divisor(size, dtype) if hadK is None: raise ValueError(f"Cannot construct random hadamard matrix of size {size}") K = hadK.size(0) diff --git a/tests/test_transform/utils/test_hadamard.py b/tests/test_transform/utils/test_hadamard.py index 3dae0cb2..7f50e76c 100644 --- a/tests/test_transform/utils/test_hadamard.py +++ b/tests/test_transform/utils/test_hadamard.py @@ -20,6 +20,7 @@ is_pow2, random_hadamard_matrix, ) +from tests.testing_utils import requires_gpu _sizes_to_test = [ @@ -28,27 +29,29 @@ 1280, # qwen_2_5_vl vision 1600, # gpt2 xl 2048, # gpt3 small - # 3584, # qwen_2_5_vl - # 3840, # qwen_2_5_vl vision qkv - # 4096, # llama3 - # 14336, # llama3 intermediate - # 18944, # qwen_2_5_vl intermediate + 3584, # qwen_2_5_vl + 3840, # qwen_2_5_vl vision qkv + 4096, # llama3 + 14336, # llama3 intermediate + 18944, # qwen_2_5_vl intermediate ] +@requires_gpu @pytest.mark.parametrize("size", _sizes_to_test) def test_random_hadamard_matrix_compliant(size): # (H / sqrt(n))(H.T / sqrt(n)) == I - had_matrix = random_hadamard_matrix(size) - product = torch.round(had_matrix @ had_matrix.T) - assert torch.allclose(product, torch.eye(size, dtype=product.dtype), atol=1e-5) + with torch.device("cuda"): + had_matrix = random_hadamard_matrix(size) + product = torch.round(had_matrix @ had_matrix.T) + assert torch.allclose(product, torch.eye(size, dtype=product.dtype), atol=1e-5) def test_random_hadamard_generator(): # check that generation is deterministic with a seed generator = torch.Generator().manual_seed(42) - one = random_hadamard_matrix(2048, generator) - two = random_hadamard_matrix(2048, generator) + one = random_hadamard_matrix(2048, gen=generator) + two = random_hadamard_matrix(2048, gen=generator) one_true = torch.tensor( [ @@ -69,14 +72,16 @@ def test_random_hadamard_generator(): assert torch.all(two[:3, :3].sign() == two_true.sign()) +@requires_gpu @pytest.mark.parametrize("size", _sizes_to_test) def test_deterministic_hadamard_compliant(size): - if not is_pow2(size): - with pytest.raises(ValueError): - had_matrix = deterministic_hadamard_matrix(size) - return + with torch.device("cuda"): + if not is_pow2(size): + with pytest.raises(ValueError): + had_matrix = deterministic_hadamard_matrix(size) + return - # (H / sqrt(n))(H.T / sqrt(n)) == I - had_matrix = deterministic_hadamard_matrix(size) - product = had_matrix @ had_matrix.T - assert torch.allclose(product, torch.eye(size, dtype=product.dtype), atol=1e-5) + # (H / sqrt(n))(H.T / sqrt(n)) == I + had_matrix = deterministic_hadamard_matrix(size) + product = had_matrix @ had_matrix.T + assert torch.allclose(product, torch.eye(size, dtype=product.dtype), atol=1e-5) From c3733450d65f0a5985f04236c5059884f29773db Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 16:40:11 -0400 Subject: [PATCH 09/16] fix docstring Signed-off-by: Kyle Sayers --- src/compressed_tensors/transform/utils/hadamard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index 6ba337e0..5a92875b 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -90,8 +90,8 @@ def _get_known_divisor( ) -> Optional[torch.Tensor]: """ Fetch a known hadamard matrix from the given file path. The returned matrix will - be of of size `k` such that `n` divides `d` and `n / d` is a power of two. Return - None if no such matrix exists. + be of of size `k` such that `n / k` is a power of two. Return None if no such + matrix exists. Note: This function reopens the safetensors file every time it is called. This is inefficient, but inconsequential because hadamards are typically From fbaf47aa785b57c3153a33799833ef0e7b1f7103 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 17:12:50 -0400 Subject: [PATCH 10/16] add device option Signed-off-by: Kyle Sayers --- .../transform/factory/hadamard.py | 2 +- .../transform/factory/random_hadamard.py | 2 +- .../transform/utils/hadamard.py | 27 +++++++++++------ tests/test_transform/utils/test_hadamard.py | 29 ++++++++++--------- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/compressed_tensors/transform/factory/hadamard.py b/src/compressed_tensors/transform/factory/hadamard.py index 8a62bd00..2f19761e 100644 --- a/src/compressed_tensors/transform/factory/hadamard.py +++ b/src/compressed_tensors/transform/factory/hadamard.py @@ -60,7 +60,7 @@ def create_transform(self, module: Module, args: TransformArgs): def _create_weight(self, size: int, dtype: dtype, device: device) -> Parameter: data = deterministic_hadamard_matrix(size, dtype=dtype) - data = data.to(dtype=dtype, device=device) + data = data.to(device=device) return Parameter(data, requires_grad=self.scheme.requires_grad) diff --git a/src/compressed_tensors/transform/factory/random_hadamard.py b/src/compressed_tensors/transform/factory/random_hadamard.py index 65dacc81..b7a9f4e4 100644 --- a/src/compressed_tensors/transform/factory/random_hadamard.py +++ b/src/compressed_tensors/transform/factory/random_hadamard.py @@ -30,5 +30,5 @@ class RandomHadamardFactory(HadamardFactory): def _create_weight(self, size: int, dtype: dtype, device: device) -> Parameter: data = random_hadamard_matrix(size, dtype=dtype, gen=self.generator) - data = data.to(dtype=dtype, device=device) + data = data.to(device=device) return Parameter(data, requires_grad=self.scheme.requires_grad) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index 5a92875b..10e580a4 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -31,7 +31,9 @@ def deterministic_hadamard_matrix( - size: int, dtype: torch.dtype = torch.bfloat16 + size: int, + dtype: torch.dtype = torch.bfloat16, + device: torch.device = torch.device("cpu"), ) -> torch.Tensor: """ Construct an n-by-n Hadamard matrix, using Sylvester's construction. @@ -49,7 +51,7 @@ def deterministic_hadamard_matrix( if size != 2**log2: raise ValueError("Cannot construct deterministic hadamard of size != 2^n") - H = torch.tensor([[1]], dtype=dtype) + H = torch.tensor([[1]], dtype=dtype, device=device) # Sylvester's construction for _ in range(0, log2): @@ -61,6 +63,7 @@ def deterministic_hadamard_matrix( def random_hadamard_matrix( size: int, dtype: torch.dtype = torch.bfloat16, + device: torch.device = torch.device("cpu"), gen: Optional[torch.Generator] = None, ) -> torch.Tensor: """ @@ -75,7 +78,9 @@ def random_hadamard_matrix( :return: randomly generated hadamard matrix """ # Benefits: support other shapes / non powers of 2, support randomization - Q = torch.randint(low=0, high=2, size=(size,), generator=gen, dtype=dtype) + Q = torch.randint( + low=0, high=2, size=(size,), generator=gen, dtype=dtype, device=device + ) Q = Q * 2 - 1 Q = torch.diag(Q) return _matmul_hadU(Q) / math.sqrt(size) @@ -86,7 +91,10 @@ def is_pow2(n: int) -> bool: def _get_known_divisor( - n: int, dtype: torch.dtype, file_path: str = REPO_PATH + n: int, + dtype: torch.dtype, + device: torch.device = torch.device("cpu"), + file_path: str = REPO_PATH, ) -> Optional[torch.Tensor]: """ Fetch a known hadamard matrix from the given file path. The returned matrix will @@ -94,8 +102,7 @@ def _get_known_divisor( matrix exists. Note: This function reopens the safetensors file every time it is called. - This is inefficient, but inconsequential because hadamards are typically - cached by size through the factory that produced them. This is also simpler + This is technically inefficient, but a very small runtime cost and simpler than forcing callers to manage the file open context :param n: size of known hadamard matrix @@ -105,17 +112,18 @@ def _get_known_divisor( divisors = sorted([int(key) for key in file.keys()], reverse=True) for divisor in divisors: if n % divisor == 0 and is_pow2(n // divisor): - return file.get_tensor(str(divisor)).to(dtype=dtype) + return file.get_tensor(str(divisor)).to(dtype=dtype, device=device) return None def _matmul_hadU(X: torch.Tensor) -> torch.Tensor: - size = X.shape[-1] + size = X.size(0) dtype = X.dtype + device = X.device # Check if we have the determined hadamard matrix - hadK = _get_known_divisor(size, dtype) + hadK = _get_known_divisor(size, dtype, device=device) if hadK is None: raise ValueError(f"Cannot construct random hadamard matrix of size {size}") K = hadK.size(0) @@ -130,6 +138,7 @@ def _matmul_hadU(X: torch.Tensor) -> torch.Tensor: output[:, :, 1, :] = input[:, :, 0, :] - input[:, :, 1, :] output = output.view(input.shape[0], input.shape[1], -1) (input, output) = (output, input) + assert input.shape[1] == K del output # Do not explicitly repeat - OOM diff --git a/tests/test_transform/utils/test_hadamard.py b/tests/test_transform/utils/test_hadamard.py index 7f50e76c..efe3920c 100644 --- a/tests/test_transform/utils/test_hadamard.py +++ b/tests/test_transform/utils/test_hadamard.py @@ -32,19 +32,22 @@ 3584, # qwen_2_5_vl 3840, # qwen_2_5_vl vision qkv 4096, # llama3 + 7168, # deepseek_v3 14336, # llama3 intermediate + 18432, # deepseek_v3 intermediate 18944, # qwen_2_5_vl intermediate ] +_atol = 1e-1 # bfloat16 is low precision for large matrices @requires_gpu @pytest.mark.parametrize("size", _sizes_to_test) def test_random_hadamard_matrix_compliant(size): # (H / sqrt(n))(H.T / sqrt(n)) == I - with torch.device("cuda"): - had_matrix = random_hadamard_matrix(size) - product = torch.round(had_matrix @ had_matrix.T) - assert torch.allclose(product, torch.eye(size, dtype=product.dtype), atol=1e-5) + had_matrix = random_hadamard_matrix(size, device="cuda") + product = had_matrix @ had_matrix.T + eye = torch.eye(size, dtype=product.dtype, device="cuda") + assert torch.allclose(product, eye, atol=_atol) def test_random_hadamard_generator(): @@ -75,13 +78,13 @@ def test_random_hadamard_generator(): @requires_gpu @pytest.mark.parametrize("size", _sizes_to_test) def test_deterministic_hadamard_compliant(size): - with torch.device("cuda"): - if not is_pow2(size): - with pytest.raises(ValueError): - had_matrix = deterministic_hadamard_matrix(size) - return + if not is_pow2(size): + with pytest.raises(ValueError): + matrix = deterministic_hadamard_matrix(size, device="cuda") + return - # (H / sqrt(n))(H.T / sqrt(n)) == I - had_matrix = deterministic_hadamard_matrix(size) - product = had_matrix @ had_matrix.T - assert torch.allclose(product, torch.eye(size, dtype=product.dtype), atol=1e-5) + # (H / sqrt(n))(H.T / sqrt(n)) == I + matrix = deterministic_hadamard_matrix(size, device="cuda") + product = matrix @ matrix.T + eye = torch.eye(size, dtype=product.dtype, device="cuda") + assert torch.allclose(product, eye, atol=_atol) From 5a887f45236a45217b7b353f40843f1debb9653a Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 17:49:15 -0400 Subject: [PATCH 11/16] construct on execution device, cache on offload device Signed-off-by: Kyle Sayers --- .../transform/factory/hadamard.py | 17 +++++++++++++---- .../transform/factory/random_hadamard.py | 11 +++++++++-- .../transform/utils/hadamard.py | 9 +++++---- src/compressed_tensors/utils/helpers.py | 11 ++++++++--- tests/test_transform/utils/test_hadamard.py | 4 ++-- 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/compressed_tensors/transform/factory/hadamard.py b/src/compressed_tensors/transform/factory/hadamard.py index 2f19761e..255be835 100644 --- a/src/compressed_tensors/transform/factory/hadamard.py +++ b/src/compressed_tensors/transform/factory/hadamard.py @@ -22,7 +22,7 @@ apply_transform_weight, get_matrix_size, ) -from compressed_tensors.utils import get_offloaded_device +from compressed_tensors.utils import get_execution_device, get_offloaded_device from compressed_tensors.utils.helpers import ParameterizedDefaultDict from torch import Tensor, device, dtype from torch.nn import Linear, Module, Parameter @@ -41,6 +41,7 @@ class HadamardFactory(TransformFactory): def __init__(self, name: str, scheme: TransformScheme, seed: Optional[int] = None): super().__init__(name, scheme, seed) self.weights = ParameterizedDefaultDict(self._create_weight) + self._exec_device = torch.device("cpu") def create_transform(self, module: Module, args: TransformArgs): """ @@ -54,12 +55,20 @@ def create_transform(self, module: Module, args: TransformArgs): size = get_matrix_size(module, args.location) dtype = module.weight.dtype device = get_offloaded_device(module) + exec_device = get_execution_device(module) - weight = self.weights[size, dtype, device] + weight = self.weights.get(size, dtype, device, construct_device=exec_device) return HadamardTransform(weight, args) - def _create_weight(self, size: int, dtype: dtype, device: device) -> Parameter: - data = deterministic_hadamard_matrix(size, dtype=dtype) + def _create_weight( + self, + size: int, + dtype: dtype, + device: device, + construct_device: device, + ) -> Parameter: + # construct on execution device, cache on offload device + data = deterministic_hadamard_matrix(size, dtype, construct_device) data = data.to(device=device) return Parameter(data, requires_grad=self.scheme.requires_grad) diff --git a/src/compressed_tensors/transform/factory/random_hadamard.py b/src/compressed_tensors/transform/factory/random_hadamard.py index b7a9f4e4..dd32d95e 100644 --- a/src/compressed_tensors/transform/factory/random_hadamard.py +++ b/src/compressed_tensors/transform/factory/random_hadamard.py @@ -28,7 +28,14 @@ class RandomHadamardFactory(HadamardFactory): :param seed: random seed used to transform weight randomization """ - def _create_weight(self, size: int, dtype: dtype, device: device) -> Parameter: - data = random_hadamard_matrix(size, dtype=dtype, gen=self.generator) + def _create_weight( + self, + size: int, + dtype: dtype, + device: device, + construct_device: device, + ) -> Parameter: + # construct on execution device, cache on offload device + data = random_hadamard_matrix(size, dtype, construct_device, self.generator) data = data.to(device=device) return Parameter(data, requires_grad=self.scheme.requires_grad) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index 10e580a4..c9068619 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -71,16 +71,17 @@ def random_hadamard_matrix( See https://cornell-relaxml.github.io/quip-sharp/ , Section "Randomized Hadamard Transformation" + Improves upon deterministic_hadamard_matrix + in that this supports non powers of 2 and random seeds + Adapated from https://github.com/facebookresearch/SpinQuant/blob/main/utils/hadamard_utils.py # noqa: E501 :param size: The dimension of the hamadard matrix :param gen: Optional generator random values :return: randomly generated hadamard matrix """ - # Benefits: support other shapes / non powers of 2, support randomization - Q = torch.randint( - low=0, high=2, size=(size,), generator=gen, dtype=dtype, device=device - ) + Q = torch.randint(low=0, high=2, size=(size,), generator=gen, dtype=dtype) # cpu + Q = Q.to(device=device) Q = Q * 2 - 1 Q = torch.diag(Q) return _matmul_hadU(Q) / math.sqrt(size) diff --git a/src/compressed_tensors/utils/helpers.py b/src/compressed_tensors/utils/helpers.py index d8898ae4..c06d3e3f 100644 --- a/src/compressed_tensors/utils/helpers.py +++ b/src/compressed_tensors/utils/helpers.py @@ -373,11 +373,16 @@ class ParameterizedDefaultDict(dict): def __init__(self, default_factory: Callable[[Any], Any]): self.default_factory = default_factory + self._kwargs = {} - def __missing__(self, key): + def __missing__(self, key: Any) -> Any: if isinstance(key, tuple): - value = self.default_factory(*key) + value = self.default_factory(*key, **self._kwargs) else: - value = self.default_factory(key) + value = self.default_factory(key, **self._kwargs) self[key] = value return value + + def get(self, *args, **kwargs) -> Any: + with patch_attr(self, "_kwargs", kwargs): + return self[args] diff --git a/tests/test_transform/utils/test_hadamard.py b/tests/test_transform/utils/test_hadamard.py index efe3920c..b885e411 100644 --- a/tests/test_transform/utils/test_hadamard.py +++ b/tests/test_transform/utils/test_hadamard.py @@ -44,8 +44,8 @@ @pytest.mark.parametrize("size", _sizes_to_test) def test_random_hadamard_matrix_compliant(size): # (H / sqrt(n))(H.T / sqrt(n)) == I - had_matrix = random_hadamard_matrix(size, device="cuda") - product = had_matrix @ had_matrix.T + matrix = random_hadamard_matrix(size, device="cuda") + product = matrix @ matrix.T eye = torch.eye(size, dtype=product.dtype, device="cuda") assert torch.allclose(product, eye, atol=_atol) From 310fe6d4a51592f0223eaf44f8af5f4ff15e7cd3 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 17:55:44 -0400 Subject: [PATCH 12/16] save construction device changes for later Signed-off-by: Kyle Sayers --- .../transform/factory/hadamard.py | 19 +++++-------------- .../transform/factory/random_hadamard.py | 13 +++---------- src/compressed_tensors/utils/helpers.py | 11 +++-------- 3 files changed, 11 insertions(+), 32 deletions(-) diff --git a/src/compressed_tensors/transform/factory/hadamard.py b/src/compressed_tensors/transform/factory/hadamard.py index 255be835..c14da51f 100644 --- a/src/compressed_tensors/transform/factory/hadamard.py +++ b/src/compressed_tensors/transform/factory/hadamard.py @@ -22,7 +22,7 @@ apply_transform_weight, get_matrix_size, ) -from compressed_tensors.utils import get_execution_device, get_offloaded_device +from compressed_tensors.utils import get_offloaded_device from compressed_tensors.utils.helpers import ParameterizedDefaultDict from torch import Tensor, device, dtype from torch.nn import Linear, Module, Parameter @@ -41,7 +41,6 @@ class HadamardFactory(TransformFactory): def __init__(self, name: str, scheme: TransformScheme, seed: Optional[int] = None): super().__init__(name, scheme, seed) self.weights = ParameterizedDefaultDict(self._create_weight) - self._exec_device = torch.device("cpu") def create_transform(self, module: Module, args: TransformArgs): """ @@ -55,21 +54,13 @@ def create_transform(self, module: Module, args: TransformArgs): size = get_matrix_size(module, args.location) dtype = module.weight.dtype device = get_offloaded_device(module) - exec_device = get_execution_device(module) - weight = self.weights.get(size, dtype, device, construct_device=exec_device) + weight = self.weights[size, dtype, device] return HadamardTransform(weight, args) - def _create_weight( - self, - size: int, - dtype: dtype, - device: device, - construct_device: device, - ) -> Parameter: - # construct on execution device, cache on offload device - data = deterministic_hadamard_matrix(size, dtype, construct_device) - data = data.to(device=device) + def _create_weight(self, size: int, dtype: dtype, device: device) -> Parameter: + data = deterministic_hadamard_matrix(size, dtype, device) + data = data.to(dtype=dtype, device=device) return Parameter(data, requires_grad=self.scheme.requires_grad) diff --git a/src/compressed_tensors/transform/factory/random_hadamard.py b/src/compressed_tensors/transform/factory/random_hadamard.py index dd32d95e..78fb6975 100644 --- a/src/compressed_tensors/transform/factory/random_hadamard.py +++ b/src/compressed_tensors/transform/factory/random_hadamard.py @@ -28,14 +28,7 @@ class RandomHadamardFactory(HadamardFactory): :param seed: random seed used to transform weight randomization """ - def _create_weight( - self, - size: int, - dtype: dtype, - device: device, - construct_device: device, - ) -> Parameter: - # construct on execution device, cache on offload device - data = random_hadamard_matrix(size, dtype, construct_device, self.generator) - data = data.to(device=device) + def _create_weight(self, size: int, dtype: dtype, device: device) -> Parameter: + data = random_hadamard_matrix(size, dtype, device, self.generator) + data = data.to(dtype=dtype, device=device) return Parameter(data, requires_grad=self.scheme.requires_grad) diff --git a/src/compressed_tensors/utils/helpers.py b/src/compressed_tensors/utils/helpers.py index c06d3e3f..d8898ae4 100644 --- a/src/compressed_tensors/utils/helpers.py +++ b/src/compressed_tensors/utils/helpers.py @@ -373,16 +373,11 @@ class ParameterizedDefaultDict(dict): def __init__(self, default_factory: Callable[[Any], Any]): self.default_factory = default_factory - self._kwargs = {} - def __missing__(self, key: Any) -> Any: + def __missing__(self, key): if isinstance(key, tuple): - value = self.default_factory(*key, **self._kwargs) + value = self.default_factory(*key) else: - value = self.default_factory(key, **self._kwargs) + value = self.default_factory(key) self[key] = value return value - - def get(self, *args, **kwargs) -> Any: - with patch_attr(self, "_kwargs", kwargs): - return self[args] From 249323c0144120d0fd947bdee1972263ee0ff9e1 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 18:04:59 -0400 Subject: [PATCH 13/16] cite nja sloane Signed-off-by: Kyle Sayers --- src/compressed_tensors/transform/utils/hadamard.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index c9068619..bf5e2268 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -75,6 +75,7 @@ def random_hadamard_matrix( in that this supports non powers of 2 and random seeds Adapated from https://github.com/facebookresearch/SpinQuant/blob/main/utils/hadamard_utils.py # noqa: E501 + Known matrices were retrieved from N. J. A. Sloane's Library of Hadamard Matrices http://www.neilsloane.com/hadamard/ # noqa: E501 :param size: The dimension of the hamadard matrix :param gen: Optional generator random values From 5807ee1fd26c34c2898c80ad8847dd003ab236e9 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 18:32:04 -0400 Subject: [PATCH 14/16] put on device via safe_open Signed-off-by: Kyle Sayers --- src/compressed_tensors/transform/utils/hadamard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index bf5e2268..d33f33f0 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -110,11 +110,11 @@ def _get_known_divisor( :param n: size of known hadamard matrix :return: a known hadamard matrix of size `n` if one exists, else None """ - with safe_open(file_path, framework="pt", device="cpu") as file: + with safe_open(file_path, framework="pt", device=str(device)) as file: divisors = sorted([int(key) for key in file.keys()], reverse=True) for divisor in divisors: if n % divisor == 0 and is_pow2(n // divisor): - return file.get_tensor(str(divisor)).to(dtype=dtype, device=device) + return file.get_tensor(str(divisor)).to(dtype=dtype) return None From ccb88edb2717a183892f76f61b2fac2af17eeee4 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 22:11:36 -0400 Subject: [PATCH 15/16] nits and docstrings Signed-off-by: Kyle Sayers --- .../transform/utils/hadamard.py | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index d33f33f0..a75fa79f 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -13,14 +13,14 @@ # limitations under the License. import math -import os +from pathlib import Path from typing import Optional import torch from safetensors import safe_open -REPO_PATH = os.path.join(os.path.dirname(__file__), "hadamards.safetensors") +REPO_PATH = Path(__file__).parent / "hadamards.safetensors" __all__ = ["random_hadamard_matrix", "deterministic_hadamard_matrix", "is_pow2"] @@ -42,6 +42,8 @@ def deterministic_hadamard_matrix( Adapated from https://github.com/scipy/scipy/blob/v1.15.2/scipy/linalg/_special_matrices.py # noqa: E501 :param size: order of the matrix, must be a power of 2 + :param dtype: data type of matrix + :param device: device to construct matrix on :return: hadamard matrix of size `size` """ if size <= 0: @@ -54,7 +56,7 @@ def deterministic_hadamard_matrix( H = torch.tensor([[1]], dtype=dtype, device=device) # Sylvester's construction - for _ in range(0, log2): + for _ in range(log2): H = torch.vstack((torch.hstack((H, H)), torch.hstack((H, -H)))) return H / math.sqrt(size) @@ -78,6 +80,8 @@ def random_hadamard_matrix( Known matrices were retrieved from N. J. A. Sloane's Library of Hadamard Matrices http://www.neilsloane.com/hadamard/ # noqa: E501 :param size: The dimension of the hamadard matrix + :param dtype: data type of matrix + :param device: device to construct matrix on :param gen: Optional generator random values :return: randomly generated hadamard matrix """ @@ -89,10 +93,16 @@ def random_hadamard_matrix( def is_pow2(n: int) -> bool: - return (n & (n - 1) == 0) and (n > 0) + """ + Check if a number is a power of 2 + + :param n: number to check + :return: True iff `n` is a power of 2 + """ + return n > 0 and (n & (n - 1) == 0) -def _get_known_divisor( +def _fetch_hadamard_divisor( n: int, dtype: torch.dtype, device: torch.device = torch.device("cpu"), @@ -111,7 +121,7 @@ def _get_known_divisor( :return: a known hadamard matrix of size `n` if one exists, else None """ with safe_open(file_path, framework="pt", device=str(device)) as file: - divisors = sorted([int(key) for key in file.keys()], reverse=True) + divisors = sorted((int(key) for key in file.keys()), reverse=True) for divisor in divisors: if n % divisor == 0 and is_pow2(n // divisor): return file.get_tensor(str(divisor)).to(dtype=dtype) @@ -125,7 +135,7 @@ def _matmul_hadU(X: torch.Tensor) -> torch.Tensor: device = X.device # Check if we have the determined hadamard matrix - hadK = _get_known_divisor(size, dtype, device=device) + hadK = _fetch_hadamard_divisor(size, dtype, device=device) if hadK is None: raise ValueError(f"Cannot construct random hadamard matrix of size {size}") K = hadK.size(0) From feba6953db4fddc4011a01ca4d112e48d67a08f7 Mon Sep 17 00:00:00 2001 From: Kyle Sayers Date: Wed, 11 Jun 2025 22:21:50 -0400 Subject: [PATCH 16/16] update docstring Signed-off-by: Kyle Sayers --- src/compressed_tensors/transform/utils/hadamard.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/compressed_tensors/transform/utils/hadamard.py b/src/compressed_tensors/transform/utils/hadamard.py index a75fa79f..9281d6cc 100644 --- a/src/compressed_tensors/transform/utils/hadamard.py +++ b/src/compressed_tensors/transform/utils/hadamard.py @@ -69,12 +69,9 @@ def random_hadamard_matrix( gen: Optional[torch.Generator] = None, ) -> torch.Tensor: """ - Produces a randomly generated Hadamard matrix. - See https://cornell-relaxml.github.io/quip-sharp/ , - Section "Randomized Hadamard Transformation" - - Improves upon deterministic_hadamard_matrix - in that this supports non powers of 2 and random seeds + Produces a randomly generated Hadamard matrix. Differs from + `deterministic_hadamard_matrix` in that this function supports non powers of 2 + and randomization using a seeded generator Adapated from https://github.com/facebookresearch/SpinQuant/blob/main/utils/hadamard_utils.py # noqa: E501 Known matrices were retrieved from N. J. A. Sloane's Library of Hadamard Matrices http://www.neilsloane.com/hadamard/ # noqa: E501