CANN/cann-recipes-infer:DeepSeek-R1预填充优化

news2026/5/9 18:57:57
基于Atlas A3集群的DeepSeek-R1模型prefill阶段推理性能优化实践【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer概述本文主要介绍基于Atlas A3 系列产品的DeepSeek-R1模型prefill阶段并行部署和性能优化策略。主要采用了混合切分策略、Double-Routing、micro-batch等关键优化技术最终在Atlas A3 系列产品实现perfect eplb下6.5k tokens/卡/s的吞吐性能。MLA (Multi-Head Latent Attention)部署策略优化DP (Data Parallelism)切分策略prefill在MLA部分可以采用纯DP计算策略每卡部署完整模型权重不对模型做任何切分该策略有以下优点纯DP切分可以避免多卡冗余KV-Cache (Key-Value Cache)每卡只需要存储本卡所接收请求的KV-Cache数据量各卡之间的KV-Cache互不相同无冗余数据。MLA部分无通信算子可以避免通信开销prefill阶段更容易用满算力在请求数据量较大时更易获得高吞吐。但是该切分策略会导致以下问题计算负载不均实际场景中输入请求的序列长度往往参差不齐处理较短序列的卡会提前完成计算随后必须等待批次中最长序列的处理完成导致计算周期被浪费。TTFT (Time to First Token)被延长若实时请求数量低于卡数部分卡将处于空闲状态若为凑齐完整批次而延迟处理会延长首token生成时间若直接处理不完整批次则会导致计算资源利用不充分。针对上述问题通过对TP (Tensor Parallelism)切分策略改进本样例提出SP-TP-SP (Sequence Parallelism, SP)混合切分策略对以上问题进行优化。SP-TP-SP混合切分策略针对输入序列采用batch和seq_len合轴的方式转换为token数量对token进行SP切分均匀的分发到各个卡上计算过程如下图所示将多个请求序列拼接后并padding到卡数的最小整数倍进行SP切分此时每张卡获取的token数相同。FlashAttentionFA计算部分采用TP策略通过将Attention head均匀分布到每张计算卡上来实现确保计算负载在多卡间均衡分布。FlashAttention计算完成之后通过AlltoAll通信将TP转换为SP切分通信算子的通信量更小性能更优此时o_proj由于需要全载权重占用内存会变高。上述切分策略每张卡的MLA阶段计算量相等计算负载均匀。假设有3个输入input0input1和input2把batch和seq_len合轴后将token均匀分布到Rank0~Rank3上down_proj包含q_a_proj和kv_a_proj计算q_up_proj和kv_up_proj分别表示q_b_proj和kv_b_proj计算此时每张卡计算数据量一致计算负载均匀。具体计算流程如下图所示上述策略有以下优势TTFT更短尤其是长序列场景比如1个128K的请求此时可以将计算均匀分布到各个卡上完成计算获得更短时延。MLA部分的计算负载均匀输入序列只需要padding到卡数的倍数即可各个卡的计算量相等几乎无冗余计算。但是该策略会引入以下问题需要通过相应的优化手段解决每卡需要存储完整的KV-Cache各卡之间的KV-Cache存在冗余占用内存高可通过将KV-Cache数据分卡存储进行规避。相对于纯DP策略MLA计算引入AllGather和AlltoAll通信该通信时间可以进一步通过micro-batch进行优化。总结当前在prefill场景中当请求量较大或KV-Cache内存占用较高时可以考虑采用DP切分策略以提升吞吐量当请求数量较少、分布不均匀或单次请求序列长度较长时可以考虑采用SP-TP-SP混合切分策略以降低时延。MoE (Mixture of Experts)部署策略优化MoE计算阶段采用EP (Expert Parallelism)切分策略即将路由专家均匀分布到每张卡上同时每张卡上同步存放一个共享专家。路由专家采用Double-Routing的计算策略完成计算其核心在于每张卡需要完成2次init-routing和finalize-routing操作。该方案有以下优点当负载相对较均匀时相对于AllGather的方案峰值内存较低每张卡只需要获取对应专家计算的token即可不存在数据冗余。相比于每张卡上获取完整token数据量通信量更低通信耗时更优。该方案的主要计算流程如下图所示主要计算步骤如下调用npu_moe_init_routing_v2接口对本卡上的token进行expand并排序得到expand_x同时获取每个专家需要计算的token个数即tokens_per_expert以及用于恢复token原始排序的参数expanded_row_idx第一次routing操作。expanded_x, expanded_row_idx, tokens_per_expert, _ torch_npu.npu_moe_init_routing_v2(...)通过对tokens_per_expert进行AlltoAll操作和ReduceSum操作获得每张卡需要向其他卡发送的token数量(input_splits)以及每张卡需要从其他卡上拿到的tokens数量output_split该参数主要用于AlltoAll通信各卡分别获取对应的token。调用AlltoAll通信接口对每张卡上的token进行交互每张卡上的专家获取本专家需要计算的token。dist.all_to_all_single(gathered_tokens, expanded_x, output_splits, input_splits, groupmoe_ep_group)此时每张卡上已经获取到本卡专家需要计算的token但是处于乱序。因此本卡需要再完成一次re_routing操作得到排序后的token分布即hidden_states_ordered_by_experts以及本卡上每个专家需要计算的token数量tokens_per_local_expert同时得到用于恢复本卡token顺序的参数gathered_ids_unsort第二次routing操作。hidden_states_ordered_by_experts, _, gathered_ids_unsort, tokens_per_local_expert torch_npu.npu_moe_re_routing(...)完成路由专家和共享专家计算。hidden_states_ordered_by_experts experts(**args)对完成计算的token进行排序恢复第一次finalize-routing操作与第二次routing操作相对应此处采用torch.index_select()接口性能更优。new_x torch.index_select(hidden_states_ordered_by_experts, 0, gathered_ids_unsort.float().argsort().int())调用AlltoAll通信接口进行token多卡交互把本卡上的token获取回来。dist.all_to_all_single(gathered_tokens, new_x, input_splits, output_splits, groupmoe_ep_group)调用finalize_routing接口对本张卡上的token进行顺序恢复得到原始排序的token第二次finalize-routing操作与第一次routing操作相对应同时可直接通过该接口完成路由专家和共享专家的加权求和。hidden_states torch_npu.npu_moe_finalize_routing( gathered_tokens, skip1hidden_states_share, skip2None, biasNone, scalestopk_weight.to(gathered_tokens.dtype), expanded_src_to_dst_rowexpanded_row_idx, export_for_source_rowNone, drop_pad_mode2 )TND格式支持常规FlashAttention采用BNSD的格式[batch, num_of_head, seq_len, head_dim]计算而对于每个请求长度均不确定的场景可能需要padding操作导致计算资源的浪费。而TND格式可以对batch和seq_len进行合轴处理即[batch*seq_len, num_of_head, head_dim]转换为token数无需padding数据即可完成计算此功能依赖于FlashAttention的功能支持。针对TND[token, num_of_head, head_dim]格式需要把所有输入的请求合成一个list进行处理。假设有4个请求seq_len长度分别为128256512和1024在FlashAttention计算时需要把所有的请求合成一个list即actual_seq_lengths_kv[128, 256, 512, 1024]即可完成对应计算无需把请求padding到统一的长度。尤其对于不定长输入的场景TND格式解决了易用性以及计算资源浪费的问题。但是实际计算时TND格式会引入以下问题数据排布不亲和对于FlashAttention计算不亲和数据访问不连续FlashAttention带宽效率较低。引入额外计算开销原始BNSD的格式需要使用transpose变成TND格式引入一些非必要的计算开销。为避免上述问题实际在FlashAttention计算中采用NTD的格式提升带宽效率的同时也减少了transpose等计算开销。在prefill阶段MLA部分实际的计算流程如下图所示采用该计算方式的优点如下相对于TND格式FlashAttention的计算效率提升15%。配合matmul权重拆分以及FlashAttention支持独立的NoPE(No Positional Encoding)和RoPE(Rotary Positional Encoding)输入可以完全消除split/concat/transpose等额外计算开销提升MLA阶段的计算效率。micro-batch优化prefill阶段通常属于计算bound的场景同时又有一定比例的通信耗时开销通信耗时占比可达30%。而计算和通信由不同的硬件单元完成如果此时计算和通信能够并行运行将进一步提升prefill阶段的性能。理想情况下通信耗时可以完全被计算掩盖这样计算效率将极大提升。因此可以把输入拆分成两个micro-batch采用双流的方式构造两条流水线通过定制化的流水排布把计算和通信并行起来最大化prefill阶段的计算效率。将输入拆分成两个micro-batch数据被一分为二会改变prefill阶段每一层计算的shapeshape的变动会导致计算和通信的效率发生变化同时在eager模式下task下发的数量也会多一倍对host要求更高。因此在prefill阶段做micro-batch优化时需要确认以下问题的影响计算和通信性能线性度较好要求输入数据切分前计算和通信的性能近似等于切分后两份数据的计算和通信性能加和这样可以最小化避免因shape变化导致的性能劣化。计算未出现host bound如果模型本身就是host bound场景此时通过双流实现micro-batch会导致host性能劣化整体耗时劣化。MLA-DP和MoE-EP场景micro-batch策略MLA采用DP切分的情况下整个prefill阶段的通信算子主要来源于MoE阶段的AlltoAll通信dispatch阶段和combine阶段。因此该阶段micro-batch的核心目标就是通过计算掩盖dispatch和combine两个阶段的通信耗时最大化prefill阶段的计算效率。 该场景的流水排布如下图所示其主要步骤如下计算和通信划分将prefill的计算划分为6个阶段分别为atten、init_routing、dispatch、mlp、combine、finalize_routing 图中 atten主要包含MLA和o_proj计算dispatch主要包含将token分发到对应专家的AlltoAll通信mlp主要包含路由专家和共享专家计算combine主要包含把token恢复到各卡上的AlltoAll通信。micro-batch预处理将输入划分成2个micro-batch进行处理假设每卡上面有2个4k请求则每个micro-batch处理1个4k请求当2个micro-batch全部计算完成时则完成所有的计算处理。通信处理由于通信和计算并行此时不能使能HCCL_OP_EXPANSION_MODE的AIV模式采用默认SDMA模式。如果采用AIV模式则会导致通信和计算硬件资源抢占时延变长。创建流针对DPEP的切分策略场景将所有的计算放在默认计算流上。curr_stream torch.npu.current_stream()新建一条流用于通信stream1 torch.npu.Stream()流水排布将计算放到当前流上进行如下所示with torch.npu.stream(curr_stream): # 在curr_stream进行atten计算 atten()将通信放到stream1上进行计算with torch.npu.stream(stream1): # 在stream1进行atten计算 dispatch()针对需要同步的位置可以采用以下方式进行两条流的同步操作event0 curr_stream.record_event() ... stream1.wait_event(event0)通过使能micro-batch计算dispatch和combine阶段的通信完全被计算掩盖整个prefill阶段完全处于计算bound的状态芯片侧无空闲时间因此端到端的计算效率得到提升。基于Atlas A3 系列产品prefill采用2机共计16卡环境部署输入序列为64*4K假设MoE层专家负载均匀条件下性能测试结果如下切分策略时延(ms)总吞吐(tokens/s)平均吞吐(tokens/卡/s)MLA-DP32 MoE-EP323128838055237MLA-DP32 MoE-EP32 micro-batch25121043566522该切分策略下开启micro-batch特性可获得25%的性能提升。Matmul类算子使能weightNZ格式针对DeepSeek模型中的Matmul类计算可以将模型权重中的weight Tensor处理成昇腾AI处理器亲和的格式weightNZ这样可以进一步提升Matmul的计算效率。weightNZ格式为512Bytes对齐的格式可以有效提升硬件的带宽访问效率以int8类型的Tensorshape是[16384, 7168]为例转换为NZ格式为[224, 1024, 16, 32]附录环境部署以及样例执行【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2598388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…