Files
nvfp4-megamoe-kernel/dsv4/_archive/ops/topk.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

90 lines
2.5 KiB
Python

"""
Sparse topk metadata kernels for DeepSeek-V4 Blackwell decode attention.
Own kernels — no FlashMLA, no Triton from vLLM.
C128A: position-based compressed KV slot lookup via block table.
C4A: local topk index to global slot ID mapping via block table.
"""
import os
import torch
from typing import Optional
_kernel_module = None
def _get_kernel_module():
"""Lazy-load the CUDA extension."""
global _kernel_module
if _kernel_module is not None:
return _kernel_module
from torch.utils.cpp_extension import load
kernel_dir = os.path.join(os.path.dirname(__file__), "kernels")
_kernel_module = load(
name="sparse_topk_metadata",
sources=[os.path.join(kernel_dir, "sparse_topk_metadata.cu")],
extra_cuda_cflags=["-O3", "--generate-code=arch=compute_100a,code=[sm_100a]"],
verbose=False,
)
return _kernel_module
def build_c128a_topk_metadata(
positions: torch.Tensor,
compress_ratio: int,
num_decode_tokens: int,
token_to_req: torch.Tensor,
block_table: torch.Tensor,
block_size: int,
slot_mapping: torch.Tensor,
global_decode_buffer: torch.Tensor,
decode_lens_buffer: torch.Tensor,
prefill_buffer: torch.Tensor,
max_compressed_tokens: int = 8192,
) -> tuple:
"""Build C128A topk metadata for decode and prefill tokens.
For decode tokens: maps compressed KV positions to global slot IDs
via block table lookup. Returns (global_decode, decode_lens, prefill_local).
"""
mod = _get_kernel_module()
return mod.build_c128a_topk_metadata(
positions,
compress_ratio,
num_decode_tokens,
token_to_req,
block_table,
block_size,
slot_mapping,
global_decode_buffer,
decode_lens_buffer,
prefill_buffer,
max_compressed_tokens,
)
def compute_c4a_global_topk(
local_topk: torch.Tensor,
token_to_req: torch.Tensor,
block_table: torch.Tensor,
block_size: int,
is_valid_token: torch.Tensor,
) -> tuple:
"""Map local C4A topk indices to global KV cache slots.
For each token, takes local compressed indices (from the indexer)
and maps them to global slot IDs via block table lookup.
Returns (global_topk_indices, topk_lens).
"""
mod = _get_kernel_module()
if is_valid_token.dtype == torch.bool:
is_valid_token = is_valid_token.to(torch.int32)
return mod.compute_c4a_global_topk(
local_topk,
token_to_req,
block_table,
block_size,
is_valid_token,
)