政霄 2025-02-25 12:03 浙江
YYDS
上周,Deepseek 突然发帖宣称,将要进行持续五天的开源——
(PS:去年 OpenAI 搞连续 12 天直播的“伤害”还没修复,你又来一样的套路??)
今天周一上午 9 点,DeepSeek 便直接公布了他们第一个开源项目:FlashMLA。
(PS:周一,上午 9 点,ds 你是懂上班的)
star 数还在一直蹭蹭上涨中!
我先把开源链接贴在这儿——
gihub 链接:
打开链接,快速浏览了一遍项目,第一感受——
这是 readme 文档——
整个项目介绍就一句话——
“FlashMLA is an efficient MLA decoding kernel for Hopper GPUs, optimized for variable-length sequences serving.”
翻译过来就是——
“FlashMLA 是一个针对 Hopper GPU 优化的高效 MLA 解码内核,专门用于处理可变长度序列的服务。”
一共就【三个信息】:
1、针对 Hopper GPU优化
2、是一个 MLA 解码内核
3、专门处理可变长度序列
除此之外,没有别的介绍信息了,就是代码文件了。
好吧,这是项目文件——
代码调用结构也非常简单明了!
顺着我画的箭头方向,最外层是一个 python 的调用 test 脚本,接口 flash_mla_interface.py
也用 python 做好了封装,最核心的功能优化用 C++ 实现,这部分都在 csrc 目录下,包括头文件和源文件,定义了 C++/CUDA 函数的具体实现。
确实符合 Day0 时说的,小而美的进展。
到这里,我还没看到 FlashMLA 的诚意,所以接下来看看这个 FlashMLA 到底做了啥改进。
先从它的定义开始讲——
是一个高效的 MLA 解码内核。
MLA ,多头潜注意力 ,全称是 Multi-Head Latent Attention。大家熟知的 Transformer 中有 Multi-Head Attention (MHA) ,MLA 就是 MHA 的一种变体。
这里的关键是——
在注意力机制中引入了“潜变量”(Latent Variable)。
通过某种方式(例如,一个线性层或一个简单的神经网络)从输入序列 X
生成一组潜变量 Z
。
在潜变量 Z
上来应用多头注意力机制。
这样的做法,可以捕捉输入序列中潜在的、抽象的特征或模式。
而且,潜变量通常是低维的,可以大大降低计算复杂度,提高计算效率。
MLA 结构从 DeepSeek-V2 论文中首次提出,在之后发布的所有 DeepSeek 主推模型里面都有沿用。
就是这篇 24 年初发布的论文——
DeepSeek-V2 论文:
“DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model”
论文链接:
KV 缓存是现在主流大模型存储上下文数据的一种存储机制,它通过在大模型推理时不断被复用来节约大模型的推理开销,为了保证大模型回答的速度,它一般会被存放在显存/内存中。
具体 MLA 是如何降低和压缩 KV 缓存的呢?
关键还是依赖于上面提到过的潜变量:
传统的 MHA 里,每个注意力头独立计算和存储键(K)和值(V),导致 KV 缓存随着头数和序列长度增加而增大。
MLA 则是把多个头的 KV 键值对,映射到一个共享的低维潜在空间,利用低秩矩阵分解实现联合压缩。
与标准的注意力机制相比,MLA 的 KV 缓存大小减少了接近九成。
这样就大大减少了需要缓存的键值对数量,让 kv 缓存的存储成本被压到了极低,从而大大降低内存占用。
在推理时,通过缓存之前计算的键值对,避免重复计算,从而节省计算资源和时间。比如 DeepSeek-V3 在长文本生成任务中推理速度提高了 1.5 倍。
也是凭借这个技术,DeepSeek-V2 大名鼎鼎的磁盘缓存技术,kv 向量从存放在显存/内存变成可以存放在磁盘。当缓存命中的时候,DeepSeek 只收取十分之一的价格。
因为 MLA 和传统的注意力机制不同,该项目在 MLA 结构的基础上参考了 FlashAttention 的处理逻辑进行优化。
它让 MLA 结构的模型也能同样通过 tilling 分片在显卡的 SRAM 上进行快速计算,从而达到推理加速的效果。
借鉴 FlashAttentionV2&V3
传统注意力面对可变序列的时候,往往会因为输入文本的长度不同,面临显存碎片和访存延迟的问题。
FLashMLA,另一个重要优化的点就是针对不同的文本输入,即可变长序列,做了优化。
可变序列(variable-length)主要是指在同一个批次(batch)中,不同输入样本可以拥有不同的序列长度,而不需要将所有序列统一填充到相同的长度。
FlashMLA 做了和 PagedAttention 思想类似的工作,进行了分页 KV 缓存管理,它实现了基于 64-block 粒度的分页 KV 缓存,极大地缓解了内存访问瓶颈。
同时,它设计了双缓冲预加载机制,在计算当前块的时候,会异步加载下一个块到共享内存,让显存访问和计算过程同步进行,减小延迟开销。
ds 这次项目这里也给出了实际测试结果——
H800 上可以达到 3000 GB/s 的内存带宽和 580 TFLOPS 的计算性能,是逼近什么程度呢?
H800 内存带宽:最高约 3.35 TB/s (使用 HBM3 内存),确切说 3000+ GB/s 已接近现有商业化产品的极限。
X 上已经有网友进行了实测:
这次项目里还明确写了针对 Hopper 系列优化,也就是上面 H800 的卡所用的架构。
英伟达现在主流卡包括
A 架构(Ampere):NVIDIA A100 / A800 / A40 / A30 / A16 / A10 / A2
L 架构(Ada Lovelace):NVIDIA L40S、GeForce RTX 4090
H 架构(Hopper):NVIDIA H100 / H800
和最新的 B 架构(Blakwell)
从源码可以看出,FlashMLA 有针对 Hopper 架构对应的 SM90 进行特别优化。(FlashMLA/csrc/utils.h)
CUTLASS 的核心是完成矩阵乘法运算,可以简单理解为 cutlass 是 FlashMLA 实现的工具。
本质上是通过将计算过程分解成线程块片(thread block tile)、线程束片(warp tile)和线程片(thread tile)的层次结构,将矩阵乘法累加的策略应用于这些结构,从而高效率地完成基于 GPU 拆分成 tile 的 GEMM。
写在最后
第一天,DeepSeek 就放出了现在各家部署 DeepSeek R1 都需要的推理加速模块。
用不了多久,各家厂商 R1 的推理速度都会有可见的提升了。
硬件级极限优化(3000 GB/s 内存带宽、580 TFLOPS 算力)、核心压缩技术(压缩 93.3% 的 KV 缓存),将 Hopper GPU 的性能榨取到极致。
这是国产 AI 少有的硬核时刻——不玩概念,只拼性能。
Deepseek 开源此举,堪比将 OpenAI 的‘黑箱’变为公共燃料,任何人或者团队都能借 FlashMLA 实现低成本长上下文处理。
更让资源有限的开发者看到‘以小搏大’的可能——这才是真正的开源精神。
但是目前是在特定的 Hopper GPU(H800/H100)、且依赖特定 CUDA 版本,希望开源社区能持续优化,跨越‘小众利器’,成为‘行业标准’。
众人拾柴火焰高,这更是开源精神的真正内核。
若后续四天‘开源周’延续此势,战局或将再次改写。