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

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列

  • 1.相关链接
  • 2.代码【仅分析带通信算子的Pattern】
  • 3.在实际工程中发现 ['all_gather', 'matrix_mm_out']频率最高
  • 4.[Ascend MC2](https://gitee.com/ascend/MindSpeed/blob/master/docs/features/mc2.md)
  • 5.torch_npu.npu_all_gather_base_mm

本文尝试分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列

1.相关链接

  • Ascend C 2.0新特性详解,支撑大模型融合算子高效开发

2.代码【仅分析带通信算子的Pattern】

from collections import defaultdict, dequedef rolling_hash(s, base=257, mod=10**9 + 7):h = 0for ch in s:h = (h * base + ord(ch)) % modreturn hdef find_top_n_fixed_length_sequences(arr, length, top_n):# 创建一个字典来存储子序列及其出现次数和偏移位置sequence_data = defaultdict(lambda: {"count": 0, "positions": []})base, mod = 257, 10**9 + 7# 滑动窗口计算固定长度子序列for i in range(len(arr) - length + 1):window = arr[i:i + length]if "all_gather" in window or "reduce_scatter" in window:  #只处理函通信算子的patternflat_window = ''.join(window)h = rolling_hash(flat_window, base, mod)sequence_data[h]['count'] += 1sequence_data[h]['positions'].append(i)# 按照出现频率排序,并获取前N个子序列sorted_sequences = sorted(sequence_data.items(), key=lambda item: item[1]['count'], reverse=True)top_sequences = sorted_sequences[:top_n]return top_sequences, sequence_data# 加载profiler生成的timeline,提取出算子名列表及偏移未知,这里构造了一个简单的数据
operators=["mm","all_gather","binary_add","dropout_backward","fill","eltwise_silu","mm","all_gather","fill"]
offsets=range(0,len(operators))# 要求最少两个元素的子序列,且取前3个出现频率最高的长度为2的子序列
length = 2
top_n = 1# 获取前N个频繁的长度为固定长度的子序列
top_sequences, sequence_data = find_top_n_fixed_length_sequences(operators, length, top_n)# 反向查找实际的序列值
reverse_lookup = {}
for i in range(len(operators) - length + 1):window = operators[i:i + length]flat_window = ''.join(window)h = rolling_hash(flat_window)if h not in reverse_lookup:reverse_lookup[h] = window# 输出结果并去重
unique_sequences = set()  # 用来跟踪已经输出的序列
for seq_hash, data in top_sequences:seq = reverse_lookup[seq_hash]seq_tuple = tuple(seq)if seq_tuple not in unique_sequences:unique_sequences.add(seq_tuple)positions = sequence_data[seq_hash]['positions']print(f'序列: {seq}, 出现频率: {data["count"]}')for pos in positions:beg=posend=pos+lengthts_beg=offsets[beg]ts_end=offsets[end]print(ts_beg,ts_end,operators[ts_beg:ts_end])

DEMO 输出

序列: ['mm', 'all_gather'], 出现频率: 2
0 2 ['mm', 'all_gather']
6 8 ['mm', 'all_gather']

3.在实际工程中发现 [‘all_gather’, ‘matrix_mm_out’]频率最高

4.Ascend MC2

在这里插入图片描述

5.torch_npu.npu_all_gather_base_mm

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 12、matlab中for循环,if else判断语句,break和continue用法以及switch case语句使用
  • ORA-12537: TNS:连接关闭/Io 异常: Got minus one from a read call
  • Open3D SVD算法实现对应点集配准
  • CountDownLatch 是 Java 中的一个同步辅助工具类
  • 线程池工具类
  • IT专业高考假期入门指南
  • 大数据期末复习——hadoop、hive等基础知识
  • C++进阶:继承和多态
  • CSS原子化
  • 2024年7月1日,公布的OpenSSH的漏洞【CVE-2024-6387】
  • 刷算法Leetcode---9(二叉树篇Ⅲ)
  • Vue.js 中属性绑定的详细解析:冒号 `:` 和非冒号的区别
  • 1125 子串与子列
  • 【3】迁移学习模型
  • 软件开发面试题(C#语言,.NET框架)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Android框架之Volley
  • Bytom交易说明(账户管理模式)
  • Debian下无root权限使用Python访问Oracle
  • echarts花样作死的坑
  • js写一个简单的选项卡
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • oldjun 检测网站的经验
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • windows-nginx-https-本地配置
  • XForms - 更强大的Form
  • Xmanager 远程桌面 CentOS 7
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $.proxy和$.extend
  • %check_box% in rails :coditions={:has_many , :through}
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (javascript)再说document.body.scrollTop的使用问题
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Python第六天)文件处理
  • (二)pulsar安装在独立的docker中,python测试
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (转)Linux下编译安装log4cxx
  • (转载)Linux 多线程条件变量同步
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .NET/C# 的字符串暂存池
  • .net6Api后台+uniapp导出Excel
  • .Net6使用WebSocket与前端进行通信
  • .net流程开发平台的一些难点(1)
  • .NET中使用Protobuffer 实现序列化和反序列化
  • @AliasFor注解