DeepGEMM 是一个为高效 FP8 通用矩阵乘法(GEMMs)设计的库,其特点如提出于 DeepSeek--V3 的精细粒度缩放,支持普通和专家混合(MoE)分组 GEMMs。用 CUDA 编写,安装时无需编译,通过轻量级即时(JIT)模块在运行时编译所有内核。目前仅支持 NVIDIA Hopper 张量核心,采用 CUDA 核心两级积累(提升)解决 FP8 张量核心积累不精确问题。它避免过度依赖 CUTLASS 和 CuTe 的模板或代数,以简洁为设计理念,只有一个约 300 行代码的核心内核函数,是学习 Hopper FP8 矩阵乘法和优化技术的干净且易获取的资源。尽管设计轻量,但在各种矩阵形状下性能可匹配或超越专家调优的库。
我们分别在H20和H800上测试了 DeepSeek-V3/R1 推理中可能使用的所有形状的稠密矩阵乘法性能。并对deepgemm、vllm triton ,以及vllm cutlass 进行对比
分别就不同维度的稠密矩阵乘法,对比在三个架构下乘法性能,
总体对比:Cutlass 的性能相较于 DeepGEMM 波动较大,加速比介于 0.77x ~ 3.31x 之间。
小规模计算(m ≤ 128):
在 m=64, k=2048
的情况下,Cutlass 性能达到 3.31x DeepGEMM,表明 Cutlass 在小批量计算中的优化较好。
但在 m=64, k=16384
和 m=128, k=16384
这类大 k
值情况下,Cutlass 低于 DeepGEMM,仅 0.49x ~ 0.78x,可能由于 Cutlass 在大 k
处理上的局限性。
中等规模计算(256 ≤ m ≤ 1024):
Cutlass 在大多数情况下接近 1.0x ~ 1.78x DeepGEMM,例如 m=512, k=2048
达到 1.21x,但 m=512, k=7168
下降至 0.90x。
大规模计算(m = 4096):
在 m=4096, k=16384
的情况下,Cutlass 性能与 DeepGEMM 基本持平(1.01x)。
但在 m=4096, k=7168
,Cutlass 低于 DeepGEMM,仅 1.02x,说明 Cutlass 在大规模 m
下仍有优化空间。
总体对比:DeepGEMM 全面优于 Triton,加速比范围在 1.38x ~ 1.95x 之间。
小规模计算(m ≤ 128):
DeepGEMM 在 m=64, k=16384
领先 1.55x,在 m=128, k=16384
领先 1.95x,说明 DeepGEMM 在处理大 k
时表现优异。
中等规模计算(256 ≤ m ≤ 1024):
在 m=512, k=16384
,DeepGEMM 领先 1.80x,但 m=512, k=4096
时 Triton 仍能保持较高的竞争力(1.75x)。
大规模计算(m = 4096):
在 m=4096, k=16384
,DeepGEMM 仍然领先 1.74x,但对 m=4096, k=2048
,领先幅度减少至 1.66x,说明 Triton 在处理小 k
值的大 m
时相对较优化。
DeepGEMM vs Cutlass:
Cutlass 在 小批量计算 (m
小,k
适中) 时 比 DeepGEMM 快 3.31x,但 在大 k
值时性能下降,整体表现不如 DeepGEMM 稳定。
在 大规模计算(m ≥ 1024) 时,Cutlass 基本与 DeepGEMM 持平(1.01x ~ 1.07x),但部分情况下略有下降(0.89x)。
DeepGEMM vs Triton:
DeepGEMM 全面优于 Triton,尤其在 k
较大(如 16384
)的情况下,DeepGEMM 最高 1.95x Triton,展现出强大的优化能力。
在 小 k
值(如 2048)的大 m
计算 时,Triton 能维持一定的竞争力(1.66x ~ 1.74x),但仍落后于 DeepGEMM。
m |
n |
k |
Time |
TFLOPS |
GB/s |
vs DeepGEMM |
vs Triton |
64 |
24576 |
1536 |
49.2 |
98.1 |
832.5 |
1.47x |
1.14x |
64 |
32768 |
512 |
27.1 |
79.2 |
774.2 |
2.66x |
1.18x |
64 |
7168 |
16384 |
152.5 |
98.6 |
783 |
0.49x |
1.55x |
64 |
4096 |
7168 |
68.1 |
55.2 |
445.3 |
1.09x |
1.22x |
64 |
7168 |
2048 |
23 |
81.6 |
683 |
3.25x |
1.38x |
128 |
24576 |
1536 |
49.4 |
195.5 |
894.8 |
1.48x |
1.74x |
128 |
32768 |
512 |
26.9 |
159.4 |
936.6 |
2.72x |
1.38x |
128 |
7168 |
16384 |
152.8 |
196.7 |
794.2 |
0.78x |
1.95x |
128 |
4096 |
7168 |
68.2 |
110.1 |
459 |
1.10x |
1.30x |
128 |
7168 |
2048 |
22.8 |
164.6 |
734.8 |
3.31x |
1.50x |
256 |
24576 |
1536 |
80.4 |
240.3 |
630.6 |
1.07x |
1.72x |
256 |
32768 |
512 |
45 |
190.9 |
748.8 |
1.63x |
1.53x |
256 |
7168 |
16384 |
300.2 |
200.3 |
417.5 |
0.77x |
1.82x |
256 |
4096 |
7168 |
69.4 |
216.7 |
479.9 |
1.08x |
1.73x |
256 |
7168 |
2048 |
42.6 |
176.5 |
443.3 |
1.78x |
1.56x |
512 |
24576 |
1536 |
155.8 |
248.1 |
408.9 |
1.06x |
1.66x |
512 |
32768 |
512 |
87 |
197.5 |
581.5 |
1.09x |
1.50x |
512 |
7168 |
16384 |
448.3 |
268.3 |
297.1 |
1.01x |
1.80x |
512 |
4096 |
7168 |
135.6 |
221.7 |
274.5 |
0.90x |
1.75x |
512 |
7168 |
2048 |
62.2 |
241.8 |
371.1 |
1.21x |
1.57x |
1024 |
24576 |
1536 |
306.3 |
252.4 |
292.7 |
1.06x |
1.64x |
1024 |
32768 |
512 |
163.3 |
210.4 |
517 |
1.09x |
1.54x |
1024 |
7168 |
16384 |
891.9 |
269.7 |
167 |
1.01x |
1.73x |
1024 |
4096 |
7168 |
266.4 |
225.7 |
169.2 |
0.89x |
1.69x |
1024 |
7168 |
2048 |
122.2 |
246 |
257.4 |
1.07x |
1.62x |
1024 |
24576 |
1536 |
306.3 |
252.4 |
292.7 |
1.06x |
1.64x |
1024 |
32768 |
512 |
163 |
210.8 |
517.9 |
1.09x |
1.54x |
1024 |
7168 |
16384 |
892 |
269.6 |
166.9 |
1.01x |
1.73x |
1024 |
4096 |
7168 |
266.3 |
225.8 |
169.3 |
0.89x |
1.69x |
1024 |
7168 |
2048 |
122.2 |
246.1 |
257.5 |
1.07x |
1.62x |
4096 |
24576 |
1536 |
1190.1 |
259.8 |
206.2 |
1.06x |
1.65x |
4096 |
32768 |
512 |
620.7 |
221.4 |
462.9 |
1.07x |
1.57x |
4096 |
7168 |
16384 |
3395.3 |
283.4 |
71.6 |
1.01x |
1.74x |
4096 |
4096 |
7168 |
920.4 |
261.3 |
100.3 |
1.02x |
1.65x |
4096 |
7168 |
2048 |
455.1 |
264.3 |
179.7 |
1.07x |
1.66x |
Implementation |
Avg TFLOPS |
TFLOPS |
Avg GB/s |
DeepGEMM |
188.49 |
384.46 |
0.36 |
vLLM Triton |
126.01 |
297.19 |
0.58 |
vLLM CUTLASS |
204 |
451.96 |
0.35 |
Comparison |
Speedup |
---|---|
DeepGEMM vs vLLM Triton |
1.46x faster |
DeepGEMM vs vLLM CUTLASS |
0.90x slower |
vLLM CUTLASS vs vLLM Triton |
1.59x faster |
小规模矩阵 (m, n, k ≤ 256): Cutlass 明显优于 DeepGEMM,通常 快 2-5 倍,说明 Cutlass 在小矩阵优化更好。
中等规模矩阵 (512 ≤ m, n, k ≤ 2048): Cutlass 仍然 比 DeepGEMM 快 1.0x-3.5x,但随着矩阵增大,优势缩小。
大规模矩阵 (m, n, k ≥ 4096): DeepGEMM 逐渐追平甚至略超 Cutlass,特别是在 (4096, 7168, 16384) 这种大矩阵情况下,Cutlass 仅为 DeepGEMM 的 0.73x-0.98x,说明 DeepGEMM 在超大规模 GEMM 计算上更优。
Triton 在所有情况下都明显慢于 DeepGEMM,一般 慢 2-3 倍,个别情况甚至慢 3 倍以上(如 7168×16384 计算)。
即便是 Cutlass 相对 DeepGEMM 性能下降的情况(大矩阵),DeepGEMM 仍然远超 Triton,说明 Triton 的矩阵计算优化远不及 DeepGEMM。
DeepGEMM 在大规模 GEMM 计算上比 Cutlass 和 Triton 更高效,特别是 4096 及以上的矩阵。
Cutlass 在小矩阵上最优,但在超大矩阵上被 DeepGEMM 赶超。
Triton 在所有情况下最慢,DeepGEMM 远超 Triton,适合更高效的 GEMM 计算。
m |
n |
k |
Time |
TFLOPS |
GB/s |
vs DeepGEMM |
vs Triton |
64 |
24576 |
1536 |
49.2 |
98.1 |
832.5 |
1.47x |
1.14x |
64 |
32768 |
512 |
27.1 |
79.2 |
774.2 |
2.66x |
1.18x |
64 |
7168 |
16384 |
152.5 |
98.6 |
783 |
0.49x |
1.55x |
64 |
4096 |
7168 |
68.1 |
55.2 |
445.3 |
1.09x |
1.22x |
64 |
7168 |
2048 |
23 |
81.6 |
683 |
3.25x |
1.38x |
128 |
24576 |
1536 |
49.4 |
195.5 |
894.8 |
1.48x |
1.74x |
128 |
32768 |
512 |
26.9 |
159.4 |
936.6 |
2.72x |
1.38x |
128 |
7168 |
16384 |
152.8 |
196.7 |
794.2 |
0.78x |
1.95x |
128 |
4096 |
7168 |
68.2 |
110.1 |
459 |
1.10x |
1.30x |
128 |
7168 |
2048 |
22.8 |
164.6 |
734.8 |
3.31x |
1.50x |
256 |
24576 |
1536 |
80.4 |
240.3 |
630.6 |
1.07x |
1.72x |
256 |
32768 |
512 |
45 |
190.9 |
748.8 |
1.63x |
1.53x |
256 |
7168 |
16384 |
300.2 |
200.3 |
417.5 |
0.77x |
1.82x |
256 |
4096 |
7168 |
69.4 |
216.7 |
479.9 |
1.08x |
1.73x |
256 |
7168 |
2048 |
42.6 |
176.5 |
443.3 |
1.78x |
1.56x |
512 |
24576 |
1536 |
155.8 |
248.1 |
408.9 |
1.06x |
1.66x |
512 |
32768 |
512 |
87 |
197.5 |
581.5 |
1.09x |
1.50x |
512 |
7168 |
16384 |
448.3 |
268.3 |
297.1 |
1.01x |
1.80x |
512 |
4096 |
7168 |
135.6 |
221.7 |
274.5 |
0.90x |
1.75x |
512 |
7168 |
2048 |
62.2 |
241.8 |
371.1 |
1.21x |
1.57x |
1024 |
24576 |
1536 |
306.3 |
252.4 |
292.7 |
1.06x |
1.64x |
1024 |
32768 |
512 |
163.3 |
210.4 |
517 |
1.09x |
1.54x |
1024 |
7168 |
16384 |
891.9 |
269.7 |
167 |
1.01x |
1.73x |
1024 |
4096 |
7168 |
266.4 |
225.7 |
169.2 |
0.89x |
1.69x |
1024 |
7168 |
2048 |
122.2 |
246 |
257.4 |
1.07x |
1.62x |
1024 |
24576 |
1536 |
306.3 |
252.4 |
292.7 |
1.06x |
1.64x |
1024 |
32768 |
512 |
163 |
210.8 |
517.9 |
1.09x |
1.54x |
1024 |
7168 |
16384 |
892 |
269.6 |
166.9 |
1.01x |
1.73x |
1024 |
4096 |
7168 |
266.3 |
225.8 |
169.3 |
0.89x |
1.69x |
1024 |
7168 |
2048 |
122.2 |
246.1 |
257.5 |
1.07x |
1.62x |
4096 |
24576 |
1536 |
1190.1 |
259.8 |
206.2 |
1.06x |
1.65x |
4096 |
32768 |
512 |
620.7 |
221.4 |
462.9 |
1.07x |
1.57x |
4096 |
7168 |
16384 |
3395.3 |
283.4 |
71.6 |
1.01x |
1.74x |
4096 |
4096 |
7168 |
920.4 |
261.3 |
100.3 |
1.02x |
1.65x |
4096 |
7168 |
2048 |
455.1 |
264.3 |
179.7 |
1.07x |
1.66x |
Implementation |
Avg TFLOPS |
Avg GB/s |
Avg Time (ms) |
---|---|---|---|
DeepGEMM |
378.44 |
632.26 |
0.17 |
vLLM Triton |
180.53 |
546.70 |
0.42 |
vLLM CUTLASS |
450.88 |
1273.15 |
0.16 |
Comparison |
Speedup |
---|---|
DeepGEMM vs vLLM Triton |
1.61x faster |
DeepGEMM vs vLLM CUTLASS |
0.62x slower |
vLLM CUTLASS vs vLLM Triton |
2.45x faster |
根据测试数据,我们从 计算性能(TFLOPS)、带宽利用率(GB/s)、执行时间(Time/ms)、相对加速比 等维度对 DeepGEMM、vLLM Triton、vLLM CUTLASS 进行深入分析,并最终给出适合不同应用场景的建议。
✅ 计算性能较高,优于 vLLM Triton
在 H20 上,DeepGEMM 比 vLLM Triton 快 1.46x(188.49 vs 126.01 TFLOPS)。
在 H800 上,DeepGEMM 比 vLLM Triton 快 1.61x(378.44 vs 180.53 TFLOPS)。
说明 DeepGEMM 在 核心计算效率 方面比 Triton 版本更强。
✅ 适用于多种 GPU,兼容性较好
在 两款 GPU 上的性能表现均衡,虽然 CUTLASS 在 H800 上更强,但 DeepGEMM 保持较好性能。
适合用于不同的 GPU 硬件环境,不依赖特定优化。
❌ 在 H800 上比 CUTLASS 慢
H800 上 DeepGEMM 的 TFLOPS 低于 CUTLASS(378.44 vs 450.88),意味着 CUTLASS 的矩阵计算优化更好。
带宽利用率也不如 CUTLASS(632.26 vs 1273.15 GB/s),表明 CUTLASS 可能更适合高效数据传输的任务。
如果使用 H800 并追求极致性能,CUTLASS 更值得选择。
✅ Triton 内核易于优化,支持自定义 Kernel
Triton 适用于优化 LLM 计算,能在不同硬件上通过 kernel-level 代码调整性能。
✅ 计算方式较灵活,适用于动态 workload
Triton 允许动态 shape 计算,比 CUDA kernel 更适合处理 动态 batch size 任务,例如 在线推理。
❌ 计算效率最低,远逊于 DeepGEMM 和 CUTLASS
在 H20 GPU 上,TFLOPS 仅 126.01,比 DeepGEMM 低 32%。
在 H800 上,TFLOPS 仅 180.53,带宽 546.7 GB/s,相比 CUTLASS(450.88 TFLOPS,1273.15 GB/s)差距很大。
DeepGEMM 比 vLLM Triton 快 1.61x,CUTLASS 比 vLLM Triton 快 2.45x!
❌ H800 上表现尤为不佳
执行时间更长(0.42ms vs DeepGEMM 0.17ms vs CUTLASS 0.16ms),表明 vLLM Triton 在大规模矩阵运算上表现不理想。
说明 Triton 版本的 kernel 可能在 算子融合 和 数据流优化 方面仍有较大优化空间。
✅ H800 上性能最佳,TFLOPS 和带宽最高
在 H800 上的 TFLOPS 高达 450.88(比 DeepGEMM 高 19%),说明 CUTLASS 内核优化出色。
带宽利用率远超 DeepGEMM(1273.15 vs 632.26 GB/s),意味着 CUTLASS 能更有效地管理 内存带宽。
执行时间最短(0.16ms vs DeepGEMM 0.17ms vs Triton 0.42ms),在低延迟推理场景下表现优异。
✅ 高度优化的 CUDA kernel,适合高吞吐量任务
CUTLASS 主要优化了 GEMM 计算,能最大限度发挥 GPU Tensor Core 的性能。
适合大规模 LLM 推理,尤其是 batch size 较大的情况。
❌ 在部分 GPU 上,CUTLASS 的提升有限
在 H20 上,CUTLASS 仅比 DeepGEMM 快 1.08x(204 vs 188.49 TFLOPS),提升不明显。
可能表明 CUTLASS 的优化主要针对 H100/H800 这种高端 GPU,对 H20 等架构的提升不大。
❌ 可能对动态 workload 兼容性较差
CUTLASS 适用于 大 batch size,静态 shape 计算,但可能 不如 Triton 适用于动态 shape 任务。
方案 |
优点 |
缺点 |
适用场景 |
DeepGEMM |
适用于多种 GPU,计算性能较好,优于 Triton |
H800 上比 CUTLASS 慢 |
通用计算场景,适用于不同 GPU |
vLLM Triton |
Kernel 易优化,适合动态 shape |
计算效率最低,H800 上表现尤差 |
需要 Triton 兼容性,需要优化 kernel |
vLLM CUTLASS |
H800 上最高 TFLOPS & 带宽,最短执行时间 |
可能对老 GPU 提升有限,动态 workload 兼容性较差 |
大规模推理任务,H800 等高端 GPU |
天纪大模型开发平台TLM使用地址:https://zyun.360.cn/product/tlm