liangsu9988 commited on
Commit
7cd1913
·
verified ·
1 Parent(s): afb1868

Promote latest kernel artifacts to main

Browse files
README.md DELETED
@@ -1,9 +0,0 @@
1
- # flashrt/turboquant-kv
2
-
3
- This repository is a compatibility mirror for older `kernels` clients
4
- that resolve repositories through the default Hugging Face model repo API.
5
-
6
- Canonical Kernel Hub repo: https://huggingface.co/kernels/flashrt/turboquant-kv
7
-
8
- Do not edit this mirror by hand. It is generated from the Kernel Hub
9
- `vN` branches and contains the same `build/**` artifacts.
 
 
 
 
 
 
 
 
 
 
build/torch211-cxx11-cu130-aarch64-linux/__init__.py ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """FlashRT TurboQuant KV cache kernels."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Optional
6
+
7
+ import torch
8
+
9
+ from ._ops import add_op_namespace_prefix, ops
10
+
11
+
12
+ def _check_packed(k_idx: torch.Tensor, k_qjl: torch.Tensor, v_idx: torch.Tensor) -> int:
13
+ if k_idx.dim() != 2 or k_idx.shape[1] != 128:
14
+ raise RuntimeError("k_idx_packed must have shape (M, 128)")
15
+ m = k_idx.shape[0]
16
+ if k_qjl.shape != (m, 32):
17
+ raise RuntimeError("k_qjl_packed must have shape (M, 32)")
18
+ if v_idx.shape != (m, 128):
19
+ raise RuntimeError("v_idx_packed must have shape (M, 128)")
20
+ return m
21
+
22
+
23
+ @torch.library.register_fake(add_op_namespace_prefix("unpack_packed_bf16"))
24
+ def _unpack_packed_bf16_fake(
25
+ k_idx_packed: torch.Tensor,
26
+ k_qjl_packed: torch.Tensor,
27
+ v_idx_packed: torch.Tensor,
28
+ cb_k_mse: torch.Tensor,
29
+ cb_v: torch.Tensor,
30
+ b_k_mse: int,
31
+ b_v: int,
32
+ y_k: torch.Tensor,
33
+ qjl_bf: torch.Tensor,
34
+ y_v: torch.Tensor,
35
+ ) -> None:
36
+ m = _check_packed(k_idx_packed, k_qjl_packed, v_idx_packed)
37
+ if y_k.shape != (m, 256) or qjl_bf.shape != (m, 256) or y_v.shape != (m, 256):
38
+ raise RuntimeError("outputs must have shape (M, 256)")
39
+ return None
40
+
41
+
42
+ @torch.library.register_fake(add_op_namespace_prefix("unpack_packed_mixed"))
43
+ def _unpack_packed_mixed_fake(
44
+ k_idx_packed: torch.Tensor,
45
+ k_qjl_packed: torch.Tensor,
46
+ v_idx_packed: torch.Tensor,
47
+ cb_k_mse: torch.Tensor,
48
+ cb_v: torch.Tensor,
49
+ b_k_mse: int,
50
+ b_v: int,
51
+ y_k: torch.Tensor,
52
+ qjl_f: torch.Tensor,
53
+ y_v: torch.Tensor,
54
+ ) -> None:
55
+ m = _check_packed(k_idx_packed, k_qjl_packed, v_idx_packed)
56
+ if y_k.shape != (m, 256) or qjl_f.shape != (m, 256) or y_v.shape != (m, 256):
57
+ raise RuntimeError("outputs must have shape (M, 256)")
58
+ return None
59
+
60
+
61
+ @torch.library.register_fake(add_op_namespace_prefix("combine_kv_bf16"))
62
+ def _combine_kv_bf16_fake(
63
+ k_mse: torch.Tensor,
64
+ k_qjl: torch.Tensor,
65
+ v_unit: torch.Tensor,
66
+ k_norm: torch.Tensor,
67
+ k_rnorm: torch.Tensor,
68
+ v_norm: torch.Tensor,
69
+ coef: float,
70
+ k_out: torch.Tensor,
71
+ v_out: torch.Tensor,
72
+ ) -> None:
73
+ if k_mse.dim() != 2 or k_mse.shape[1] != 256:
74
+ raise RuntimeError("k_mse must have shape (M, 256)")
75
+ m = k_mse.shape[0]
76
+ if k_qjl.shape != k_mse.shape or v_unit.shape != k_mse.shape:
77
+ raise RuntimeError("k_qjl and v_unit must have shape (M, 256)")
78
+ if k_norm.shape != (m,) or k_rnorm.shape != (m,) or v_norm.shape != (m,):
79
+ raise RuntimeError("norm tensors must have shape (M,)")
80
+ if k_out.shape != k_mse.shape or v_out.shape != k_mse.shape:
81
+ raise RuntimeError("outputs must have shape (M, 256)")
82
+ return None
83
+
84
+
85
+ def unpack_packed_bf16(
86
+ k_idx_packed: torch.Tensor,
87
+ k_qjl_packed: torch.Tensor,
88
+ v_idx_packed: torch.Tensor,
89
+ cb_k_mse: torch.Tensor,
90
+ cb_v: torch.Tensor,
91
+ b_k_mse: int,
92
+ b_v: int,
93
+ *,
94
+ y_k: Optional[torch.Tensor] = None,
95
+ qjl_bf: Optional[torch.Tensor] = None,
96
+ y_v: Optional[torch.Tensor] = None,
97
+ ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
98
+ """Unpack TurboQuant packed indices to BF16 `(M, 256)` tensors."""
99
+
100
+ m = k_idx_packed.shape[0]
101
+ if y_k is None:
102
+ y_k = torch.empty((m, 256), device=k_idx_packed.device, dtype=torch.bfloat16)
103
+ if qjl_bf is None:
104
+ qjl_bf = torch.empty_like(y_k)
105
+ if y_v is None:
106
+ y_v = torch.empty_like(y_k)
107
+ ops.unpack_packed_bf16(
108
+ k_idx_packed, k_qjl_packed, v_idx_packed, cb_k_mse, cb_v,
109
+ int(b_k_mse), int(b_v), y_k, qjl_bf, y_v,
110
+ )
111
+ return y_k, qjl_bf, y_v
112
+
113
+
114
+ def unpack_packed_mixed(
115
+ k_idx_packed: torch.Tensor,
116
+ k_qjl_packed: torch.Tensor,
117
+ v_idx_packed: torch.Tensor,
118
+ cb_k_mse: torch.Tensor,
119
+ cb_v: torch.Tensor,
120
+ b_k_mse: int,
121
+ b_v: int,
122
+ *,
123
+ y_k: Optional[torch.Tensor] = None,
124
+ qjl_f: Optional[torch.Tensor] = None,
125
+ y_v: Optional[torch.Tensor] = None,
126
+ ) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
127
+ """Unpack packed K/V to BF16 K/V and FP32 QJL signs."""
128
+
129
+ m = k_idx_packed.shape[0]
130
+ if y_k is None:
131
+ y_k = torch.empty((m, 256), device=k_idx_packed.device, dtype=torch.bfloat16)
132
+ if qjl_f is None:
133
+ qjl_f = torch.empty((m, 256), device=k_idx_packed.device, dtype=torch.float32)
134
+ if y_v is None:
135
+ y_v = torch.empty_like(y_k)
136
+ ops.unpack_packed_mixed(
137
+ k_idx_packed, k_qjl_packed, v_idx_packed, cb_k_mse, cb_v,
138
+ int(b_k_mse), int(b_v), y_k, qjl_f, y_v,
139
+ )
140
+ return y_k, qjl_f, y_v
141
+
142
+
143
+ def combine_kv_bf16(
144
+ k_mse: torch.Tensor,
145
+ k_qjl: torch.Tensor,
146
+ v_unit: torch.Tensor,
147
+ k_norm: torch.Tensor,
148
+ k_rnorm: torch.Tensor,
149
+ v_norm: torch.Tensor,
150
+ coef: float,
151
+ *,
152
+ k_out: Optional[torch.Tensor] = None,
153
+ v_out: Optional[torch.Tensor] = None,
154
+ ) -> tuple[torch.Tensor, torch.Tensor]:
155
+ """Combine TurboQuant K/V GEMM outputs into BF16 K/V cache tensors."""
156
+
157
+ if k_out is None:
158
+ k_out = torch.empty_like(k_mse)
159
+ if v_out is None:
160
+ v_out = torch.empty_like(v_unit)
161
+ ops.combine_kv_bf16(k_mse, k_qjl, v_unit, k_norm, k_rnorm, v_norm, float(coef), k_out, v_out)
162
+ return k_out, v_out
163
+
164
+
165
+ __all__ = [
166
+ "combine_kv_bf16",
167
+ "unpack_packed_bf16",
168
+ "unpack_packed_mixed",
169
+ ]
build/torch211-cxx11-cu130-aarch64-linux/_ops.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import torch
2
+ from . import _turboquant_kv_cuda_5596053
3
+ ops = torch.ops._turboquant_kv_cuda_5596053
4
+
5
+ def add_op_namespace_prefix(op_name: str):
6
+ return f"_turboquant_kv_cuda_5596053::{op_name}"
build/torch211-cxx11-cu130-aarch64-linux/_turboquant_kv_cuda_5596053.abi3.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ed15d93ce43ac00480ce799f56cce8e317f6493c7a8c0d62a381c9135be4d84f
3
+ size 245184
build/torch211-cxx11-cu130-aarch64-linux/metadata.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "turboquant-kv",
3
+ "id": "_turboquant_kv_cuda_5596053",
4
+ "version": 1,
5
+ "license": "Apache-2.0",
6
+ "python-depends": [],
7
+ "backend": {
8
+ "type": "cuda",
9
+ "archs": [
10
+ "11.0"
11
+ ]
12
+ },
13
+ "digest": {
14
+ "algorithm": "sha256",
15
+ "files": {
16
+ "__init__.py": "MRfXnYiu3ykN9lvSL/DKIK2TADkUKewmrj0CQynXZ0Y=",
17
+ "_turboquant_kv_cuda_5596053.abi3.so": "7RXZPOQ6wASAznmfVszo4xf2STx6jA1io4HJE1vk2E8=",
18
+ "_ops.py": "CB2L++MoBdyPQaPTodj5z5qaB08olDjuhe9ZAiApjG0=",
19
+ "turboquant_kv/__init__.py": "v6p5XMfQzddhi1fLSAw4HX9CyS0rQsidvu9VsT01xi4="
20
+ }
21
+ }
22
+ }
build/torch211-cxx11-cu130-aarch64-linux/turboquant_kv/__init__.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ctypes
2
+ import importlib.util
3
+ import sys
4
+ from pathlib import Path
5
+
6
+ def _import_from_path(file_path: Path):
7
+ path_hash = '{:x}'.format(ctypes.c_size_t(hash(file_path.absolute())).value)
8
+ spec = importlib.util.spec_from_file_location(path_hash, file_path)
9
+ module = importlib.util.module_from_spec(spec)
10
+ sys.modules[path_hash] = module
11
+ spec.loader.exec_module(module)
12
+ return module
13
+
14
+ globals().update(vars(_import_from_path(Path(__file__).parent.parent / '__init__.py')))