fw-ai/minimax-kernels

GitHub: fw-ai/minimax-kernels

为 MiniMax 模型在 NVIDIA Blackwell GPU 上实现高性能 M3 block-sparse attention 的开源 CUDA kernel 库。

Stars: 3 | Forks: 0

# MiniMax Kernels 用于 MiniMax 模型的开源 GPU kernel。 本仓库包含一个 NVIDIA Blackwell (SM100) CuTe-DSL 实现, 实现了 MiniMax M3 block-sparse attention。其 KV-outer (KV-stationary) 公式 会加载选定的 KV block 一次,并处理所有选定它的 query, 从而在选择项共享时,分摊 KV-cache 的读取成本。 - [M3 sparse attention 技术概述](docs/m3-sparse-attention.md) - [AOT C++ 后端](docs/aot.md) - 独立基准测试结果:[B200](docs/perf-results-b200.md) · [B300](docs/perf-results-b300.md) - [完整的 Fireworks 设计与性能博客文章](https://fireworks.ai/blog/kernel-optimization-for-minimax-m3-on-nvidia-blackwell) ## 要求 - 具备 SM100 或更新计算能力的 NVIDIA Blackwell GPU - CUDA 13 工具链 - 启用 CUDA 的 PyTorch 安装 - `nvidia-cutlass-dsl >= 4.5.1` 以及来自 [`flash-attn-4`](https://github.com/Dao-AILab/flash-attention) 的 CuTe-DSL 实现 - 用于构建 ahead-of-time 扩展的 C++17 编译器 这些 kernel 支持 BF16、FP16 和 FP8 输入,head dimension 为 128,支持具有 64 或 128 token 页面的 paged KV cache、变长 batch、MHA/GQA/MQA,以及 causal 或 non-causal attention。 ## 安装 请先安装适合宿主机的 CUDA 和 PyTorch 技术栈,然后从其根目录安装本仓库: ``` python -m pip install -v --no-build-isolation . ``` 若要进行可编辑的开发者安装: ``` python -m pip install -v --no-build-isolation -e . ``` 构建隔离被禁用,因为扩展构建需要当前环境中启用了 CUDA 的 PyTorch 和 CuTe-DSL 包。 为了重现用于正确性和基准测试验证的确切公开 CUDA 13 技术栈,请从其官方 CUDA 索引安装 PyTorch,然后应用仓库限制条件: ``` python -m pip install \ --index-url https://download.pytorch.org/whl/cu130 \ "torch==2.9.0+cu130" python -m pip install -c constraints/cu13.txt flashinfer-python fmha-sm100 python -m pip install -v --no-build-isolation -c constraints/cu13.txt . ``` ## 快速开始 `kvouter_attention` 接收 token-major 的 query、paged KV cache、sparse block 选项以及逻辑到物理的 page table: ``` import torch from minimax_kernels.m3_sparse_attention import kvouter_attention device = "cuda" dtype = torch.bfloat16 # 一个 query,16 个 query heads,一个 KV head,head dimension 为 128。 q = torch.randn(1, 16, 128, device=device, dtype=dtype) k_cache = torch.randn(4, 1, 64, 128, device=device, dtype=dtype) v_cache = torch.randn_like(k_cache) # 一个包含四个 physical pages 的 sequence。该 query 选择了这些 pages 所代表的两个 128-token # sparse blocks。 block_tables = torch.arange(4, device=device, dtype=torch.int32).unsqueeze(0) selected = torch.tensor([[[0, 1]]], device=device, dtype=torch.int32) cu_seqlens_q = torch.tensor([0, 1], device=device, dtype=torch.int64) used_kv_lens = torch.tensor([256], device=device, dtype=torch.int32) output, lse = kvouter_attention( q, k_cache, v_cache, selected, block_tables, cu_seqlens_q=cu_seqlens_q, used_kv_lens=used_kv_lens, page_size=64, return_lse=True, ) ``` `output` 的形状为 `[Tq, Hq, 128]`。如果被请求,`lse` 将是形状为 `[Hq, Tq]` 的 FP32。 ## 后端 已安装的 C++ 扩展使用 ahead-of-time 编译的 CuTe kernel,并在可用时作为默认选择。Python CuTe-DSL 路径仍作为 JIT 回退和数值参考提供。 设置 `MINIMAX_KERNELS_KVOUTER_CPP=0` 以强制使用 Python 后端,或设置 `MINIMAX_KERNELS_KVOUTER_CPP=1` 以要求使用 C++ 后端。要求使用不可用的 C++ 扩展会引发错误,而不是静默回退。 ## 测试 GPU 测试需要兼容的 Blackwell GPU。在运行它们之前检查 GPU 可用性,然后选择一个空闲设备: ``` nvidia-smi CUDA_VISIBLE_DEVICES=0 pytest -q tests/m3_sparse_attention ``` 该测试套件涵盖了 index builder、load-balancing scheduler、针对 Torch oracle 的 forward 和 combine kernel、JIT 重新编译防护、Python/C++ 一致性,以及与 FlashInfer 和可选的 MiniMax MSA 的端到端比较。 ## 基准测试 基准测试从仓库检出中运行。简短的冒烟测试将运行每个保留的基准测试: ``` CUDA_VISIBLE_DEVICES=0 \ python benchmarks/m3_sparse_attention/run_benchmark_suite.py --smoke ``` 使用以下命令运行全面扫描: ``` CUDA_VISIBLE_DEVICES=0 \ python benchmarks/m3_sparse_attention/run_benchmark_suite.py ``` 每个用例的日志将写入被 gitignore 的 `benchmark_results/` 目录下。 有关针对性的命令和基准测试覆盖范围,请参阅[技术概述](docs/m3-sparse-attention.md#tests-and-benchmarks)。 ## 贡献者 - Ying Zhang - Junming Chen ## 许可证 本仓库采用 [Apache License 2.0](LICENSE) 授权。改编自 FlashAttention-4 的部分在 BSD 3-Clause License 下分发;请参阅 [NOTICE](NOTICE) 和 [LICENSES/BSD-3-Clause.txt](LICENSES/BSD-3-Clause.txt)。
标签:CUDA, GPU算子, Vectored Exception Handling, 人工智能, 凭据扫描, 大模型, 用户模式Hook绕过, 稀疏注意力, 逆向工具, 高性能计算