liangsu9988 commited on
Commit
2bcd7d3
·
verified ·
1 Parent(s): 16e0af1

Promote latest kernel artifacts to main

Browse files
README.md CHANGED
@@ -1,9 +1,128 @@
1
- # flashrt/fp4-fused-ops
 
 
 
 
 
 
 
 
 
 
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/fp4-fused-ops
 
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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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:d9217ecaa0bdcd4b9f998e934d87cfba926850c127b32c3d885dadc2e3f6172a
3
- size 1271200
 
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 _fp4_fused_ops_cuda_8cf8928_dirty
3
- ops = torch.ops._fp4_fused_ops_cuda_8cf8928_dirty
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
- def _import_from_path(file_path: Path) -> ModuleType:
9
- # We cannot use the module name as-is, after adding it to `sys.modules`,
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
- if module is None:
20
- raise ImportError(f"Cannot load module {module_name} from spec")
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": "_fp4_fused_ops_cuda_8cf8928_dirty",
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": "KxY15agQ6cnqkslzItrun85+7hL4OqX3FSFpolNUq1Q=",
17
- "_fp4_fused_ops_cuda_8cf8928_dirty.abi3.so": "2SF+yqC9zUufmY6TTYfPupJoUMEnsyw9iF2twuP2Fyo=",
18
- "_ops.py": "5bB7feK8B7pytTbr2Ty52irfjV7U/tJBINU996zlQtI=",
19
- "fp4_fused_ops/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY="
 
 
 
 
 
 
 
 
 
 
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:fcc7c79b9342830a7b6b367246107d03aa1c9a95b0a5dfd21515ed53dbe6657b
3
- size 1361344
 
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 fp4_fused_ops_source_test
3
- ops = torch.ops.fp4_fused_ops_source_test
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
- return f"fp4_fused_ops_source_test::{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-aarch64-linux/metadata.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "fp4-fused-ops",
3
- "id": "fp4_fused_ops_source_test",
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": "KxY15agQ6cnqkslzItrun85+7hL4OqX3FSFpolNUq1Q=",
17
- "fp4_fused_ops_source_test.abi3.so": "/MfHm5NCgwp7azZyRhB9A6ocmpWwpd/SFRXtU9vmZXs=",
18
- "_ops.py": "uZrqOE8sQDwTb0/km0N/KGsHFOC8TmQOIPHR2bVdj24=",
19
  "fp4_fused_ops/__init__.py": "v6p5XMfQzddhi1fLSAw4HX9CyS0rQsidvu9VsT01xi4="
20
  }
21
  },
22
  "provenance": {
23
  "kernel": {
24
- "sha": "1ee78f4",
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:be2b14ef9a2fc9f4e0fcd2f7fb140420ec03d3467bd8f11f4fc78edbf9416efd
3
- size 2180064
 
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 _fp4_fused_ops_cuda_8cf8928_dirty
3
- ops = torch.ops._fp4_fused_ops_cuda_8cf8928_dirty
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
- def _import_from_path(file_path: Path) -> ModuleType:
9
- # We cannot use the module name as-is, after adding it to `sys.modules`,
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
- if module is None:
20
- raise ImportError(f"Cannot load module {module_name} from spec")
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": "_fp4_fused_ops_cuda_8cf8928_dirty",
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": "KxY15agQ6cnqkslzItrun85+7hL4OqX3FSFpolNUq1Q=",
18
- "_fp4_fused_ops_cuda_8cf8928_dirty.abi3.so": "visU75ovyfTg/NL3+xQEIOwD00Z72PEfT8eO2/lBbv0=",
19
- "_ops.py": "5bB7feK8B7pytTbr2Ty52irfjV7U/tJBINU996zlQtI=",
20
- "fp4_fused_ops/__init__.py": "DFYPlrhXwYjEqCl/8n0SmWGZV8NFml5DPhMjKfv98GY="
 
 
 
 
 
 
 
 
 
 
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:a80eac067fb4184c162f5a7521b09faf7cb0b1098d5f28c59e49b12d8c918e87
3
- size 1583520
 
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 fp4_fused_ops_source_test
3
- ops = torch.ops.fp4_fused_ops_source_test
4
 
5
  def add_op_namespace_prefix(op_name: str):
6
- return f"fp4_fused_ops_source_test::{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/torch213-cxx11-cu130-aarch64-linux/metadata.json CHANGED
@@ -1,27 +1,27 @@
1
  {
2
  "name": "fp4-fused-ops",
3
- "id": "fp4_fused_ops_source_test",
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": "3Bkz49FpbwcatmJVYSwTnKEeRWr1RkkYZowj/l9fJOY=",
17
- "fp4_fused_ops_source_test.abi3.so": "qA6sBn+0GEwWL1p1IbCfr3ywsQmNXyjFnkmxLYyRjoc=",
18
- "_ops.py": "uZrqOE8sQDwTb0/km0N/KGsHFOC8TmQOIPHR2bVdj24=",
19
  "fp4_fused_ops/__init__.py": "v6p5XMfQzddhi1fLSAw4HX9CyS0rQsidvu9VsT01xi4="
20
  }
21
  },
22
  "provenance": {
23
  "kernel": {
24
- "sha": "b6588aa59dd4f8c646f90b58312a0a66886e061f",
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": {