Promote latest kernel artifacts to main
Browse files- README.md +0 -9
- build/torch211-cxx11-cu130-aarch64-linux/__init__.py +169 -0
- build/torch211-cxx11-cu130-aarch64-linux/_ops.py +6 -0
- build/torch211-cxx11-cu130-aarch64-linux/_turboquant_kv_cuda_5596053.abi3.so +3 -0
- build/torch211-cxx11-cu130-aarch64-linux/metadata.json +22 -0
- build/torch211-cxx11-cu130-aarch64-linux/turboquant_kv/__init__.py +14 -0
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')))
|