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

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

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

1.相关链接

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

python 复制代码
from collections import defaultdict, deque

def rolling_hash(s, base=257, mod=10**9 + 7):
    h = 0
    for ch in s:
        h = (h * base + ord(ch)) % mod
    return h

def 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:  #只处理函通信算子的pattern
            flat_window = ''.join(window)
            h = rolling_hash(flat_window, base, mod)
            sequence_data[h]['count'] += 1
            sequence_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=pos
            end=pos+length
            ts_beg=offsets[beg]
            ts_end=offsets[end]
            print(ts_beg,ts_end,operators[ts_beg:ts_end])

DEMO 输出

bash 复制代码
序列: ['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

相关推荐
STY_fish_20124 分钟前
手拆STL
java·c++·算法
小纭在努力8 分钟前
【算法设计与分析】实验——改写二分搜索算法,众数问题(算法分析:主要算法思路),有重复元素的排列问题,整数因子分解问题(算法实现:过程,分析,小结)
数据结构·python·学习·算法·算法设计与分析·实验报告·实验
芜湖xin1 小时前
【题解-洛谷】B4278 [蓝桥杯青少年组国赛 2023] 简单算术题
算法·
理智的灰太狼1 小时前
题目 3298: 蓝桥杯2024年第十五届决赛真题-兔子集结
算法·职场和发展·蓝桥杯
SSH_55233 小时前
【大模型】情绪对话模型项目研发
人工智能·python·语言模型
love530love3 小时前
【笔记】在 MSYS2(MINGW64)中安装 python-maturin 的记录
运维·开发语言·人工智能·windows·笔记·python
kingmax542120084 小时前
【洛谷P9303题解】AC- [CCC 2023 J5] CCC Word Hunt
数据结构·c++·算法·广度优先
白熊1885 小时前
【机器学习基础】机器学习入门核心算法:XGBoost 和 LightGBM
人工智能·算法·机器学习
bai_lan_ya5 小时前
数据结构-排序-排序的七种算法(2)
数据结构·算法·排序算法
G皮T6 小时前
【Python Cookbook】文件与 IO(二)
python·i/o·io·文件·gzip·stringio·bytesio