DeepSeek开源Day1:FlashMLA技术详解

news/2025/3/10 5:47:49/

img

2 月 24 日,DeepSeek 启动 “开源周”,首个开源的代码库为 FlashMLA。DeepSeek 这种挤牙膏式的宣推手段也是很有意思,看来梁文锋团队不仅仅是技术派,也擅长玩技术流量 IP。

1. FlashMLA 简介

FlashMLA 是由 depseek-ai (深度求索)开发的一个开源项目,针对 Hopper 架构 GPU(例如 H100 或 H800)的高效的 MLA 推断(Inference)解码内核,旨在加速 MLA 机制的计算,特别适用于 DeepSeek 系列模型(如 DeepSeek-V2、V3 和 R1)。

img

DeepSeek V3/R1 介绍(来源:中存算半导体)
其中 MLA 是 DeekSeek 研发的多头潜注意力(Multi-head Latent Attention)机制。通过低秩矩阵压缩 KV Cache(键值缓存),减少内存占用,同时提升模型性能。

img

FlashMLA 借鉴 FlashAttention 分块 Tiling 和显存优化的思想。通过以算代存减少对于显存带宽的要求,提升计算性能。FlashMLA 的构建基于 Cutlass 和 CUDA 体系。
FlashMLA 主要用于大模型推断 / 推理(Inference),特别是在需要处理长序列的场景中,如聊天机器人或代码生成工具。通过优化 GPU 利用率,解决大模型在推理阶段的显存瓶颈问题。

img

2. FlashMLA 的关键技术与未来优化

FlashMLA 是 MLA 技术和 Flash Attention 技术的结合,可以认为是 Flash Attention 的 MLA 版本。
FlashMLA 具有以下关键特征:
1)Flash MLA 支持变长序列和分页 KV 缓存。
2)基于 BF16 格式(FP16 也发布了)和至少 12.3 以上的 CUDA。
3)支持 Hopper 架构的 TMA 优化。
4)可显著提升 KV Cache 性能和 GPU 计算性能。在 H800 SXM5 上,可达 3000 GB/s 的计算带宽(接近 3.35TB/s 的理论峰值)。
5)开源版本暂不支持反向传播计算。
6)使用 MIT 许可证便于社区协作。
Hopper GPU 架构参考文章: https://zhuanlan.zhihu.com/p/487250706
FlashMLA 未来可能的优化方向包括:
1)通过 PTX 编程进一步提高细粒度性能
2)探索 FP8 数据格式支持(需 Hopper 架构或更先进的 TensorCore)
FlashMLA与其他相近计算方法对比

img

FlashMLA 与其他相近计算方法对比

3. 从 Memory Bound 到 Flash Attention 和 MLA

3.1. Memory Bound 与 I0-Awareness

img

传统计算芯片的分层存储架构
在传统的 GPU 和 AI 芯片中,存储架构分为不同的层次。一般来说内部的 SRAM 最快,外部的 HBM 或 DRAM 速度比 SRAM 慢很多。
1)Die 内存储: 主要用于缓存 (Cache) 及少量特殊存储单元(例如 texture),其特点是存储容量小但带宽大。SRAM 就属于常见的 Die(晶片)内存储,存储容量一般只有 20-160MB,但是带宽可以达到甚至超过 19TB/S。
2)Die 外存储:主要用于全局存储,即我们常说的显存,其特点是存储容量大但带宽小。HBM 就属于常见的 Die(晶片)外存储,存储容量一般是 40GB 以上,但带宽相比于 SRAM 小得多。

img

KV 缓存(来源:中存算半导体)
对于 Transformer 类的大模型来说,由于 KV Cache 巨大,很难直接放在 Cache 里,需要放在 HBM 或 GDDR 上,并在计算过程中频繁挪动 KV 数据。(另外有一些 Transformer Free 的结构就不需要反复挪动 KV 数据,还未成为主流技术)这时就会出现 Memory Bound(存储限制)的情况,极大影响了 KV Cache 的吞吐带宽和大模型的计算速度。
在 Flash Attention 之前,也出现过一些加速 Transformer 计算的方法,着眼点是减少计算量,例如稀疏 Attention 做近似计算。但对于 Attention 来说,GPU 计算瓶颈不在运算能力,而是在存储的读写速度上。Flash Attention 吸取了这些加速方法的教训,改为通过降低对显存 (HBM 或 GDDR) 的访问次数来加快整体性能,这类方法又被称为 I0-Awareness(IO 优先或存储优先)

3.2. Flash Attention

FlashAttention 是一种高效的注意力机制优化技术,由斯坦福等大学的研究团队开发,最早于 2022 年提出,并在后续版本(如 FlashAttention-2、FlashAttention-3)中不断完善。FlashAttention 旨在解决传统 Transformer 模型中多头注意力(Multi-head Attention, MHA)的计算和显存瓶颈,尤其是在处理长序列时。FlashAttention 通过重新设计注意力计算方式,显著提升性能,同时保持与标准注意力机制相同的数学输出,使其成为近年来生成式 AI 和大模型领域的重要技术。FlashAttention 拥有比 PyTorch(当时的版本)标准注意力快 2~4 倍的运行速度,所需内存还减少了 5~20 倍。

img

Flash Attention 技术
Flash Attention 专注于标准多头注意力的高效实现,通过减少访问显存次数,优化并行度提升计算性能,但并不直接兼容 MLA。
传统 MHA 的计算复杂度为 O(n²)(n 为序列长度),并且需要存储大量的中间结果,这在长序列任务中会导致严重的显存压力和计算延迟。FlashAttention 的核心理念是避免显式计算和存储完整的注意力矩阵,而是通过分块计算(tiling) 和融合操作,将注意力计算优化为接近 O(n) 的复杂度,同时大幅减少 GPU 内存访问。
1)分块处理: 将输入序列分割成小块(tiles),逐块计算注意力,避免一次性加载整个矩阵。
2)显存优化: 通过在线计算 softmax 和融合操作,减少中间结果的存储需求。
3)硬件架构友好: 充分利用 GPU 高速内存(如共享缓存)和并行计算能力。

3.3. MLA

DeepSeek 使用的 Multi-Head Latent Attention 技术可大大节省 KV 缓存,从而显著降低了计算成本。
MLA 的本质是对 KV 的有损压缩,提高存储信息密度的同时尽可能保留关键细节。该技术首次在 DeepSeek-V2 中引入,与分组查询和多查询注意力等方法相比,MLA 是目前开源模型里显著减小 KV 缓存大小的最佳方法。
MLA 的方法是将 KV 矩阵转换为低秩形式:将原矩阵表示为两个较小矩阵(相当于潜向量)的乘积,在推断过程中,仅缓存潜向量,而不缓存完整的键 KV。这规避了分组查询注意力和多查询注意力的查询的信息损失,从而在降低 KV 缓存的前提下获得更好的性能。

img

矩阵的低秩近似(来源:互联网)
MLA 随好,但明显没有针对现代加速框架的 FlashAttention 或 PageAttention 解决方案。这也使得 DeepSeek R1 在实际部署时需要单独优化 KV 吞吐性能。

4. FlashMLA 微架构分析

4.1. FlashMLA 核心技术

Flash MLA 的核心是高效的 MLA 解码内核,关键技术包括:
1)低秩矩阵压缩:MLA 使用低秩矩阵,将 KV 缓存压缩为潜向量,减少内存占用。通过解压潜向量生成独特的 KV 头(KV Head)。
2)针对 GPU 优化:FlashMLA 针对 Hopper GPU 的 Tensor Core 进行 youh 优化,实现了可达 3000 GB/s 的显存带宽和 580 TFLOPS 的计算性能(H800 SXM5 配置)。使用了 SM90 的关键特性 GMMA、namedbarrier 同步、cp.async。
3)Row-wise/Block-wise 优化:细粒度划分,在 shared memory 中原位处理计算,减少了额外的中间计算过程的显存占用,减少显存访问次数。
4)Split-KV 分块处理:将 KV 拆分给多个 SM(Stream Multiprocessor)处理(或者多次迭代),然后在局部把 partial 计算结果合并。
1变长序列支持:通过 tile_scheduler_metadata 和 num_splits 参数,,FlashMLA 支持变长序列的并行处理,以缓解负载不均衡问题。

4.2. FlashMLA 代码结构

https://github.com/deepseek-ai/FlashMLA
FlashMLA 提供了 Python 接口,如 get_mla_metadata 获取 MLA(Multi-Head Linear Attention)的 meta 数据;flash_mla_with_kvcache,用于获取键值缓存(KV Cache)和执行注意力(FlashMLA)计算。

img

主要代码结构如下:(需要注意代码库还在不断更新,后面又添加了 benchmark 文件夹)
1)flash_mla/ 目录
●主要文件: flash_mla_interface.py
●作用: Python 接口层,封装了底层 C++/CUDA 实现,以便将 FlashMLA 集成到 PyTorch 工作流中。这部分代码定义了 flash_mla_with_kvcache 等函数,用于执行带 KV 缓存的 MLA 前向计算。参数包括查询向量(q)、键值缓存(kvcache)、块表(block_table)、序列长度(cache_seqlens)等。2)benchmark/ 目录
●主要文件: bench_flash_mla.py
●作用: 用于对不同的多头注意力(Multi-Head Attention, MLA)实现进行基准测试和性能比较。
run_torch_mla:使用 PyTorch 实现的 MLA 基准测试。
run_flash_mla:使用 flash_mla 库实现的 MLA 基准测试。
run_flash_infer:使用 flashinfer 库实现的 MLA 基准测试。
run_flash_mla_triton:使用 Triton 实现的 MLA 基准测试
2)setup.py
●作用: 构建脚本,用于编译和安装 FlashMLA 模块。
3)csrc/ 目录
●文件:flash_api.cpp: C++ 接口,连接 Python 和 CUDA。flash_fwd_mla_bf16_sm90.cu: 核心 CUDA 内核 BF16 支持,针对 Hopper 架构(SM90)优化。flash_fwd_mla_fp16_sm90.cu:核心 CUDA 内核 FP16 支持。flash_mla.h, softmax.h, utils.h 等: 提供辅助函数和数据结构。
●作用: 实现了 FlashMLA 底层的 CUDA 实现和性能优化。
这部分代码使用 BF16(Brain Float 16)数据类型,以保障 Attention 计算精度。同时结合 FlashAttention 2/3 和 Cutlass 库,以实现高效注意力机制。
flash_mla.h:定义接口函数:
●get_mla_metadata(num_heads, head_dim, num_kv_heads, kv_head_dim, block_size, dtype):获取 MLA meta 数据。
●flash_mla_with_kvcache(q, k, v, kvcache, seqlen, metadata, causal=True):执行注意力计算。softmax.h:行 softmax 的计算(速度瓶颈)named_barrier.h:SM90 NamedBarrier 枚举同步。flash_fwd_mla_metadata.cu:定义了一个用于获取 MLA meta 数据的内核函数和一个调用该内核函数的主函数。
●get_mla_metadata_func:用于调用内核函数。使用 1 个线程块,每个线程块包含 32 个线程。并检查内核函数的启动是否成功。
Paged KV Cache 实现:
显存分块:以 64 为单位(block_size = 64),通过 block_table 维护逻辑块到物理显存的映射。
流水线:分离数据加载与计算阶段,通过 cp.async 实现异步数据预取。
flash_fwd_splitkv_mla_kernel:用于并行计算 Flash Attention 的前向传播。
flash_fwd_splitkv_mla_combine_kernel:用于合并多个分割的计算结果。

5. FlashMLA 的价值与意义

FlashMLA 是 DeepSeek 团队在 AI 性能优化领域的重要成果,实现了在英伟达 Hopper 架构 GPU 的高效 Inference。其价值在于:
1)通过开源鼓励开发者优化或适配其他硬件(如 AMD GPU 和其他 AI 芯片)。
2)鼓励开发者实现与现有加速框架(如 vLLM、SGLang 等)的集成。
是 DeepSeek 团队在 AI 性能优化领域的重要成果,实现了在英伟达 Hopper 架构 GPU 的高效 Inference。其价值在于:
1)通过开源鼓励开发者优化或适配其他硬件(如 AMD GPU 和其他 AI 芯片)。
2)鼓励开发者实现与现有加速框架(如 vLLM、SGLang 等)的集成。
强烈建议 OpenAI 把域名送给 DeepSeek。


http://www.ppmy.cn/news/1578000.html

相关文章

swift-5-汇编分析闭包本质

一、枚举、结构体、类都定义方法 方法占用对象的内存么? 不占用 方法的本质就是函数 方法、函数都存放在代码段,因为方法都是公共的,不管 对象一还是对对象二调用都是一样的,所以放在代码段,但是每个对象的成员不一样所…

DeepSeek开源Day2:DeepEP技术详解

2 月 24 日,DeepSeek 启动 “开源周”,第二个开源的代码库为 DeepEP。很好,又挤了一段有硬件基因的牙膏出来。H100/H800 绝对是 DeepSeek 的小心肝。 1 DeepEP 简介 DeepEP 是由 deepseek-ai (深度求索)开发的一个开源…

Go语言中位清除运算符的应用场景

package mainimport "fmt"func main() {a : 5 //101b : 1 //001//100 -> 4fmt.Println(a, b)//位清除 当b为0的时候取a的值,当b为1的时候取0fmt.Println(a &^ b) }《Go语言圣经》里面有对此的描述,x a &^ b,当b为…

React基础之组件通信

组件嵌套 父子传值实现 实现步骤 1.父组件传递数据-在子组件标签上绑定属性 2.子组件接收数据-子组件通过props参数接收数据 import React, { useRef, useState } from react; //父传子 //1.父组件传递数据,需要在子组件标签上绑定数据 //2.子组件接收数据 props的参…

【从零开始学习计算机科学】计算机组成原理(六)异常事件处理

【从零开始学习计算机科学】计算机组成原理(六)异常事件处理 异常事件处理异常处理的数据通路异常事件入口地址 异常事件处理 异常和中断事件改变处理机正常指令的执行顺序。异常指令执行过程中,由于操作非法和指令非法引起的事件。陷阱指陷…

idea技巧

文章目录 查看最近修改的代码或者文件折叠和展开代码显示类结构图(类的继承层次)快速定位到代码块开始位置\结束代码快速搜索和打开类快速显示类结构,可以显示类中包含的所有属性和方法在方法间快速移动定位(即光标以方法为单位移…

ARM嵌入式低功耗高安全:工业瘦客户机的智慧城市解决方案

智慧城市建设的不断推进,工业瘦客户机(Industrial Thin Client)作为一种高效、稳定的计算终端设备,正在成为智慧城市基础设施的重要组成部分。工业瘦客户机以其低功耗、高安全性和易管理性,为智慧城市的各个领域提供了…

[c语言日寄]结构体:内存对齐

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…