Files
nvfp4-megamoe-kernel/dsv4/kernels/cuda/loader.py
biondizzle f3b551956d Cleanup Step 2: Archive Lineage P code, fix broken imports
- Move dead dsv4/ modules to dsv4/_archive/ (52 files)
  - model/{dsv4,mtp,layer,layer_schedule}
  - layers/{embedding,attention,ffn,norm} (kept linear,mhc,router,moe,shared_expert,grouped_linear - live)
  - cache/*, kernels/cache/*, kernels/indexer/{csa_indexer,score_topk,compute_valid_lens}
  - kernels/router/{nvfp4_fused_router,dense_router_decode_kernel,dense_router_prefill}
  - ops/{topk,topk_select,rope,router}, loader/{hf_checkpoint,layout_convert}
  - reference/{attention,compressor,csa_attention,moe_pipeline}
  - kernels/compressor/{compress_tail,csa_hca}
- Restore dsv4/ops/{router,custom_ops}.py (needed by live layers)
- Fix dsv4/kernels/{indexer,compressor,attention}/__init__.py (removed broken imports)
- Remove preload_all() from loader.py (dead, referenced nonexistent .cu file)
- Fix loader.py docstring (fused_amax_quantize_nvfp4 → quantize_nvfp4_from_buffer)
- Move broken tests to tests/e2e_archive/
  - test_fused_router, production_values_test, e2e/{one_layer,model_construction,csa_hca}
- vLLM has 0 imports of dsv4 (Step 0 confirmed)
2026-06-02 19:27:07 +00:00

69 lines
2.0 KiB
Python

"""CUDA kernel loader with compile-once caching.
Compiles .cu kernels on first call, caches the loaded module for subsequent calls.
Eliminates the JIT recompilation overhead from torch.utils.cpp_extension.load
being called on every kernel invocation (was ~100ms per call, called ~500x per token).
Usage:
from dsv4.kernels.cuda.loader import get_cuda_module
mod = get_cuda_module("fused_amax_quantize", ["fused_amax_quantize.cu"])
result = mod.quantize_nvfp4_from_buffer(x, divisor)
"""
import os
import hashlib
import torch
from torch.utils.cpp_extension import load
_KERNEL_DIR = os.path.dirname(os.path.abspath(__file__))
_CACHE_DIR = os.path.join(_KERNEL_DIR, "_build_cache")
_LOADED_MODULES = {}
def get_cuda_module(name, sources, extra_cuda_cflags=None):
"""Load a CUDA kernel module, compiling once and caching forever.
Args:
name: Module name (used for caching key).
sources: List of .cu filenames relative to the kernels/cuda/ directory.
extra_cuda_cflags: Optional list of extra CUDA compiler flags.
Returns:
The loaded Python module with the kernel functions.
"""
if name in _LOADED_MODULES:
return _LOADED_MODULES[name]
source_paths = [os.path.join(_KERNEL_DIR, s) for s in sources]
# Build a cache key from source file contents + compile flags
hasher = hashlib.md5()
for sp in source_paths:
hasher.update(open(sp, 'rb').read())
cflags = extra_cuda_cflags or []
for cf in cflags:
hasher.update(cf.encode())
cache_key = f"{name}_{hasher.hexdigest()}"
# Ensure cache directory exists
os.makedirs(_CACHE_DIR, exist_ok=True)
cflags = cflags or [
"-gencode=arch=compute_100a,code=sm_100a",
"-O3",
"--use_fast_math",
]
mod = load(
name=cache_key,
sources=source_paths,
extra_cuda_cflags=cflags,
build_directory=_CACHE_DIR,
verbose=False,
)
_LOADED_MODULES[name] = mod
return mod