DeepGEMM
DeepGEMM 是一款专为 NVIDIA GPU 打造的高性能矩阵乘法(GEMM)加速库,核心支持高效的 FP8 精度计算及细粒度缩放技术。它主要解决了大模型推理与训练中,特别是在混合专家模型(MoE)场景下,传统算子库配置复杂、编译耗时或性能未达极致的问题。
这款工具非常适合从事底层系统优化、大模型架构研发的工程师及研究人员使用。其独特亮点在于“轻量且强大”的设计理念:虽然借鉴了 CUTLASS 等顶级库的核心思想,但 DeepGEMM 摒弃了繁重的模板依赖,仅保留少量核心内核函数,代码简洁易读,是学习 NVIDIA GPU 内核优化的绝佳范例。此外,它采用运行时即时编译(JIT)机制,安装时无需预先编译内核,大幅降低了部署门槛。尽管设计精简,DeepGEMM 在多种矩阵形状下的性能表现依然媲美甚至超越经过专家手工调优的现有库,在 H800 等高端显卡上更能释放出惊人的算力潜能。
使用场景
某大模型团队正在基于 DeepSeek v3.2 架构训练超大规模混合专家(MoE)模型,亟需在 H800 GPU 上实现高效的 FP8 精度矩阵乘法以加速推理与训练。
没有 DeepGEMM 时
- 精度与性能难以兼得:传统库对 FP8 细粒度缩放支持不足,强行使用会导致模型收敛困难或需回退到 BF16,牺牲了显存带宽优势。
- MoE 场景适配复杂:处理动态路由的分组矩阵乘法(Grouped GEMM)时,现有方案往往需要繁琐的内核定制或遭受严重的计算碎片化。
- 部署门槛高:依赖重型模板库(如完整 CUTLASS),编译时间长且代码耦合度高,调试和优化底层 CUDA 内核极其耗时。
- 硬件算力未跑满:在 H800 等新架构上,无法有效利用 TMA 多播等特性,实测算力远低于理论峰值,训练成本居高不下。
使用 DeepGEMM 后
- 原生 FP8 高效支持:直接调用内置的细粒度缩放 FP8 内核,在保持模型精度的同时,将矩阵乘法吞吐量提升至 1550 TFLOPS。
- MoE 场景无缝加速:专为 MoE 设计的分组内核自动处理不规则形状,完美适配 DeepSeek v3.2 的闪电索引器,消除计算气泡。
- 轻量级即时编译:通过低开销 JIT 模块在运行时自动编译最优内核,无需预编译繁琐的模板,大幅降低集成与维护成本。
- 极致硬件利用率:针对 SM90/SM100 架构深度优化,自动启用 TMA 多播和共享内存交换,充分释放 H800 的硬件潜能。
DeepGEMM 通过简洁高效的 FP8 内核设计,让开发者在无需深入底层优化的前提下,即可在大规模 MoE 模型中实现极致的训练与推理性能。
运行环境要求
- 未说明
- 必需 NVIDIA GPU,架构需为 SM90 (如 H800, H100) 或 SM100 (Blackwell 系列)
- 显存大小未明确说明
- CUDA Toolkit 版本要求:SM90 需 CUDA 12.3+ (推荐 12.9+),SM100 需 CUDA 12.9+
未说明

快速开始
DeepGEMM
DeepGEMM 是一个专为干净高效的一般矩阵乘法(GEMM)设计的库。它支持 FP8 和 BF16 数据类型,适用于常规和混合专家(MoE)分组场景。该库使用 CUDA 编写,在安装时无需编译内核,而是通过一个轻量级的即时编译(JIT)模块在运行时动态编译所有内核。
DeepGEMM 借鉴了 CUTLASS 和 CuTe 中的一些概念,但避免了对其模板或代数系统的过度依赖。相反,该库以简洁为目标,仅包含少量核心内核函数,使其成为学习 NVIDIA GPU 内核优化技术的一个清晰且易于上手的资源。
尽管设计轻量,DeepGEMM 的性能在各种矩阵形状下都能达到甚至超越专家调优的库。
新闻
- 2025年9月28日:DeepGEMM 现已支持用于 DeepSeek v3.2 光速索引器的打分内核(加权 ReLU MQA logits)。
- 更多详情请参阅 #200。
- 2025年7月20日:DeepGEMM 现在同时支持 SM90 和 SM100 架构,并进行了全面重构,引入了一个低 CPU 开销的 JIT CPP 模块。
- NVRTC 和后编译 SASS 优化已被全部禁用。
- NVRTC 将在后续版本中重新支持。
- 由于 NVCC 12.9 会自动进行 FFMA 交错处理,所有后优化功能将不再适用。
- 更多详情请参阅 #112。
- 2025年5月14日:DeepGEMM 现已提供密集模型和 MoE 反向传播的权重梯度内核!详情请见 #95。
- 2025年5月7日:DeepGEMM 现已支持 NVRTC,编译速度最高可提升 10 倍!详情请参阅 #94。请使用
DG_JIT_USE_NVRTC=1来启用此功能(某些情况下可能会有性能损失)。 - 2025年4月18日:DeepGEMM 在 H800 上已达到高达 1550 TFLOPS 的性能!详情请参阅 #74、#78、#81、#86 以及 340d988。
路线图
- 针对分组连续布局的更多正确性测试
- 输出端共享内存交错
- 兼容 TMA 组播的 MoE 调度器
- 修复不可分割形状下的 TMA 组播兼容性问题
- 跳过 M 维度上的无用计算
- 使用 NVRTC 作为更快的编译器
- 测试用的 Sanitizer 工具
- 密集模型的权重梯度内核
- MoE 模型的权重梯度内核
- 改进
get_best_configs建模 - 支持 CUDA PDL
- 为部分形状增加更大的 TMA 组播尺寸
- 使用 CUTLASS 重构 MMA 模板
- 移除 N 和 K 维度的形状限制
- 实现 BF16 内核
- 分割/流式优化
- Ampere 架构专用内核
- 完善文档
快速入门
需求
- NVIDIA SM90 或 SM100 架构的 GPU
- Python 3.8 或更高版本
- 支持 C++20 的编译器
- CUDA 工具包:
- SM90 需要 CUDA 12.3 或更高版本
- 为获得最佳性能,强烈建议使用 12.9 或更高版本
- SM100 需要 CUDA 12.9 或更高版本
- SM90 需要 CUDA 12.3 或更高版本
- PyTorch 2.1 或更高版本
- CUTLASS 4.0 或更高版本(可通过 Git 子模块克隆)
{fmt}库(可通过 Git 子模块克隆)
开发
# 必须克隆子模块
git clone --recursive git@github.com:deepseek-ai/DeepGEMM.git
cd DeepGEMM
# 链接一些必要的头文件并构建 CPP JIT 模块
cat develop.sh
./develop.sh
# 测试所有 GEMM 实现
python tests/test_layout.py
python tests/test_attention.py
python tests/test_core.py
安装
cat install.sh
./install.sh
随后,您可以在 Python 项目中导入 deep_gemm,即可开始使用!
接口
注意事项
本库为 NVIDIA GPU 提供了优化的 GEMM 内核,命名规范为 D = C + A @ B。输入张量的形状布局为 NT(A 不转置,B 转置)。SM90 实现仅支持 NT 内存布局(行主序、列主序),而 SM100 实现则支持所有内存布局(NT、TN、NN、TT)。例如,fp8_gemm_nt 将执行 D = C + A @ B.T。
对于这两种架构,左侧缩放因子都要求采用 TMA 对齐且转置后的布局。此外,SM90 和 SM100 的缩放因子数据格式有所不同:
- SM90 要求缩放因子为 FP32 格式。
- SM100 要求缩放因子为打包的 UE8M0 格式,即 4 个 UE8M0 打包成一个
torch.int。
请注意,诸如输入转置或 FP8 类型转换等操作需要由用户单独处理,请自行实现或将这些操作融合到之前的内核中。虽然本库提供了一些简单的 PyTorch 工具函数,但这些函数可能会导致性能下降。我们的主要目标是优化 GEMM 内核本身。
普通密集 GEMM(非分组)
要执行一个基本的非分组 FP8 GEMM,调用 fp8_gemm_{nt, nn, tn, tt} 函数即可。更多详细信息请参阅函数文档。
分组 GEMM(连续布局)
与 CUTLASS 中的传统分组 GEMM 不同,DeepGEMM 只对 M 轴进行分组,而 N 和 K 必须保持固定。这种设计适用于 MoE 模型中各个专家共享相同形状的场景。对于训练前向传播或推理预填充阶段,由于每个专家可能处理不同数量的 token,我们会将这些 token 拼接成一个单一的张量,称为“连续”布局。需要注意的是,每个专家段必须对齐到 GEMM 的 M 块大小(get_mk_alignment_for_contiguous_layout())。更多信息请参阅 m_grouped_fp8_gemm_{nt, nn}_contiguous 函数文档。
我们还提供了针对 MoE 权重反向传播的 K 轴分组 API(M 和 N 必须保持固定),详情请参阅 k_grouped_fp8_gemm_tn_contiguous。
分组 GEMM(掩码布局)
在推理解码阶段,当启用 CUDA 图且 CPU 无法得知每个专家接收的 token 数量时,我们支持掩码分组 GEMM。通过提供一个掩码张量,内核只会计算有效的部分。
为此可使用 m_grouped_fp8_gemm_nt_masked,并参考相关文档。一个典型用法是将来自 DeepEP 的低延迟内核输出作为输入。
V3.2 MQA 内核用于索引器
该内核系列有两个版本:非分页版(用于预填充)和分页版(用于解码)。
以非分页版 fp8_mqa_logits 为例,它有 6 个输入:
q,形状为[seq_len, num_heads, head_dim]的 E4M3 张量kv,形状为[seq_len_kv, head_dim]的 E4M3 张量,以及形状为[seq_len_kv]的浮点 SF 张量weights,形状为[seq_len, num_heads]的浮点张量cu_seq_len_k_start和cu_seq_len_k_end,形状为[seq_len]的整数张量clean_logits,是否将未填充的 logits 清零为-inf
输出张量的形状为 [seq_len, seq_len_kv],表示 token 到 token 的 logits。对于 q 中的每个 token i,它会遍历 [cu_seq_len_k_start[i], cu_seq_len_k_end[i)) 范围内的所有 token j,并按如下方式计算 out[i, j]:
kv_j = kv[0][j, :] * kv[1][j].unsqueeze(1) # [head_dim]
out_ij = q[i, :, :] @ kv_j # [num_heads]
out_ij = out_ij.relu() * weights[i, :] # [num_heads]
out_ij = out_ij.sum() # 标量
更多详细信息及分页版 fp8_paged_mqa_logits,请参阅 tests/test_attention.py。
工具函数
除了上述内核外,本库还提供了一些工具函数:
deep_gemm.set_num_sms: 设置使用的最大 SM 数量deep_gemm.get_num_sms: 获取当前设置的最大 SM 数量(若未设置,则返回设备的 SM 总数)deep_gemm.set_tc_util: 设置近似的 Tensor Core 利用率deep_gemm.get_tc_util: 获取当前的 Tensor Core 利用率deep_gemm.transform_sf_into_required_layout: 将缩放因子转换为所需布局deep_gemm.get_tma_aligned_size: 获取所需的 TMA 对齐大小deep_gemm.get_mk_alignment_for_contiguous_layout: 获取分组连续布局的组级对齐要求deep_gemm.get_mn_major_tma_aligned_tensor: 获取 MN 主序的 TMA 对齐张量deep_gemm.get_mn_major_tma_aligned_packed_ue8m0_tensor: 获取 MN 主序的 TMA 对齐张量(将 FP32 打包为 UE8M0)deep_gemm.get_k_grouped_mn_major_tma_aligned_packed_ue8m0_tensor: K 轴分组 GEMM 打包内核
本库还提供了一些环境变量,可能对您有所帮助:
- 通用
DG_JIT_DEBUG:0或1,打印更多 JIT 调试信息,默认为0
- JIT 缓存相关
DG_JIT_CACHE_DIR: 字符串,用于存储编译后内核的缓存目录,默认为$HOME/.deep_gemm
- NVCC/NVRTC 选择
DG_JIT_USE_NVRTC:0或1,使用 NVRTC 替代 NVCC,编译速度更快,但在某些情况下性能可能较低,默认为0DG_JIT_NVCC_COMPILER: 字符串,指定 NVCC 编译器路径;默认会在torch.utils.cpp_extension.CUDA_HOME中查找
- 编译选项
DG_JIT_PTXAS_VERBOSE:0或1,显示详细的 PTXAS 编译器输出,默认为0DG_JIT_PRINT_COMPILER_COMMAND:0或1,打印 NVCC 编译命令,默认为0
- 启发式选择
DG_PRINT_CONFIGS:0或1,打印针对每种形状所选的配置,默认为0
更多示例和详细信息,请参阅 测试代码 或相应的 Python 文档。
致谢
DeepGEMM 灵感来源于 CUTLASS 项目。感谢并致敬其开发者!
许可证
本代码仓库根据 MIT 许可证 发布。
版本历史
nv_dev_4ff3f542026/01/05v2.1.1.post32025/10/15v2.1.1.post22025/10/15v2.1.1.post12025/10/15v2.1.12025/10/14v2.1.02025/09/29常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器