当前位置: 首页 > news >正文

基于Triton的layernorm算子调优实践分析

作者昇腾实战派背景在进行视频生成模型的推理调优时通过分析profiling发现layernorm算子存在异常耗时现象。为了提高模型的推理效率需要对layernorm算子进行优化。本文将详细介绍问题的背景、原因分析及优化方案。问题描述在profiling中layernorm算子的执行过程中host在正式下发layernorm算子之前先分别下发了aclnnCast_SliceAiCore_Slice和aclnnCast_CastAiCore_Cast两个算子。这两个算子的作用是什么能否省掉原因分析通过查看op_summary文件可以详细了解到这两个算子的输入输出dtype和shape。具体信息如下图所示从summary中可以看出第一个算子的作用是将shape为[50220, 9, 128]的输入张量切分为shape为[50220, 3, 128]的张量第二个算子的作用是将切分后的张量数据类型从bfloat16转换为float32。第二个算子的原因不难分析因为代码中layernorm的实现是用的torch原生算子如图所示nn.layernorm的底层算子输入数据类型为float因此需要使用cast算子对数据类型进行转换。观察第一个算子的summary进一步产生了另一个疑问layernorm的输入shape为什么是[50220, 9, 128]呢明明在代码中已经通过unbind操作转换成[50220, 3, 128]了如下图所示这涉及到PyTorch中tensor的存储机制。tensor分为头信息区Tensor和存储区Storage。信息区主要保存着tensor的形状size、步长stride、数据类型dtype等信息而真正的数据则以连续一维数组的形式存储在存储区。如下图所示像view、reshape、unbind这一类的操作只是在host侧改变头信息区的指针ptr、步长stride等索引信息实际上并没有改变存储区device侧的storage。因此vid_q, vid_k, vid_v vid_qkv.unbind(1)这行代码的操作具象到实际内存中可以用下图来表示由此可见layernorm的输入张量vid_q并不是连续内存只不过是host侧的索引变了。因此遵循aclnnLayerNorm算子的输入规范需使用aclnnCast_SliceAiCore_Slice进行切片转换在device侧变成连续存储形式。算子优化本次优化的目的是跳过host侧的unbind操作并消除aclnnCast_SliceAiCore_Slice算子。为此需要开发一个支持非连续内存的layernorm算子。调用接口deftriton_inplace_layer_norm(qk:torch.Tensor,# 支持从 qkv slice 出来的不连续 tensorgamma:torch.Tensor,beta:torch.Tensor,):seq_len,n_heads,head_dimqk.shape# 50220, 3, 128seq_strideqk.stride(0)# 1152grid(48,)_inplace_layer_norm_kernel[grid](qk,gamma,beta,seq_len,n_heads,seq_stride,head_dim,eps1e-5,BLOCK_SIZE_SEQ64)returnqk调用接口比较简单易懂入参包括输入张量qk实际上是上文中的vid_q。gamma指的是原始layernorm的权重weight。beta指的是原始layernorm的权重bias。seq_len序列长度这里等于50220。n_headshead的数目这里等于3。seq_stride输入张量在序列维度的步长这里等于3x3x1281152。head_dim每个头的维度这里等于128。epslayernorm的分母防0参数。BLOCK_SIZE_SEQ这里指将每64个token划分为一个block方便在kernel中处理。中括号中的grid可以简单理解为并行处理的内核数和硬件能力有关这里设置为48是因为设备共有48个vector计算单元。kernel实现triton.jitdef_inplace_layer_norm_kernel(# Pointers to inputs/outputsinout_ptr,# [seq_len, n_heads, head_dim]gamma_ptr,# [head_dim]beta_ptr,# [head_dim]# Shapesseq_len:tl.constexpr,n_heads:tl.constexpr,seq_len_stride:tl.constexpr,head_dim:tl.constexpr,eps:tl.constexpr,BLOCK_SIZE_SEQ:tl.constexpr,):pidtl.program_id(0)num_programstl.num_programs(0)# 返回沿着指定 axis0 启动的程序实例的数量。 48个num_seq_blocks(seq_lenBLOCK_SIZE_SEQ-1)//BLOCK_SIZE_SEQ# 按序列划分共有785个seq block待处理num_programs_seqnum_programs//n_heads# 所有pid一起能够并行处理16个seq blockcol_offstl.arange(0,head_dim)# [0, 1, 2, ...., 127]gammatl.load(gamma_ptrcol_offs)betatl.load(beta_ptrcol_offs)forseq_block_idinrange(pid//n_heads,num_seq_blocks,num_programs_seq):seq_indicesseq_block_id*BLOCK_SIZE_SEQtl.arange(0,BLOCK_SIZE_SEQ)seq_maskseq_indicesseq_len head_idxpid%n_heads input_row_base_offsseq_indices*seq_len_stride input_row_offsinput_row_base_offshead_idx*head_dim output_row_base_offsseq_indices*seq_len_stride output_row_offsoutput_row_base_offshead_idx*head_dim q_block_offsinput_row_offs[:,None]col_offs[None,:]# load q and cast to float32qtl.load(inout_ptrq_block_offs,maskseq_mask[:,None],other0.0)q_fp32q.to(tl.float32)# compute mean varrow_meantl.sum(q_fp32,axis1,keep_dimsTrue)/head_dim row_vartl.sum(q_fp32*q_fp32,axis1,keep_dimsTrue)/head_dim-row_mean*row_mean rstdtl.rsqrt(row_vareps)# normalize qq_fp32(q_fp32-row_mean)*rstd q_fp16q_fp32.to(inout_ptr.dtype.element_ty)q_fp16q_fp16*gammabeta# store back qq_out_block_offsoutput_row_offs[:,None]col_offs[None,:]tl.store(inout_ptrq_out_block_offs,q_fp16,maskseq_mask[:,None])
http://www.zskr.cn/news/1339357.html

相关文章:

  • 气缸机 vs 气囊机怎么选?2026 中立客观拆解:别再纠结效果,核心看长期稳定性
  • 通过Taotoken的审计日志功能追踪团队内部的大模型API调用情况
  • 信创验收避坑指南:从一份紧急的补充材料,谈合规检测的必要性
  • SleeperX:macOS系统级电源管理架构解析与深度集成方案
  • Midjourney拟态风终极内参(2024.06最新版):含6类行业专属LORA融合权重表、11个失效规避checklist及3个已验证绕过--v 6.2限流机制的prompt结构
  • H5手写签名终极解决方案:如何实现专业级笔锋效果的电子签名?
  • 老挝语TTS项目被拒3次?ElevenLabs合规性红线清单(含Lao语言政策备案要求、儿童语音禁用场景、宗教术语过滤规则)
  • Wand-Enhancer终极指南:免费解锁WeMod专业版与远程控制功能
  • Nodejs后端服务接入Taotoken多模型API的实践教程
  • 如何3步免费下载百度文库文档:PDF保存终极指南
  • 对比直接调用与通过 Taotoken 调用的稳定性体验差异
  • 不止于指路,智慧导览如何重构公共空间价值
  • ElevenLabs海南话语音部署避坑清单(含IPA音标对齐表+海口话声调模板),限免领取仅剩200份
  • 如何让Switch手柄在Windows电脑上完美工作:终极解决方案指南
  • 2026 成都高端西装定制权威评测:天府之国的商务休闲智慧 - 西装爱好者
  • 2025 年欧美明星人形机器人企业接连倒闭,中国企业融资却屡创新高,赛道冰火两重天!
  • 2026 在线考试系统哪个好?功能、客户、方案、优势与服务全对比
  • 2026中国AIGC产业峰会启幕,大咖共探AI Agent落地与大模型突破路径
  • IDEA 如何配置 Live Template 快速生成常用代码片段?
  • 【RT-DETR实战】059、查询(Query)的初始化与优化策略:从调试血泪史说起
  • 【RT-DETR实战】058、Token聚类与合并策略以减少计算量
  • ElevenLabs声库私有化部署可行性白皮书(非官方但经生产环境验证):仅限Enterprise Tier的4项隐藏能力,含本地语音缓存策略与离线情感注入模块
  • List.stream().min
  • CANN 上跑 Llama3-70B:我踩了 5 个坑,这些经验值 3000 字
  • Java 常用类 - 比较两个 Integer 对象、Integer 转 Long、Long 转 Integer
  • Unity火车物理模拟:轨道拓扑与车厢耦合的工程化实现
  • 突破底层运维瓶颈:高阶女工程师的医美维稳架构与高通量胶原蛋白饮选型指南
  • 全球Web4数字基建企业排行:技术与生态实力盘点 - 互联网科技品牌测评
  • Midscene.js终极指南:5分钟让AI成为你的全能操作员
  • 2026年Q2中国管道清淤优质厂家首选推荐:合肥玉通管道工程有限公司 - 安互工业信息