DeepSeek开源周首日:发布大模型加速核心技术可变长度高效FlashMLA 加持H800算力解码性能狂飙升至3000GB/s

news/2025/2/25 5:22:58

FlashMLA的核心技术特性包括对BF16精度的全面支持,以及采用块大小为64的页式键值缓存(Paged KV Cache)系统,实现更精确的内存管理。在性能表现方面,基于CUDA12.6平台,FlashMLA在H800SXM5GPU上创下了显著成绩:在内存受限场景下达到3000GB/s的处理速度,在计算受限场景下则实现580TFLOPS的算力水平。

1. 核心功能与特性

  • 性能提升
    FlashMLA在H800 SXM5 GPU(CUDA 12.6)上表现亮眼:

    • 内存受限场景下带宽达3000 GB/s
    • 计算受限场景下算力峰值达580 TFLOPS(BF16精度)
  • 关键技术优化

    • 变长序列处理:针对自然语言处理中的动态序列长度优化,提升长文本推理效率。
    • 分页KV缓存:块大小为64的分页机制,减少显存碎片化,提升内存利用率。
    • BF16支持:通过低精度计算降低内存占用,同时保持模型性能。
  • MLA架构创新
    相比传统注意力机制,MLA通过低秩压缩技术将每次查询的KV缓存量减少93.3%,显著降低推理时的显存需求,尤其适合长上下文场景。


2. 技术背景与意义

  • 解决行业痛点
    Transformer模型在长序列推理时面临KV缓存膨胀问题,导致显存占用高、硬件成本攀升。FlashMLA通过MLA架构和并行解码设计,将推理成本降低约80-90%,同时支持更高吞吐量

  • 开源生态价值
    FlashMLA开源代码库(GitHub链接)整合了FlashAttention-2/3和CUTLASS的技术实现,为开发者提供可复现的优化方案,加速AGI技术迭代。


3. 应用场景与部署

  • 适用场景

    • 大语言模型(LLM)推理加速,如对话AI、实时翻译、长文本生成等。
    • 需要低延迟、高吞吐的工业级NLP任务。
  • 部署要求

    • 硬件:Hopper架构GPU(如H800/H100)
    • 软件:CUDA 12.3+、PyTorch 2.0+

4. 对行业的影响

  • 成本革命
    DeepSeek通过MLA技术将模型训练和推理成本压缩至行业标杆水平。例如,其V3模型的训练成本仅600万美元(未含研发投入),而MLA的推理优化进一步降低商业化门槛。

  • 算力效率提升
    结合MoE(混合专家模型)架构和多Token预测技术,DeepSeek在单位算力下实现更高性能,推动行业从“堆算力”向“优化算法”转型。

  • 开源竞争格局
    此次开源被视为对Meta Llama、Mistral等项目的直接挑战,可能加速闭源与开源模型的性能差距缩小。


FlashMLA的发布标志着DeepSeek在高效计算领域的技术领先地位,其开源策略或将重塑大模型开发范式,推动更多低成本、高性能AI应用的涌现。

5.快速开始

安装

可以使用以下命令进行安装:

python setup.py install
基准测试

运行以下命令进行基准测试:

python tests/test_flash_mla.py
使用示例

在Python中可以这样使用:

from flash_mla import get_mla_metadata, flash_mla_with_kvcache

tile_scheduler_metadata, num_splits = get_mla_metadata(cache_seqlens, s_q * h_q // h_kv, h_kv)

for i in range(num_layers):
    ...
    o_i, lse_i = flash_mla_with_kvcache(
        q_i, kvcache_i, block_table, cache_seqlens, dv,
        tile_scheduler_metadata, num_splits, causal=True,
    )
    ...

6.核心代码的详细解释

以下是对 FlashMLA/flash_mla/flash_mla_interface.py 文件中:

get_mla_metadata 函数

def get_mla_metadata(
    cache_seqlens: torch.Tensor,
    num_heads_per_head_k: int,
    num_heads_k: int,
) -> Tuple[torch.Tensor, torch.Tensor]:
    """
    Arguments:
        cache_seqlens: (batch_size), dtype torch.int32.
        num_heads_per_head_k: Equals to seq_len_q * num_heads_q // num_heads_k.
        num_heads_k: num_heads_k.

    Return:
        tile_scheduler_metadata: (num_sm_parts, TileSchedulerMetaDataSize), dtype torch.int32.
        num_splits: (batch_size + 1), dtype torch.int32.
    """
    return flash_mla_cuda.get_mla_metadata(cache_seqlens, num_heads_per_head_k, num_heads_k)
  • 功能:该函数用于获取MLA(Multi-Head Attention)的元数据。
  • 参数
    • cache_seqlens:一个形状为 (batch_size)torch.Tensor,数据类型为 torch.int32,表示缓存的序列长度。
    • num_heads_per_head_k:整数类型,其值等于 seq_len_q * num_heads_q // num_heads_k
    • num_heads_k:整数类型,表示 num_heads_k 的值。
  • 返回值
    • tile_scheduler_metadata:形状为 (num_sm_parts, TileSchedulerMetaDataSize)torch.Tensor,数据类型为 torch.int32
    • num_splits:形状为 (batch_size + 1)torch.Tensor,数据类型为 torch.int32
  • 实现细节:该函数直接调用 flash_mla_cuda 模块中的 get_mla_metadata 函数,并将输入参数传递给它,然后返回该函数的结果。

flash_mla_with_kvcache 函数

def flash_mla_with_kvcache(
    q: torch.Tensor,
    k_cache: torch.Tensor,
    block_table: torch.Tensor,
    cache_seqlens: torch.Tensor,
    head_dim_v: int,
    tile_scheduler_metadata: torch.Tensor,
    num_splits: torch.Tensor,
    softmax_scale: Optional[float] = None,
    causal: bool = False,
) -> Tuple[torch.Tensor, torch.Tensor]:
    """
    Arguments:
        q: (batch_size, seq_len_q, num_heads_q, head_dim).
        k_cache: (num_blocks, page_block_size, num_heads_k, head_dim).
        block_table: (batch_size, max_num_blocks_per_seq), torch.int32.
        cache_seqlens: (batch_size), torch.int32.
        head_dim_v: Head_dim of v.
        tile_scheduler_metadata: (num_sm_parts, TileSchedulerMetaDataSize), torch.int32, return by get_mla_metadata.
        num_splits: (batch_size + 1), torch.int32, return by get_mla_metadata.
        softmax_scale: float. The scaling of QK^T before applying softmax. Default to 1 / sqrt(head_dim).
        causal: bool. Whether to apply causal attention mask.

    Return:
        out: (batch_size, seq_len_q, num_heads_q, head_dim_v).
        softmax_lse: (batch_size, num_heads_q, seq_len_q), torch.float32.
    """
    if softmax_scale is None:
        softmax_scale = q.shape[-1] ** (-0.5)
    out, softmax_lse = flash_mla_cuda.fwd_kvcache_mla(
        q,
        k_cache,
        None,
        head_dim_v,
        cache_seqlens,
        block_table,
        softmax_scale,
        causal,
        tile_scheduler_metadata,
        num_splits,
    )
    return out, softmax_lse
  • 功能:该函数用于执行带有键值缓存(KVCache)的MLA操作。
  • 参数
    • q:形状为 (batch_size, seq_len_q, num_heads_q, head_dim)torch.Tensor,表示查询张量。
    • k_cache:形状为 (num_blocks, page_block_size, num_heads_k, head_dim)torch.Tensor,表示键缓存张量。
    • block_table:形状为 (batch_size, max_num_blocks_per_seq)torch.Tensor,数据类型为 torch.int32,表示块表。
    • cache_seqlens:形状为 (batch_size)torch.Tensor,数据类型为 torch.int32,表示缓存的序列长度。
    • head_dim_v:整数类型,表示 v 的头维度。
    • tile_scheduler_metadata:形状为 (num_sm_parts, TileSchedulerMetaDataSize)torch.Tensor,数据类型为 torch.int32,由 get_mla_metadata 函数返回。
    • num_splits:形状为 (batch_size + 1)torch.Tensor,数据类型为 torch.int32,由 get_mla_metadata 函数返回。
    • softmax_scale:可选的浮点数,表示在应用softmax之前对 QK^T 进行缩放的比例,默认为 1 / sqrt(head_dim)
    • causal:布尔类型,表示是否应用因果注意力掩码,默认为 False
  • 返回值
    • out:形状为 (batch_size, seq_len_q, num_heads_q, head_dim_v)torch.Tensor,表示输出张量。
    • softmax_lse:形状为 (batch_size, num_heads_q, seq_len_q)torch.Tensor,数据类型为 torch.float32,表示softmax的对数和指数(LogSumExp)。
  • 实现细节
    • 如果 softmax_scale 未提供,则将其设置为 q 张量最后一个维度的平方根的倒数。
    • 调用 flash_mla_cuda 模块中的 fwd_kvcache_mla 函数,传递相应的参数,并将返回的结果赋值给 outsoftmax_lse
    • 最后返回 outsoftmax_lse

这些函数主要是作为Python接口,调用底层的CUDA实现(flash_mla_cuda 模块)来完成MLA操作和元数据的获取。


http://www.niftyadmin.cn/n/5864996.html

相关文章

大模型在术后认知功能障碍预测及临床方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 研究创新点 二、术后认知功能障碍概述 2.1 定义与表现 2.2 危害与影响 2.3 发病机制与相关因素 三、大模型技术原理与应用现状 3.1 大模型技术原理 3.2 大模型在医疗领域的应用 四、基于大模型的术后认知…

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当&…

npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。

这个错误是因为 Windows 系统的 PowerShell 执行策略 限制了脚本的运行。默认情况下,PowerShell 的执行策略是 Restricted,即禁止运行任何脚本。以下是解决该问题的步骤: 1. 检查当前执行策略 打开 PowerShell(管理员权限&#x…

人工智能、机器学习、深度学习和大语言模型之间的关系

人工智能(AI)、机器学习(ML)、深度学习(DL)和大语言模型(LLM)之间是逐层包含且技术递进的关系,具体如下: 1. 层级关系 人工智能(AI)…

通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形

论文标题 英文标题:Improving TSN Traffic Shaping with Constant Bandwidth Server Scheduling 中文标题:通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形 作者信息 作者:Benjamin van Seggelen 指导教师&am…

大模型经济困局突围战:寻找打破“算力暴政“的下一个奇点

目录 大模型经济困局突围战:寻找打破"算力暴政"的下一个奇点 小瓜有话说 一、繁荣表象下消失的利润 二、困住AI商业化的三层铁笼 1、精度陷阱:99%到99.9%的死亡区间 2、无法承受的试错成本 3、通用性与专业性的两难 三、可能改写游戏规…

请谈谈 React 中的虚拟 DOM,如何通过 Diff 算法最小化真实DOM 更新次数?

一、虚拟DOM核心原理与Diff算法机制 1. 虚拟DOM的本质 虚拟DOM是轻量级的JavaScript对象,用于描述真实DOM结构。每次组件状态变化时,React会生成新的虚拟DOM树,通过对比新旧树差异(Diffing)来最小化DOM操作。 // 虚…

AI学习第二,三天-Python基础

变量、运算符与数据类型详解 注释 在 Python 中,注释是用于增加代码可读性、解释代码功能但不会被程序执行的部分。 单行注释:使用 # 符号,从 # 开始到本行末尾的内容均为注释。例如: 收起 python # 这是一个单行注释&#xff…