Promote latest kernel artifacts to main
Browse files- README.md +125 -6
- build/torch211-cxx11-cu128-x86_64-linux/__init__.py +140 -0
- build/torch211-cxx11-cu128-x86_64-linux/{_fp4_fused_ops_cuda_8cf8928_dirty.abi3.so → _fp4_fused_ops_cuda_92c4b99.abi3.so} +2 -2
- build/torch211-cxx11-cu128-x86_64-linux/_ops.py +3 -6
- build/torch211-cxx11-cu128-x86_64-linux/fp4_fused_ops/__init__.py +6 -18
- build/torch211-cxx11-cu128-x86_64-linux/metadata.json +16 -6
- build/torch211-cxx11-cu130-aarch64-linux/__init__.py +140 -0
- build/torch211-cxx11-cu130-aarch64-linux/{fp4_fused_ops_source_test.abi3.so → _fp4_fused_ops_cuda_92c4b99.abi3.so} +2 -2
- build/torch211-cxx11-cu130-aarch64-linux/_ops.py +3 -3
- build/torch211-cxx11-cu130-aarch64-linux/metadata.json +5 -5
- build/torch211-cxx11-cu130-x86_64-linux/__init__.py +140 -0
- build/torch211-cxx11-cu130-x86_64-linux/{_fp4_fused_ops_cuda_8cf8928_dirty.abi3.so → _fp4_fused_ops_cuda_92c4b99.abi3.so} +2 -2
- build/torch211-cxx11-cu130-x86_64-linux/_ops.py +3 -6
- build/torch211-cxx11-cu130-x86_64-linux/fp4_fused_ops/__init__.py +6 -18
- build/torch211-cxx11-cu130-x86_64-linux/metadata.json +16 -7
- build/torch213-cxx11-cu130-aarch64-linux/{fp4_fused_ops_source_test.abi3.so → _fp4_fused_ops_cuda_92c4b99.abi3.so} +2 -2
- build/torch213-cxx11-cu130-aarch64-linux/_ops.py +3 -3
- build/torch213-cxx11-cu130-aarch64-linux/metadata.json +5 -5
README.md
CHANGED
|
@@ -1,9 +1,128 @@
|
|
| 1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
-
|
| 4 |
-
that resolve repositories through the default Hugging Face model repo API.
|
| 5 |
|
| 6 |
-
|
|
|
|
| 7 |
|
| 8 |
-
|
| 9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
library_name: kernels
|
| 3 |
+
license: apache-2.0
|
| 4 |
+
tags:
|
| 5 |
+
- cuda
|
| 6 |
+
- native-cuda
|
| 7 |
+
- blackwell
|
| 8 |
+
- nvfp4
|
| 9 |
+
- transformers
|
| 10 |
+
- diffusers
|
| 11 |
+
---
|
| 12 |
|
| 13 |
+
# fp4-fused-ops
|
|
|
|
| 14 |
|
| 15 |
+
FlashRT fused FP16-to-NVFP4 producer kernels for keeping low-bit transformer
|
| 16 |
+
and diffuser paths continuous.
|
| 17 |
|
| 18 |
+
The source kernels use the CUTLASS SM100-family block-scale layout shared by
|
| 19 |
+
SM110 and SM120. Published artifacts are architecture-specific. Native Thor
|
| 20 |
+
artifacts cover Torch 2.11 and 2.13 with CUDA 13.0 and are validated on Jetson
|
| 21 |
+
AGX Thor before upload.
|
| 22 |
+
|
| 23 |
+
These kernels turn FP16 residual/norm/gated activations directly into NVFP4
|
| 24 |
+
packed tensors plus CUTLASS-compatible SFA scale-factor buffers. They are meant
|
| 25 |
+
to feed adjacent FP4 GEMM kernels without returning to PyTorch elementwise
|
| 26 |
+
chains.
|
| 27 |
+
|
| 28 |
+
## Available Functions
|
| 29 |
+
|
| 30 |
+
- `sfa_size_bytes(rows, dim, is_sfb=False)`
|
| 31 |
+
- `rms_norm_fp4_sfa_fp16(x, packed=None, sfa=None)`
|
| 32 |
+
- `residual_add_rms_norm_fp4_sfa_fp16(residual, x, packed=None, sfa=None)`
|
| 33 |
+
- `residual_add_rms_norm_fp4_sfa_v2_fp16(residual, x, packed=None, sfa=None)`
|
| 34 |
+
- `residual_add_rms_norm_mul_fp4_sfa_fp16(residual, x, inv_s, packed=None, sfa=None)`
|
| 35 |
+
- `silu_mul_fp4_sfa_fp16(merged, packed=None, sfa=None)`
|
| 36 |
+
- `silu_mul_fp4_sfa_v2_fp16(merged, packed=None, sfa=None)`
|
| 37 |
+
- `silu_mul_mul_fp4_sfa_v2_fp16(merged, inv_s, packed=None, sfa=None)`
|
| 38 |
+
- `silu_mul_two_fp4_to_fp4(gate_packed, gate_sfa, up_packed, up_sfa, out_packed=None, out_sfa=None)`
|
| 39 |
+
- `silu_mul_two_mul_fp4_to_fp4(gate_packed, gate_sfa, up_packed, up_sfa, inv_s, out_packed=None, out_sfa=None)`
|
| 40 |
+
- `adaptive_rms_norm_nvfp4_fp16(x, style, packed=None, sfa=None, gate=None)`
|
| 41 |
+
- `gated_residual_adaptive_rms_norm_nvfp4_fp16(x, previous_gate, residual, style, ...)`
|
| 42 |
+
- `adaptive_rms_norm_nvfp4_bf16(x, style, packed=None, sfa=None, gate=None)`
|
| 43 |
+
- `gated_residual_adaptive_rms_norm_nvfp4_bf16(x, previous_gate, residual, style, ...)`
|
| 44 |
+
- `ada_rms_norm_quant_nvfp4_swizzled_fp16(...)` / `ada_rms_norm_quant_nvfp4_swizzled_bf16(...)`
|
| 45 |
+
- `gate_res_ada_rms_norm_quant_nvfp4_swizzled_fp16(...)` / `gate_res_ada_rms_norm_quant_nvfp4_swizzled_bf16(...)`
|
| 46 |
+
- `adaptive_rms_norm_fp8_static_fp16(x, style, scale, out=None, gate=None)`
|
| 47 |
+
- `gate_res_ada_rms_norm_quant_fp8_static_fp16(x, previous_gate, residual, style, scale, ...)`
|
| 48 |
+
- `adaptive_rms_norm_e0m3_fp16(x, style, use_rht=False, ...)`
|
| 49 |
+
- `gated_residual_adaptive_rms_norm_e0m3_fp16(x, previous_gate, residual, style, use_rht=False, ...)`
|
| 50 |
+
- `gelu_mul_e0m3_fp16(merged, use_rht=False, ...)`
|
| 51 |
+
- `residual_add_rms_norm_quant_nvfp4_swizzled_bf16(residual, x, weight, eps=1e-6, ...)`
|
| 52 |
+
- `relu2_quant_nvfp4_swizzled_fp16(x, ...)`
|
| 53 |
+
- `layer_norm_fp8_fp16(x, gamma, beta, eps=1e-5, out=None)`
|
| 54 |
+
- `layer_norm_nvfp4_fp16(x, gamma, beta, inv_s=None, eps=1e-5, ...)`
|
| 55 |
+
- `gelu_mul_nvfp4_fp16(merged, packed=None, sfa=None)`
|
| 56 |
+
- `dequantize_fp4_sfa_fp16(packed, sfa, out=None)`
|
| 57 |
+
- `quantize_bf16_to_nvfp4_linear(input, packed=None, scale_factors=None)`
|
| 58 |
+
- `rms_silu_nvfp4_ndhwc_bf16(x, gamma, awq_inv_scale=None, eps=1e-6, packed=None, scale_factors=None)`
|
| 59 |
+
- `bf16_rms_norm_ncdhw(x, gamma, bias=None, eps=1e-6, out=None)`
|
| 60 |
+
- `bf16_rms_silu_ncdhw(x, gamma, prev_cache=None, eps=1e-6, out=None, next_cache=None)`
|
| 61 |
+
|
| 62 |
+
Tensor contract:
|
| 63 |
+
|
| 64 |
+
- FP16 producer inputs are contiguous CUDA tensors.
|
| 65 |
+
- Packed FP4 tensors are `torch.uint8` with shape `(rows, dim / 2)`.
|
| 66 |
+
- SFA tensors are one-dimensional `torch.uint8` buffers sized by
|
| 67 |
+
`sfa_size_bytes(rows, dim, False, device=...)`.
|
| 68 |
+
- `residual_add_*` updates `residual` in place.
|
| 69 |
+
- `silu_mul_*` expects `merged` shape `(rows, 2 * hidden)`.
|
| 70 |
+
- v1 shared-memory RMS producers support `dim <= 2048`; larger RMS producer
|
| 71 |
+
shapes should use `residual_add_rms_norm_fp4_sfa_v2_fp16`.
|
| 72 |
+
- All dimensions must be divisible by 16. Unsupported shapes raise instead of
|
| 73 |
+
silently taking a slow or partial path.
|
| 74 |
+
- Adaptive RMSNorm producers require `dim=1024`; `style` is `(rows, 3 * dim)`
|
| 75 |
+
containing scale, shift, and gate. FP16 and BF16 input/gate contracts are
|
| 76 |
+
separate additive entry points; neither silently casts.
|
| 77 |
+
- Automatically allocated SFA buffers are zero-initialized because CUTLASS
|
| 78 |
+
tile padding is intentionally not written by every producer.
|
| 79 |
+
- Linear NVFP4 uses E2M1 values and linear UE4M3 scale bytes per 16 channels.
|
| 80 |
+
- E0M3 APIs use the uniform signed-int4 codebook with optional per-16
|
| 81 |
+
orthonormal Hadamard rotation; their packed/SFA layout is GEMM-compatible
|
| 82 |
+
but their values must not be decoded as E2M1.
|
| 83 |
+
- NCDHW RMS kernels accept BF16 `(B,C,T,H,W)`, even `C <= 1024`; the fused
|
| 84 |
+
NVFP4 producer requires `C % 128 == 0`.
|
| 85 |
+
|
| 86 |
+
## Minimal Usage
|
| 87 |
+
|
| 88 |
+
```python
|
| 89 |
+
from kernels import get_kernel
|
| 90 |
+
import torch
|
| 91 |
+
|
| 92 |
+
ops = get_kernel("flashrt/fp4-fused-ops", version=1, trust_remote_code=True)
|
| 93 |
+
|
| 94 |
+
merged = torch.randn((16, 4096), device="cuda", dtype=torch.float16)
|
| 95 |
+
packed, sfa = ops.silu_mul_fp4_sfa_v2_fp16(merged)
|
| 96 |
+
|
| 97 |
+
# Optional debug/validation path. The hot path should pass packed/SFA directly
|
| 98 |
+
# to the adjacent FP4 GEMM instead of dequantizing.
|
| 99 |
+
dequant = ops.dequantize_fp4_sfa_fp16(packed, sfa)
|
| 100 |
+
|
| 101 |
+
video = torch.randn((1, 128, 5, 9, 11), device="cuda", dtype=torch.bfloat16)
|
| 102 |
+
gamma = torch.ones((128,), device="cuda", dtype=torch.bfloat16)
|
| 103 |
+
packed_video, linear_scales = ops.rms_silu_nvfp4_ndhwc_bf16(video, gamma)
|
| 104 |
+
```
|
| 105 |
+
|
| 106 |
+
## Validation
|
| 107 |
+
|
| 108 |
+
```bash
|
| 109 |
+
python fp4-fused-ops/tests/test_fp4_fused_ops.py --backend source --mode full
|
| 110 |
+
python fp4-fused-ops/benchmarks/benchmark.py --mode headline
|
| 111 |
+
|
| 112 |
+
# Thor production-model rows
|
| 113 |
+
python fp4-fused-ops/tests/test_fp4_fused_ops.py --backend installed \
|
| 114 |
+
--mode thor-models \
|
| 115 |
+
--artifact fp4-fused-ops/build/torch211-cxx11-cu130-aarch64-linux
|
| 116 |
+
python fp4-fused-ops/benchmarks/benchmark.py --backend installed \
|
| 117 |
+
--mode thor-models \
|
| 118 |
+
--artifact fp4-fused-ops/build/torch211-cxx11-cu130-aarch64-linux
|
| 119 |
+
```
|
| 120 |
+
|
| 121 |
+
Validation checks:
|
| 122 |
+
|
| 123 |
+
- in-place residual updates match the FP16 math contract exactly;
|
| 124 |
+
- FP4/SFA outputs dequantize within the documented NVFP4 quantization error
|
| 125 |
+
envelope;
|
| 126 |
+
- v2 fast paths are checked against v1 where the v1 kernel is valid;
|
| 127 |
+
- unsupported shapes are rejected explicitly.
|
| 128 |
+
- new NCDHW/cache outputs and linear NVFP4 bytes match raw launchers bitwise.
|
build/torch211-cxx11-cu128-x86_64-linux/__init__.py
CHANGED
|
@@ -87,6 +87,36 @@ def _silu_two_mul_fake(
|
|
| 87 |
return None
|
| 88 |
|
| 89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
@torch.library.register_fake(add_op_namespace_prefix("dequantize_fp4_sfa_fp16"))
|
| 91 |
def _dequant_fake(packed: torch.Tensor, sfa: torch.Tensor, out: torch.Tensor) -> None:
|
| 92 |
return None
|
|
@@ -319,6 +349,110 @@ def silu_mul_two_mul_fp4_to_fp4(
|
|
| 319 |
return out_packed, out_sfa
|
| 320 |
|
| 321 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 322 |
def adaptive_rms_norm_nvfp4_fp16(
|
| 323 |
x: torch.Tensor,
|
| 324 |
style: torch.Tensor,
|
|
@@ -802,13 +936,19 @@ __all__ = [
|
|
| 802 |
"gate_res_ada_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 803 |
"gate_res_ada_rms_norm_quant_fp8_static_fp16",
|
| 804 |
"gelu_mul_nvfp4_fp16",
|
|
|
|
|
|
|
| 805 |
"gelu_mul_e0m3_fp16",
|
| 806 |
"layer_norm_fp8_fp16",
|
|
|
|
| 807 |
"layer_norm_nvfp4_fp16",
|
|
|
|
| 808 |
"quantize_bf16_to_nvfp4_linear",
|
| 809 |
"residual_add_rms_norm_fp4_sfa_fp16",
|
| 810 |
"residual_add_rms_norm_fp4_sfa_v2_fp16",
|
| 811 |
"residual_add_rms_norm_mul_fp4_sfa_fp16",
|
|
|
|
|
|
|
| 812 |
"residual_add_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 813 |
"rms_norm_fp4_sfa_fp16",
|
| 814 |
"rms_silu_nvfp4_ndhwc_bf16",
|
|
|
|
| 87 |
return None
|
| 88 |
|
| 89 |
|
| 90 |
+
@torch.library.register_fake(add_op_namespace_prefix("geglu_two_mul_nvfp4_native"))
|
| 91 |
+
def _geglu_two_native_fake(gate_packed, gate_sfa, up_packed, up_sfa, inv_s, out_packed, out_sfa) -> None:
|
| 92 |
+
return None
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
@torch.library.register_fake(add_op_namespace_prefix("gelu_mul_nvfp4_bf16"))
|
| 96 |
+
def _gelu_mul_bf16_fake(merged, inv_s, packed, sfa) -> None:
|
| 97 |
+
return None
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
@torch.library.register_fake(add_op_namespace_prefix("rms_norm_mul_nvfp4_bf16"))
|
| 101 |
+
def _rms_mul_bf16_fake(x, inv_s, eps: float, packed, sfa) -> None:
|
| 102 |
+
return None
|
| 103 |
+
|
| 104 |
+
|
| 105 |
+
@torch.library.register_fake(add_op_namespace_prefix("residual_add_rms_norm_nvfp4_bf16"))
|
| 106 |
+
def _res_rms_bf16_fake(residual, x, inv_s, eps: float, packed, sfa) -> None:
|
| 107 |
+
return None
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
@torch.library.register_fake(add_op_namespace_prefix("layer_norm_fp8_bf16"))
|
| 111 |
+
def _layer_norm_fp8_bf16_fake(x, gamma, beta, eps: float, out) -> None:
|
| 112 |
+
return None
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
@torch.library.register_fake(add_op_namespace_prefix("layer_norm_nvfp4_bf16"))
|
| 116 |
+
def _layer_norm_nvfp4_bf16_fake(x, gamma, beta, inv_s, eps: float, packed, sfa) -> None:
|
| 117 |
+
return None
|
| 118 |
+
|
| 119 |
+
|
| 120 |
@torch.library.register_fake(add_op_namespace_prefix("dequantize_fp4_sfa_fp16"))
|
| 121 |
def _dequant_fake(packed: torch.Tensor, sfa: torch.Tensor, out: torch.Tensor) -> None:
|
| 122 |
return None
|
|
|
|
| 349 |
return out_packed, out_sfa
|
| 350 |
|
| 351 |
|
| 352 |
+
def geglu_two_mul_nvfp4_native(
|
| 353 |
+
gate_packed: torch.Tensor,
|
| 354 |
+
gate_sfa: torch.Tensor,
|
| 355 |
+
up_packed: torch.Tensor,
|
| 356 |
+
up_sfa: torch.Tensor,
|
| 357 |
+
inv_s: torch.Tensor,
|
| 358 |
+
out_packed: torch.Tensor | None = None,
|
| 359 |
+
out_sfa: torch.Tensor | None = None,
|
| 360 |
+
):
|
| 361 |
+
"""Native-E2M1 LUT GeGLU combiner for split gate/up FP4 outputs."""
|
| 362 |
+
hidden = gate_packed.shape[1] * 2
|
| 363 |
+
if out_packed is None or out_sfa is None:
|
| 364 |
+
out_packed, out_sfa = _alloc_fp4(
|
| 365 |
+
gate_packed.shape[0], hidden, gate_packed.device
|
| 366 |
+
)
|
| 367 |
+
ops.geglu_two_mul_nvfp4_native(
|
| 368 |
+
gate_packed, gate_sfa, up_packed, up_sfa, inv_s,
|
| 369 |
+
out_packed, out_sfa
|
| 370 |
+
)
|
| 371 |
+
return out_packed, out_sfa
|
| 372 |
+
|
| 373 |
+
|
| 374 |
+
def gelu_mul_nvfp4_bf16(
|
| 375 |
+
merged: torch.Tensor,
|
| 376 |
+
inv_s: torch.Tensor | None = None,
|
| 377 |
+
*,
|
| 378 |
+
packed: torch.Tensor | None = None,
|
| 379 |
+
sfa: torch.Tensor | None = None,
|
| 380 |
+
):
|
| 381 |
+
"""BF16 GeGLU producer with optional per-channel scaling and NVFP4 output."""
|
| 382 |
+
hidden = merged.shape[1] // 2
|
| 383 |
+
if packed is None or sfa is None:
|
| 384 |
+
packed, sfa = _alloc_fp4(merged.shape[0], hidden, merged.device)
|
| 385 |
+
ops.gelu_mul_nvfp4_bf16(merged, inv_s, packed, sfa)
|
| 386 |
+
return packed, sfa
|
| 387 |
+
|
| 388 |
+
|
| 389 |
+
def rms_norm_mul_nvfp4_bf16(
|
| 390 |
+
x: torch.Tensor,
|
| 391 |
+
inv_s: torch.Tensor,
|
| 392 |
+
eps: float = 1e-6,
|
| 393 |
+
*,
|
| 394 |
+
packed: torch.Tensor | None = None,
|
| 395 |
+
sfa: torch.Tensor | None = None,
|
| 396 |
+
):
|
| 397 |
+
"""BF16 RMSNorm, channel scaling, and native NVFP4 production."""
|
| 398 |
+
if packed is None or sfa is None:
|
| 399 |
+
packed, sfa = _alloc_fp4(x.shape[0], x.shape[1], x.device)
|
| 400 |
+
ops.rms_norm_mul_nvfp4_bf16(x, inv_s, float(eps), packed, sfa)
|
| 401 |
+
return packed, sfa
|
| 402 |
+
|
| 403 |
+
|
| 404 |
+
def residual_add_rms_norm_nvfp4_bf16(
|
| 405 |
+
residual: torch.Tensor,
|
| 406 |
+
x: torch.Tensor,
|
| 407 |
+
inv_s: torch.Tensor | None = None,
|
| 408 |
+
eps: float = 1e-6,
|
| 409 |
+
*,
|
| 410 |
+
packed: torch.Tensor | None = None,
|
| 411 |
+
sfa: torch.Tensor | None = None,
|
| 412 |
+
):
|
| 413 |
+
"""Update a BF16 residual, RMS-normalize, and produce native NVFP4."""
|
| 414 |
+
if packed is None or sfa is None:
|
| 415 |
+
packed, sfa = _alloc_fp4(x.shape[0], x.shape[1], x.device)
|
| 416 |
+
ops.residual_add_rms_norm_nvfp4_bf16(
|
| 417 |
+
residual, x, inv_s, float(eps), packed, sfa
|
| 418 |
+
)
|
| 419 |
+
return residual, packed, sfa
|
| 420 |
+
|
| 421 |
+
|
| 422 |
+
def layer_norm_fp8_bf16(
|
| 423 |
+
x: torch.Tensor,
|
| 424 |
+
gamma: torch.Tensor,
|
| 425 |
+
beta: torch.Tensor,
|
| 426 |
+
eps: float = 1e-6,
|
| 427 |
+
*,
|
| 428 |
+
out: torch.Tensor | None = None,
|
| 429 |
+
) -> torch.Tensor:
|
| 430 |
+
"""Vectorized BF16 LayerNorm producer with FP8 E4M3 output."""
|
| 431 |
+
if out is None:
|
| 432 |
+
out = torch.empty_like(x, dtype=torch.float8_e4m3fn)
|
| 433 |
+
ops.layer_norm_fp8_bf16(x, gamma, beta, float(eps), out)
|
| 434 |
+
return out
|
| 435 |
+
|
| 436 |
+
|
| 437 |
+
def layer_norm_nvfp4_bf16(
|
| 438 |
+
x: torch.Tensor,
|
| 439 |
+
gamma: torch.Tensor,
|
| 440 |
+
beta: torch.Tensor,
|
| 441 |
+
inv_s: torch.Tensor | None = None,
|
| 442 |
+
eps: float = 1e-6,
|
| 443 |
+
*,
|
| 444 |
+
packed: torch.Tensor | None = None,
|
| 445 |
+
sfa: torch.Tensor | None = None,
|
| 446 |
+
):
|
| 447 |
+
"""Vectorized BF16 LayerNorm producer with native NVFP4 output."""
|
| 448 |
+
if packed is None or sfa is None:
|
| 449 |
+
packed, sfa = _alloc_fp4(x.shape[0], x.shape[1], x.device)
|
| 450 |
+
ops.layer_norm_nvfp4_bf16(
|
| 451 |
+
x, gamma, beta, inv_s, float(eps), packed, sfa
|
| 452 |
+
)
|
| 453 |
+
return packed, sfa
|
| 454 |
+
|
| 455 |
+
|
| 456 |
def adaptive_rms_norm_nvfp4_fp16(
|
| 457 |
x: torch.Tensor,
|
| 458 |
style: torch.Tensor,
|
|
|
|
| 936 |
"gate_res_ada_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 937 |
"gate_res_ada_rms_norm_quant_fp8_static_fp16",
|
| 938 |
"gelu_mul_nvfp4_fp16",
|
| 939 |
+
"gelu_mul_nvfp4_bf16",
|
| 940 |
+
"geglu_two_mul_nvfp4_native",
|
| 941 |
"gelu_mul_e0m3_fp16",
|
| 942 |
"layer_norm_fp8_fp16",
|
| 943 |
+
"layer_norm_fp8_bf16",
|
| 944 |
"layer_norm_nvfp4_fp16",
|
| 945 |
+
"layer_norm_nvfp4_bf16",
|
| 946 |
"quantize_bf16_to_nvfp4_linear",
|
| 947 |
"residual_add_rms_norm_fp4_sfa_fp16",
|
| 948 |
"residual_add_rms_norm_fp4_sfa_v2_fp16",
|
| 949 |
"residual_add_rms_norm_mul_fp4_sfa_fp16",
|
| 950 |
+
"residual_add_rms_norm_nvfp4_bf16",
|
| 951 |
+
"rms_norm_mul_nvfp4_bf16",
|
| 952 |
"residual_add_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 953 |
"rms_norm_fp4_sfa_fp16",
|
| 954 |
"rms_silu_nvfp4_ndhwc_bf16",
|
build/torch211-cxx11-cu128-x86_64-linux/{_fp4_fused_ops_cuda_8cf8928_dirty.abi3.so → _fp4_fused_ops_cuda_92c4b99.abi3.so}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1f0dfb36611d5ce875a5e0296023bb47687c45ce00ebdff93bbb0a039642dceb
|
| 3 |
+
size 1470080
|
build/torch211-cxx11-cu128-x86_64-linux/_ops.py
CHANGED
|
@@ -1,9 +1,6 @@
|
|
| 1 |
import torch
|
| 2 |
-
from . import
|
| 3 |
-
ops = torch.ops.
|
| 4 |
|
| 5 |
def add_op_namespace_prefix(op_name: str):
|
| 6 |
-
""
|
| 7 |
-
Prefix op by namespace.
|
| 8 |
-
"""
|
| 9 |
-
return f"_fp4_fused_ops_cuda_8cf8928_dirty::{op_name}"
|
|
|
|
| 1 |
import torch
|
| 2 |
+
from . import _fp4_fused_ops_cuda_92c4b99
|
| 3 |
+
ops = torch.ops._fp4_fused_ops_cuda_92c4b99
|
| 4 |
|
| 5 |
def add_op_namespace_prefix(op_name: str):
|
| 6 |
+
return f"_fp4_fused_ops_cuda_92c4b99::{op_name}"
|
|
|
|
|
|
|
|
|
build/torch211-cxx11-cu128-x86_64-linux/fp4_fused_ops/__init__.py
CHANGED
|
@@ -2,25 +2,13 @@ import ctypes
|
|
| 2 |
import importlib.util
|
| 3 |
import sys
|
| 4 |
from pathlib import Path
|
| 5 |
-
from types import ModuleType
|
| 6 |
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
# it would also be used for other imports. So, we make a module name that
|
| 11 |
-
# depends on the path for it to be unique using the hex-encoded hash of
|
| 12 |
-
# the path.
|
| 13 |
-
path_hash = "{:x}".format(ctypes.c_size_t(hash(file_path.absolute())).value)
|
| 14 |
-
module_name = path_hash
|
| 15 |
-
spec = importlib.util.spec_from_file_location(module_name, file_path)
|
| 16 |
-
if spec is None:
|
| 17 |
-
raise ImportError(f"Cannot load spec for {module_name} from {file_path}")
|
| 18 |
module = importlib.util.module_from_spec(spec)
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
sys.modules[module_name] = module
|
| 22 |
-
spec.loader.exec_module(module) # type: ignore
|
| 23 |
return module
|
| 24 |
|
| 25 |
-
|
| 26 |
-
globals().update(vars(_import_from_path(Path(__file__).parent.parent / "__init__.py")))
|
|
|
|
| 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')))
|
|
|
build/torch211-cxx11-cu128-x86_64-linux/metadata.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
{
|
| 2 |
"name": "fp4-fused-ops",
|
| 3 |
-
"id": "
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"python-depends": [],
|
|
@@ -13,10 +13,20 @@
|
|
| 13 |
"digest": {
|
| 14 |
"algorithm": "sha256",
|
| 15 |
"files": {
|
| 16 |
-
"__init__.py": "
|
| 17 |
-
"
|
| 18 |
-
"_ops.py": "
|
| 19 |
-
"fp4_fused_ops/__init__.py": "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
}
|
| 21 |
}
|
| 22 |
-
}
|
|
|
|
| 1 |
{
|
| 2 |
"name": "fp4-fused-ops",
|
| 3 |
+
"id": "_fp4_fused_ops_cuda_92c4b99",
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"python-depends": [],
|
|
|
|
| 13 |
"digest": {
|
| 14 |
"algorithm": "sha256",
|
| 15 |
"files": {
|
| 16 |
+
"__init__.py": "3Bkz49FpbwcatmJVYSwTnKEeRWr1RkkYZowj/l9fJOY=",
|
| 17 |
+
"_fp4_fused_ops_cuda_92c4b99.abi3.so": "Hw37NmEdXOh1peApYCO7R2h8Rc4A69/5O7sKA5ZC3Os=",
|
| 18 |
+
"_ops.py": "I13aTXDYLStDS3cO/5A8MkCfRnBg5EhUFfcIq8Sz8yk=",
|
| 19 |
+
"fp4_fused_ops/__init__.py": "v6p5XMfQzddhi1fLSAw4HX9CyS0rQsidvu9VsT01xi4="
|
| 20 |
+
}
|
| 21 |
+
},
|
| 22 |
+
"provenance": {
|
| 23 |
+
"kernel": {
|
| 24 |
+
"sha": "92c4b991b6f1fbd89744aa6f46f62b1bfac7ca7e",
|
| 25 |
+
"dirty": false
|
| 26 |
+
},
|
| 27 |
+
"validation": {
|
| 28 |
+
"torch": "2.11.0+cu128",
|
| 29 |
+
"cuda": "12.8"
|
| 30 |
}
|
| 31 |
}
|
| 32 |
+
}
|
build/torch211-cxx11-cu130-aarch64-linux/__init__.py
CHANGED
|
@@ -87,6 +87,36 @@ def _silu_two_mul_fake(
|
|
| 87 |
return None
|
| 88 |
|
| 89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
@torch.library.register_fake(add_op_namespace_prefix("dequantize_fp4_sfa_fp16"))
|
| 91 |
def _dequant_fake(packed: torch.Tensor, sfa: torch.Tensor, out: torch.Tensor) -> None:
|
| 92 |
return None
|
|
@@ -319,6 +349,110 @@ def silu_mul_two_mul_fp4_to_fp4(
|
|
| 319 |
return out_packed, out_sfa
|
| 320 |
|
| 321 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 322 |
def adaptive_rms_norm_nvfp4_fp16(
|
| 323 |
x: torch.Tensor,
|
| 324 |
style: torch.Tensor,
|
|
@@ -802,13 +936,19 @@ __all__ = [
|
|
| 802 |
"gate_res_ada_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 803 |
"gate_res_ada_rms_norm_quant_fp8_static_fp16",
|
| 804 |
"gelu_mul_nvfp4_fp16",
|
|
|
|
|
|
|
| 805 |
"gelu_mul_e0m3_fp16",
|
| 806 |
"layer_norm_fp8_fp16",
|
|
|
|
| 807 |
"layer_norm_nvfp4_fp16",
|
|
|
|
| 808 |
"quantize_bf16_to_nvfp4_linear",
|
| 809 |
"residual_add_rms_norm_fp4_sfa_fp16",
|
| 810 |
"residual_add_rms_norm_fp4_sfa_v2_fp16",
|
| 811 |
"residual_add_rms_norm_mul_fp4_sfa_fp16",
|
|
|
|
|
|
|
| 812 |
"residual_add_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 813 |
"rms_norm_fp4_sfa_fp16",
|
| 814 |
"rms_silu_nvfp4_ndhwc_bf16",
|
|
|
|
| 87 |
return None
|
| 88 |
|
| 89 |
|
| 90 |
+
@torch.library.register_fake(add_op_namespace_prefix("geglu_two_mul_nvfp4_native"))
|
| 91 |
+
def _geglu_two_native_fake(gate_packed, gate_sfa, up_packed, up_sfa, inv_s, out_packed, out_sfa) -> None:
|
| 92 |
+
return None
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
@torch.library.register_fake(add_op_namespace_prefix("gelu_mul_nvfp4_bf16"))
|
| 96 |
+
def _gelu_mul_bf16_fake(merged, inv_s, packed, sfa) -> None:
|
| 97 |
+
return None
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
@torch.library.register_fake(add_op_namespace_prefix("rms_norm_mul_nvfp4_bf16"))
|
| 101 |
+
def _rms_mul_bf16_fake(x, inv_s, eps: float, packed, sfa) -> None:
|
| 102 |
+
return None
|
| 103 |
+
|
| 104 |
+
|
| 105 |
+
@torch.library.register_fake(add_op_namespace_prefix("residual_add_rms_norm_nvfp4_bf16"))
|
| 106 |
+
def _res_rms_bf16_fake(residual, x, inv_s, eps: float, packed, sfa) -> None:
|
| 107 |
+
return None
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
@torch.library.register_fake(add_op_namespace_prefix("layer_norm_fp8_bf16"))
|
| 111 |
+
def _layer_norm_fp8_bf16_fake(x, gamma, beta, eps: float, out) -> None:
|
| 112 |
+
return None
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
@torch.library.register_fake(add_op_namespace_prefix("layer_norm_nvfp4_bf16"))
|
| 116 |
+
def _layer_norm_nvfp4_bf16_fake(x, gamma, beta, inv_s, eps: float, packed, sfa) -> None:
|
| 117 |
+
return None
|
| 118 |
+
|
| 119 |
+
|
| 120 |
@torch.library.register_fake(add_op_namespace_prefix("dequantize_fp4_sfa_fp16"))
|
| 121 |
def _dequant_fake(packed: torch.Tensor, sfa: torch.Tensor, out: torch.Tensor) -> None:
|
| 122 |
return None
|
|
|
|
| 349 |
return out_packed, out_sfa
|
| 350 |
|
| 351 |
|
| 352 |
+
def geglu_two_mul_nvfp4_native(
|
| 353 |
+
gate_packed: torch.Tensor,
|
| 354 |
+
gate_sfa: torch.Tensor,
|
| 355 |
+
up_packed: torch.Tensor,
|
| 356 |
+
up_sfa: torch.Tensor,
|
| 357 |
+
inv_s: torch.Tensor,
|
| 358 |
+
out_packed: torch.Tensor | None = None,
|
| 359 |
+
out_sfa: torch.Tensor | None = None,
|
| 360 |
+
):
|
| 361 |
+
"""Native-E2M1 LUT GeGLU combiner for split gate/up FP4 outputs."""
|
| 362 |
+
hidden = gate_packed.shape[1] * 2
|
| 363 |
+
if out_packed is None or out_sfa is None:
|
| 364 |
+
out_packed, out_sfa = _alloc_fp4(
|
| 365 |
+
gate_packed.shape[0], hidden, gate_packed.device
|
| 366 |
+
)
|
| 367 |
+
ops.geglu_two_mul_nvfp4_native(
|
| 368 |
+
gate_packed, gate_sfa, up_packed, up_sfa, inv_s,
|
| 369 |
+
out_packed, out_sfa
|
| 370 |
+
)
|
| 371 |
+
return out_packed, out_sfa
|
| 372 |
+
|
| 373 |
+
|
| 374 |
+
def gelu_mul_nvfp4_bf16(
|
| 375 |
+
merged: torch.Tensor,
|
| 376 |
+
inv_s: torch.Tensor | None = None,
|
| 377 |
+
*,
|
| 378 |
+
packed: torch.Tensor | None = None,
|
| 379 |
+
sfa: torch.Tensor | None = None,
|
| 380 |
+
):
|
| 381 |
+
"""BF16 GeGLU producer with optional per-channel scaling and NVFP4 output."""
|
| 382 |
+
hidden = merged.shape[1] // 2
|
| 383 |
+
if packed is None or sfa is None:
|
| 384 |
+
packed, sfa = _alloc_fp4(merged.shape[0], hidden, merged.device)
|
| 385 |
+
ops.gelu_mul_nvfp4_bf16(merged, inv_s, packed, sfa)
|
| 386 |
+
return packed, sfa
|
| 387 |
+
|
| 388 |
+
|
| 389 |
+
def rms_norm_mul_nvfp4_bf16(
|
| 390 |
+
x: torch.Tensor,
|
| 391 |
+
inv_s: torch.Tensor,
|
| 392 |
+
eps: float = 1e-6,
|
| 393 |
+
*,
|
| 394 |
+
packed: torch.Tensor | None = None,
|
| 395 |
+
sfa: torch.Tensor | None = None,
|
| 396 |
+
):
|
| 397 |
+
"""BF16 RMSNorm, channel scaling, and native NVFP4 production."""
|
| 398 |
+
if packed is None or sfa is None:
|
| 399 |
+
packed, sfa = _alloc_fp4(x.shape[0], x.shape[1], x.device)
|
| 400 |
+
ops.rms_norm_mul_nvfp4_bf16(x, inv_s, float(eps), packed, sfa)
|
| 401 |
+
return packed, sfa
|
| 402 |
+
|
| 403 |
+
|
| 404 |
+
def residual_add_rms_norm_nvfp4_bf16(
|
| 405 |
+
residual: torch.Tensor,
|
| 406 |
+
x: torch.Tensor,
|
| 407 |
+
inv_s: torch.Tensor | None = None,
|
| 408 |
+
eps: float = 1e-6,
|
| 409 |
+
*,
|
| 410 |
+
packed: torch.Tensor | None = None,
|
| 411 |
+
sfa: torch.Tensor | None = None,
|
| 412 |
+
):
|
| 413 |
+
"""Update a BF16 residual, RMS-normalize, and produce native NVFP4."""
|
| 414 |
+
if packed is None or sfa is None:
|
| 415 |
+
packed, sfa = _alloc_fp4(x.shape[0], x.shape[1], x.device)
|
| 416 |
+
ops.residual_add_rms_norm_nvfp4_bf16(
|
| 417 |
+
residual, x, inv_s, float(eps), packed, sfa
|
| 418 |
+
)
|
| 419 |
+
return residual, packed, sfa
|
| 420 |
+
|
| 421 |
+
|
| 422 |
+
def layer_norm_fp8_bf16(
|
| 423 |
+
x: torch.Tensor,
|
| 424 |
+
gamma: torch.Tensor,
|
| 425 |
+
beta: torch.Tensor,
|
| 426 |
+
eps: float = 1e-6,
|
| 427 |
+
*,
|
| 428 |
+
out: torch.Tensor | None = None,
|
| 429 |
+
) -> torch.Tensor:
|
| 430 |
+
"""Vectorized BF16 LayerNorm producer with FP8 E4M3 output."""
|
| 431 |
+
if out is None:
|
| 432 |
+
out = torch.empty_like(x, dtype=torch.float8_e4m3fn)
|
| 433 |
+
ops.layer_norm_fp8_bf16(x, gamma, beta, float(eps), out)
|
| 434 |
+
return out
|
| 435 |
+
|
| 436 |
+
|
| 437 |
+
def layer_norm_nvfp4_bf16(
|
| 438 |
+
x: torch.Tensor,
|
| 439 |
+
gamma: torch.Tensor,
|
| 440 |
+
beta: torch.Tensor,
|
| 441 |
+
inv_s: torch.Tensor | None = None,
|
| 442 |
+
eps: float = 1e-6,
|
| 443 |
+
*,
|
| 444 |
+
packed: torch.Tensor | None = None,
|
| 445 |
+
sfa: torch.Tensor | None = None,
|
| 446 |
+
):
|
| 447 |
+
"""Vectorized BF16 LayerNorm producer with native NVFP4 output."""
|
| 448 |
+
if packed is None or sfa is None:
|
| 449 |
+
packed, sfa = _alloc_fp4(x.shape[0], x.shape[1], x.device)
|
| 450 |
+
ops.layer_norm_nvfp4_bf16(
|
| 451 |
+
x, gamma, beta, inv_s, float(eps), packed, sfa
|
| 452 |
+
)
|
| 453 |
+
return packed, sfa
|
| 454 |
+
|
| 455 |
+
|
| 456 |
def adaptive_rms_norm_nvfp4_fp16(
|
| 457 |
x: torch.Tensor,
|
| 458 |
style: torch.Tensor,
|
|
|
|
| 936 |
"gate_res_ada_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 937 |
"gate_res_ada_rms_norm_quant_fp8_static_fp16",
|
| 938 |
"gelu_mul_nvfp4_fp16",
|
| 939 |
+
"gelu_mul_nvfp4_bf16",
|
| 940 |
+
"geglu_two_mul_nvfp4_native",
|
| 941 |
"gelu_mul_e0m3_fp16",
|
| 942 |
"layer_norm_fp8_fp16",
|
| 943 |
+
"layer_norm_fp8_bf16",
|
| 944 |
"layer_norm_nvfp4_fp16",
|
| 945 |
+
"layer_norm_nvfp4_bf16",
|
| 946 |
"quantize_bf16_to_nvfp4_linear",
|
| 947 |
"residual_add_rms_norm_fp4_sfa_fp16",
|
| 948 |
"residual_add_rms_norm_fp4_sfa_v2_fp16",
|
| 949 |
"residual_add_rms_norm_mul_fp4_sfa_fp16",
|
| 950 |
+
"residual_add_rms_norm_nvfp4_bf16",
|
| 951 |
+
"rms_norm_mul_nvfp4_bf16",
|
| 952 |
"residual_add_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 953 |
"rms_norm_fp4_sfa_fp16",
|
| 954 |
"rms_silu_nvfp4_ndhwc_bf16",
|
build/torch211-cxx11-cu130-aarch64-linux/{fp4_fused_ops_source_test.abi3.so → _fp4_fused_ops_cuda_92c4b99.abi3.so}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:98c2fcc607d2e1ac0f784306a0330b792a3441af1cbc7aa4effc2d954b360bfa
|
| 3 |
+
size 1581160
|
build/torch211-cxx11-cu130-aarch64-linux/_ops.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
import torch
|
| 2 |
-
from . import
|
| 3 |
-
ops = torch.ops.
|
| 4 |
|
| 5 |
def add_op_namespace_prefix(op_name: str):
|
| 6 |
-
return f"
|
|
|
|
| 1 |
import torch
|
| 2 |
+
from . import _fp4_fused_ops_cuda_92c4b99
|
| 3 |
+
ops = torch.ops._fp4_fused_ops_cuda_92c4b99
|
| 4 |
|
| 5 |
def add_op_namespace_prefix(op_name: str):
|
| 6 |
+
return f"_fp4_fused_ops_cuda_92c4b99::{op_name}"
|
build/torch211-cxx11-cu130-aarch64-linux/metadata.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
{
|
| 2 |
"name": "fp4-fused-ops",
|
| 3 |
-
"id": "
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"python-depends": [],
|
|
@@ -13,15 +13,15 @@
|
|
| 13 |
"digest": {
|
| 14 |
"algorithm": "sha256",
|
| 15 |
"files": {
|
| 16 |
-
"__init__.py": "
|
| 17 |
-
"
|
| 18 |
-
"_ops.py": "
|
| 19 |
"fp4_fused_ops/__init__.py": "v6p5XMfQzddhi1fLSAw4HX9CyS0rQsidvu9VsT01xi4="
|
| 20 |
}
|
| 21 |
},
|
| 22 |
"provenance": {
|
| 23 |
"kernel": {
|
| 24 |
-
"sha": "
|
| 25 |
"dirty": false
|
| 26 |
},
|
| 27 |
"validation": {
|
|
|
|
| 1 |
{
|
| 2 |
"name": "fp4-fused-ops",
|
| 3 |
+
"id": "_fp4_fused_ops_cuda_92c4b99",
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"python-depends": [],
|
|
|
|
| 13 |
"digest": {
|
| 14 |
"algorithm": "sha256",
|
| 15 |
"files": {
|
| 16 |
+
"__init__.py": "3Bkz49FpbwcatmJVYSwTnKEeRWr1RkkYZowj/l9fJOY=",
|
| 17 |
+
"_fp4_fused_ops_cuda_92c4b99.abi3.so": "mML8xgfS4awPeEMGoDMLeSo0Qa8cvHqk7/wtlUs2C/o=",
|
| 18 |
+
"_ops.py": "I13aTXDYLStDS3cO/5A8MkCfRnBg5EhUFfcIq8Sz8yk=",
|
| 19 |
"fp4_fused_ops/__init__.py": "v6p5XMfQzddhi1fLSAw4HX9CyS0rQsidvu9VsT01xi4="
|
| 20 |
}
|
| 21 |
},
|
| 22 |
"provenance": {
|
| 23 |
"kernel": {
|
| 24 |
+
"sha": "92c4b991b6f1fbd89744aa6f46f62b1bfac7ca7e",
|
| 25 |
"dirty": false
|
| 26 |
},
|
| 27 |
"validation": {
|
build/torch211-cxx11-cu130-x86_64-linux/__init__.py
CHANGED
|
@@ -87,6 +87,36 @@ def _silu_two_mul_fake(
|
|
| 87 |
return None
|
| 88 |
|
| 89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
@torch.library.register_fake(add_op_namespace_prefix("dequantize_fp4_sfa_fp16"))
|
| 91 |
def _dequant_fake(packed: torch.Tensor, sfa: torch.Tensor, out: torch.Tensor) -> None:
|
| 92 |
return None
|
|
@@ -319,6 +349,110 @@ def silu_mul_two_mul_fp4_to_fp4(
|
|
| 319 |
return out_packed, out_sfa
|
| 320 |
|
| 321 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 322 |
def adaptive_rms_norm_nvfp4_fp16(
|
| 323 |
x: torch.Tensor,
|
| 324 |
style: torch.Tensor,
|
|
@@ -802,13 +936,19 @@ __all__ = [
|
|
| 802 |
"gate_res_ada_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 803 |
"gate_res_ada_rms_norm_quant_fp8_static_fp16",
|
| 804 |
"gelu_mul_nvfp4_fp16",
|
|
|
|
|
|
|
| 805 |
"gelu_mul_e0m3_fp16",
|
| 806 |
"layer_norm_fp8_fp16",
|
|
|
|
| 807 |
"layer_norm_nvfp4_fp16",
|
|
|
|
| 808 |
"quantize_bf16_to_nvfp4_linear",
|
| 809 |
"residual_add_rms_norm_fp4_sfa_fp16",
|
| 810 |
"residual_add_rms_norm_fp4_sfa_v2_fp16",
|
| 811 |
"residual_add_rms_norm_mul_fp4_sfa_fp16",
|
|
|
|
|
|
|
| 812 |
"residual_add_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 813 |
"rms_norm_fp4_sfa_fp16",
|
| 814 |
"rms_silu_nvfp4_ndhwc_bf16",
|
|
|
|
| 87 |
return None
|
| 88 |
|
| 89 |
|
| 90 |
+
@torch.library.register_fake(add_op_namespace_prefix("geglu_two_mul_nvfp4_native"))
|
| 91 |
+
def _geglu_two_native_fake(gate_packed, gate_sfa, up_packed, up_sfa, inv_s, out_packed, out_sfa) -> None:
|
| 92 |
+
return None
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
@torch.library.register_fake(add_op_namespace_prefix("gelu_mul_nvfp4_bf16"))
|
| 96 |
+
def _gelu_mul_bf16_fake(merged, inv_s, packed, sfa) -> None:
|
| 97 |
+
return None
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
@torch.library.register_fake(add_op_namespace_prefix("rms_norm_mul_nvfp4_bf16"))
|
| 101 |
+
def _rms_mul_bf16_fake(x, inv_s, eps: float, packed, sfa) -> None:
|
| 102 |
+
return None
|
| 103 |
+
|
| 104 |
+
|
| 105 |
+
@torch.library.register_fake(add_op_namespace_prefix("residual_add_rms_norm_nvfp4_bf16"))
|
| 106 |
+
def _res_rms_bf16_fake(residual, x, inv_s, eps: float, packed, sfa) -> None:
|
| 107 |
+
return None
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
@torch.library.register_fake(add_op_namespace_prefix("layer_norm_fp8_bf16"))
|
| 111 |
+
def _layer_norm_fp8_bf16_fake(x, gamma, beta, eps: float, out) -> None:
|
| 112 |
+
return None
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
@torch.library.register_fake(add_op_namespace_prefix("layer_norm_nvfp4_bf16"))
|
| 116 |
+
def _layer_norm_nvfp4_bf16_fake(x, gamma, beta, inv_s, eps: float, packed, sfa) -> None:
|
| 117 |
+
return None
|
| 118 |
+
|
| 119 |
+
|
| 120 |
@torch.library.register_fake(add_op_namespace_prefix("dequantize_fp4_sfa_fp16"))
|
| 121 |
def _dequant_fake(packed: torch.Tensor, sfa: torch.Tensor, out: torch.Tensor) -> None:
|
| 122 |
return None
|
|
|
|
| 349 |
return out_packed, out_sfa
|
| 350 |
|
| 351 |
|
| 352 |
+
def geglu_two_mul_nvfp4_native(
|
| 353 |
+
gate_packed: torch.Tensor,
|
| 354 |
+
gate_sfa: torch.Tensor,
|
| 355 |
+
up_packed: torch.Tensor,
|
| 356 |
+
up_sfa: torch.Tensor,
|
| 357 |
+
inv_s: torch.Tensor,
|
| 358 |
+
out_packed: torch.Tensor | None = None,
|
| 359 |
+
out_sfa: torch.Tensor | None = None,
|
| 360 |
+
):
|
| 361 |
+
"""Native-E2M1 LUT GeGLU combiner for split gate/up FP4 outputs."""
|
| 362 |
+
hidden = gate_packed.shape[1] * 2
|
| 363 |
+
if out_packed is None or out_sfa is None:
|
| 364 |
+
out_packed, out_sfa = _alloc_fp4(
|
| 365 |
+
gate_packed.shape[0], hidden, gate_packed.device
|
| 366 |
+
)
|
| 367 |
+
ops.geglu_two_mul_nvfp4_native(
|
| 368 |
+
gate_packed, gate_sfa, up_packed, up_sfa, inv_s,
|
| 369 |
+
out_packed, out_sfa
|
| 370 |
+
)
|
| 371 |
+
return out_packed, out_sfa
|
| 372 |
+
|
| 373 |
+
|
| 374 |
+
def gelu_mul_nvfp4_bf16(
|
| 375 |
+
merged: torch.Tensor,
|
| 376 |
+
inv_s: torch.Tensor | None = None,
|
| 377 |
+
*,
|
| 378 |
+
packed: torch.Tensor | None = None,
|
| 379 |
+
sfa: torch.Tensor | None = None,
|
| 380 |
+
):
|
| 381 |
+
"""BF16 GeGLU producer with optional per-channel scaling and NVFP4 output."""
|
| 382 |
+
hidden = merged.shape[1] // 2
|
| 383 |
+
if packed is None or sfa is None:
|
| 384 |
+
packed, sfa = _alloc_fp4(merged.shape[0], hidden, merged.device)
|
| 385 |
+
ops.gelu_mul_nvfp4_bf16(merged, inv_s, packed, sfa)
|
| 386 |
+
return packed, sfa
|
| 387 |
+
|
| 388 |
+
|
| 389 |
+
def rms_norm_mul_nvfp4_bf16(
|
| 390 |
+
x: torch.Tensor,
|
| 391 |
+
inv_s: torch.Tensor,
|
| 392 |
+
eps: float = 1e-6,
|
| 393 |
+
*,
|
| 394 |
+
packed: torch.Tensor | None = None,
|
| 395 |
+
sfa: torch.Tensor | None = None,
|
| 396 |
+
):
|
| 397 |
+
"""BF16 RMSNorm, channel scaling, and native NVFP4 production."""
|
| 398 |
+
if packed is None or sfa is None:
|
| 399 |
+
packed, sfa = _alloc_fp4(x.shape[0], x.shape[1], x.device)
|
| 400 |
+
ops.rms_norm_mul_nvfp4_bf16(x, inv_s, float(eps), packed, sfa)
|
| 401 |
+
return packed, sfa
|
| 402 |
+
|
| 403 |
+
|
| 404 |
+
def residual_add_rms_norm_nvfp4_bf16(
|
| 405 |
+
residual: torch.Tensor,
|
| 406 |
+
x: torch.Tensor,
|
| 407 |
+
inv_s: torch.Tensor | None = None,
|
| 408 |
+
eps: float = 1e-6,
|
| 409 |
+
*,
|
| 410 |
+
packed: torch.Tensor | None = None,
|
| 411 |
+
sfa: torch.Tensor | None = None,
|
| 412 |
+
):
|
| 413 |
+
"""Update a BF16 residual, RMS-normalize, and produce native NVFP4."""
|
| 414 |
+
if packed is None or sfa is None:
|
| 415 |
+
packed, sfa = _alloc_fp4(x.shape[0], x.shape[1], x.device)
|
| 416 |
+
ops.residual_add_rms_norm_nvfp4_bf16(
|
| 417 |
+
residual, x, inv_s, float(eps), packed, sfa
|
| 418 |
+
)
|
| 419 |
+
return residual, packed, sfa
|
| 420 |
+
|
| 421 |
+
|
| 422 |
+
def layer_norm_fp8_bf16(
|
| 423 |
+
x: torch.Tensor,
|
| 424 |
+
gamma: torch.Tensor,
|
| 425 |
+
beta: torch.Tensor,
|
| 426 |
+
eps: float = 1e-6,
|
| 427 |
+
*,
|
| 428 |
+
out: torch.Tensor | None = None,
|
| 429 |
+
) -> torch.Tensor:
|
| 430 |
+
"""Vectorized BF16 LayerNorm producer with FP8 E4M3 output."""
|
| 431 |
+
if out is None:
|
| 432 |
+
out = torch.empty_like(x, dtype=torch.float8_e4m3fn)
|
| 433 |
+
ops.layer_norm_fp8_bf16(x, gamma, beta, float(eps), out)
|
| 434 |
+
return out
|
| 435 |
+
|
| 436 |
+
|
| 437 |
+
def layer_norm_nvfp4_bf16(
|
| 438 |
+
x: torch.Tensor,
|
| 439 |
+
gamma: torch.Tensor,
|
| 440 |
+
beta: torch.Tensor,
|
| 441 |
+
inv_s: torch.Tensor | None = None,
|
| 442 |
+
eps: float = 1e-6,
|
| 443 |
+
*,
|
| 444 |
+
packed: torch.Tensor | None = None,
|
| 445 |
+
sfa: torch.Tensor | None = None,
|
| 446 |
+
):
|
| 447 |
+
"""Vectorized BF16 LayerNorm producer with native NVFP4 output."""
|
| 448 |
+
if packed is None or sfa is None:
|
| 449 |
+
packed, sfa = _alloc_fp4(x.shape[0], x.shape[1], x.device)
|
| 450 |
+
ops.layer_norm_nvfp4_bf16(
|
| 451 |
+
x, gamma, beta, inv_s, float(eps), packed, sfa
|
| 452 |
+
)
|
| 453 |
+
return packed, sfa
|
| 454 |
+
|
| 455 |
+
|
| 456 |
def adaptive_rms_norm_nvfp4_fp16(
|
| 457 |
x: torch.Tensor,
|
| 458 |
style: torch.Tensor,
|
|
|
|
| 936 |
"gate_res_ada_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 937 |
"gate_res_ada_rms_norm_quant_fp8_static_fp16",
|
| 938 |
"gelu_mul_nvfp4_fp16",
|
| 939 |
+
"gelu_mul_nvfp4_bf16",
|
| 940 |
+
"geglu_two_mul_nvfp4_native",
|
| 941 |
"gelu_mul_e0m3_fp16",
|
| 942 |
"layer_norm_fp8_fp16",
|
| 943 |
+
"layer_norm_fp8_bf16",
|
| 944 |
"layer_norm_nvfp4_fp16",
|
| 945 |
+
"layer_norm_nvfp4_bf16",
|
| 946 |
"quantize_bf16_to_nvfp4_linear",
|
| 947 |
"residual_add_rms_norm_fp4_sfa_fp16",
|
| 948 |
"residual_add_rms_norm_fp4_sfa_v2_fp16",
|
| 949 |
"residual_add_rms_norm_mul_fp4_sfa_fp16",
|
| 950 |
+
"residual_add_rms_norm_nvfp4_bf16",
|
| 951 |
+
"rms_norm_mul_nvfp4_bf16",
|
| 952 |
"residual_add_rms_norm_quant_nvfp4_swizzled_bf16",
|
| 953 |
"rms_norm_fp4_sfa_fp16",
|
| 954 |
"rms_silu_nvfp4_ndhwc_bf16",
|
build/torch211-cxx11-cu130-x86_64-linux/{_fp4_fused_ops_cuda_8cf8928_dirty.abi3.so → _fp4_fused_ops_cuda_92c4b99.abi3.so}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d0519722786f9bf6ced8f22ca95801289b860275b1ff1f96ccb1cf10e8047de0
|
| 3 |
+
size 1569904
|
build/torch211-cxx11-cu130-x86_64-linux/_ops.py
CHANGED
|
@@ -1,9 +1,6 @@
|
|
| 1 |
import torch
|
| 2 |
-
from . import
|
| 3 |
-
ops = torch.ops.
|
| 4 |
|
| 5 |
def add_op_namespace_prefix(op_name: str):
|
| 6 |
-
""
|
| 7 |
-
Prefix op by namespace.
|
| 8 |
-
"""
|
| 9 |
-
return f"_fp4_fused_ops_cuda_8cf8928_dirty::{op_name}"
|
|
|
|
| 1 |
import torch
|
| 2 |
+
from . import _fp4_fused_ops_cuda_92c4b99
|
| 3 |
+
ops = torch.ops._fp4_fused_ops_cuda_92c4b99
|
| 4 |
|
| 5 |
def add_op_namespace_prefix(op_name: str):
|
| 6 |
+
return f"_fp4_fused_ops_cuda_92c4b99::{op_name}"
|
|
|
|
|
|
|
|
|
build/torch211-cxx11-cu130-x86_64-linux/fp4_fused_ops/__init__.py
CHANGED
|
@@ -2,25 +2,13 @@ import ctypes
|
|
| 2 |
import importlib.util
|
| 3 |
import sys
|
| 4 |
from pathlib import Path
|
| 5 |
-
from types import ModuleType
|
| 6 |
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
# it would also be used for other imports. So, we make a module name that
|
| 11 |
-
# depends on the path for it to be unique using the hex-encoded hash of
|
| 12 |
-
# the path.
|
| 13 |
-
path_hash = "{:x}".format(ctypes.c_size_t(hash(file_path.absolute())).value)
|
| 14 |
-
module_name = path_hash
|
| 15 |
-
spec = importlib.util.spec_from_file_location(module_name, file_path)
|
| 16 |
-
if spec is None:
|
| 17 |
-
raise ImportError(f"Cannot load spec for {module_name} from {file_path}")
|
| 18 |
module = importlib.util.module_from_spec(spec)
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
sys.modules[module_name] = module
|
| 22 |
-
spec.loader.exec_module(module) # type: ignore
|
| 23 |
return module
|
| 24 |
|
| 25 |
-
|
| 26 |
-
globals().update(vars(_import_from_path(Path(__file__).parent.parent / "__init__.py")))
|
|
|
|
| 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')))
|
|
|
build/torch211-cxx11-cu130-x86_64-linux/metadata.json
CHANGED
|
@@ -1,23 +1,32 @@
|
|
| 1 |
{
|
| 2 |
"name": "fp4-fused-ops",
|
| 3 |
-
"id": "
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"python-depends": [],
|
| 7 |
"backend": {
|
| 8 |
"type": "cuda",
|
| 9 |
"archs": [
|
| 10 |
-
"11.0a",
|
| 11 |
"12.0a"
|
| 12 |
]
|
| 13 |
},
|
| 14 |
"digest": {
|
| 15 |
"algorithm": "sha256",
|
| 16 |
"files": {
|
| 17 |
-
"__init__.py": "
|
| 18 |
-
"
|
| 19 |
-
"_ops.py": "
|
| 20 |
-
"fp4_fused_ops/__init__.py": "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
}
|
| 22 |
}
|
| 23 |
-
}
|
|
|
|
| 1 |
{
|
| 2 |
"name": "fp4-fused-ops",
|
| 3 |
+
"id": "_fp4_fused_ops_cuda_92c4b99",
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"python-depends": [],
|
| 7 |
"backend": {
|
| 8 |
"type": "cuda",
|
| 9 |
"archs": [
|
|
|
|
| 10 |
"12.0a"
|
| 11 |
]
|
| 12 |
},
|
| 13 |
"digest": {
|
| 14 |
"algorithm": "sha256",
|
| 15 |
"files": {
|
| 16 |
+
"__init__.py": "3Bkz49FpbwcatmJVYSwTnKEeRWr1RkkYZowj/l9fJOY=",
|
| 17 |
+
"_fp4_fused_ops_cuda_92c4b99.abi3.so": "0FGXInhvm/bO2PIsqVgBKJuGAnWx/x+WzLHPEOgEfeA=",
|
| 18 |
+
"_ops.py": "I13aTXDYLStDS3cO/5A8MkCfRnBg5EhUFfcIq8Sz8yk=",
|
| 19 |
+
"fp4_fused_ops/__init__.py": "v6p5XMfQzddhi1fLSAw4HX9CyS0rQsidvu9VsT01xi4="
|
| 20 |
+
}
|
| 21 |
+
},
|
| 22 |
+
"provenance": {
|
| 23 |
+
"kernel": {
|
| 24 |
+
"sha": "92c4b991b6f1fbd89744aa6f46f62b1bfac7ca7e",
|
| 25 |
+
"dirty": false
|
| 26 |
+
},
|
| 27 |
+
"validation": {
|
| 28 |
+
"torch": "2.11.0+cu130",
|
| 29 |
+
"cuda": "13.0"
|
| 30 |
}
|
| 31 |
}
|
| 32 |
+
}
|
build/torch213-cxx11-cu130-aarch64-linux/{fp4_fused_ops_source_test.abi3.so → _fp4_fused_ops_cuda_92c4b99.abi3.so}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1856d76e72049f097d9e240fdda018263dbec848b991216167cc38da048d205c
|
| 3 |
+
size 1583528
|
build/torch213-cxx11-cu130-aarch64-linux/_ops.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
import torch
|
| 2 |
-
from . import
|
| 3 |
-
ops = torch.ops.
|
| 4 |
|
| 5 |
def add_op_namespace_prefix(op_name: str):
|
| 6 |
-
return f"
|
|
|
|
| 1 |
import torch
|
| 2 |
+
from . import _fp4_fused_ops_cuda_92c4b99
|
| 3 |
+
ops = torch.ops._fp4_fused_ops_cuda_92c4b99
|
| 4 |
|
| 5 |
def add_op_namespace_prefix(op_name: str):
|
| 6 |
+
return f"_fp4_fused_ops_cuda_92c4b99::{op_name}"
|
build/torch213-cxx11-cu130-aarch64-linux/metadata.json
CHANGED
|
@@ -1,27 +1,27 @@
|
|
| 1 |
{
|
| 2 |
"name": "fp4-fused-ops",
|
| 3 |
-
"id": "
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"python-depends": [],
|
| 7 |
"backend": {
|
| 8 |
"type": "cuda",
|
| 9 |
"archs": [
|
| 10 |
-
"11.
|
| 11 |
]
|
| 12 |
},
|
| 13 |
"digest": {
|
| 14 |
"algorithm": "sha256",
|
| 15 |
"files": {
|
| 16 |
"__init__.py": "3Bkz49FpbwcatmJVYSwTnKEeRWr1RkkYZowj/l9fJOY=",
|
| 17 |
-
"
|
| 18 |
-
"_ops.py": "
|
| 19 |
"fp4_fused_ops/__init__.py": "v6p5XMfQzddhi1fLSAw4HX9CyS0rQsidvu9VsT01xi4="
|
| 20 |
}
|
| 21 |
},
|
| 22 |
"provenance": {
|
| 23 |
"kernel": {
|
| 24 |
-
"sha": "
|
| 25 |
"dirty": false
|
| 26 |
},
|
| 27 |
"validation": {
|
|
|
|
| 1 |
{
|
| 2 |
"name": "fp4-fused-ops",
|
| 3 |
+
"id": "_fp4_fused_ops_cuda_92c4b99",
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"python-depends": [],
|
| 7 |
"backend": {
|
| 8 |
"type": "cuda",
|
| 9 |
"archs": [
|
| 10 |
+
"11.0a"
|
| 11 |
]
|
| 12 |
},
|
| 13 |
"digest": {
|
| 14 |
"algorithm": "sha256",
|
| 15 |
"files": {
|
| 16 |
"__init__.py": "3Bkz49FpbwcatmJVYSwTnKEeRWr1RkkYZowj/l9fJOY=",
|
| 17 |
+
"_fp4_fused_ops_cuda_92c4b99.abi3.so": "GFbXbnIEnwl9niQP3aAYJj2+yEi5kSFhZ8w42gSNIFw=",
|
| 18 |
+
"_ops.py": "I13aTXDYLStDS3cO/5A8MkCfRnBg5EhUFfcIq8Sz8yk=",
|
| 19 |
"fp4_fused_ops/__init__.py": "v6p5XMfQzddhi1fLSAw4HX9CyS0rQsidvu9VsT01xi4="
|
| 20 |
}
|
| 21 |
},
|
| 22 |
"provenance": {
|
| 23 |
"kernel": {
|
| 24 |
+
"sha": "92c4b991b6f1fbd89744aa6f46f62b1bfac7ca7e",
|
| 25 |
"dirty": false
|
| 26 |
},
|
| 27 |
"validation": {
|