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

GE 和 Runtime:不是上下游,是协同决策

你以为 GE 做完融合决策交给 Runtime 执行就行了其实它们是一个协同系统——GE 决定融什么Runtime 决定怎么跑但 GE 的融合决策必须考虑 Runtime 的调度约束Runtime 的调度策略也必须参考 GE 的融合结果。这一篇把 GE 和 Runtime 的协同工作机制拆开来说说四个被误解的设计决策。GE 不是图优化器是融合决策引擎很多人以为 GEGraph Engine就是做图优化的——算子融合、内存优化、计算图重写。这些都没错但不是 GE 的核心。GE 的核心是融合决策——根据算子的 shape、dtype、tiling 参数决定哪些算子可以融合、以什么顺序融合、融合后的算子怎么调度。这个决策过程不是固定的是可学习的——你可以读 GE 的融合规则甚至写自定义的融合 pass。# GE 的融合决策过程简化版# 来源ge/frontend/fusion_pass/flash_attention_fusion_pass.cc# 决策1输入 dtype 检查必须是 float16# if (input_dtype ! DT_FLOAT16) return false;# 决策2seq_len 检查必须是 2 的幂次方# int seq_len input_shape[2];# if ((seq_len (seq_len - 1)) ! 0) return false;# 决策3Q、K、V 的 seq_len 必须相同# if (q_shape[2] ! k_shape[2] || q_shape[2] ! v_shape[2]) return false;# 决策4必须开启 causal mask训练场景# if (!is_causal) return false;# 验证查看 GE 的融合决策日志importos os.environ[ASCEND_GLOBAL_LOG_LEVEL]3os.environ[GE_LOG_TO_STDOUT]1importtorch Qtorch.randn(4,32,2048,64,dtypetorch.float16).npu()Ktorch.randn(4,32,2048,64,dtypetorch.float16).npu()Vtorch.randn(4,32,2048,64,dtypetorch.float16).npu()outputtorch.nn.functional.scaled_dot_product_attention(Q,K,V,is_causalTrue)torch.npu.synchronize()# 在日志输出中搜索 FlashAttentionFusionPass# 如果看到 FlashAttentionFusionPass: success说明 GE 的融合决策成功了误解GE 是图优化器做的事情就是算子融合、内存优化。纠正GE 的核心是融合决策——根据算子的 shape/dtype/tiling决定哪些算子可以融合、以什么顺序融合。这个决策过程是可学习的。Runtime 不是任务调度器是overlap 协调器很多人以为 Runtime 就是调度算子执行的——哪个算子先执行、哪个后执行、哪些可以并行。这些都没错但不是 Runtime 的核心。Runtime 的核心是overlap——让数据搬运和计算重叠起来。具体来说当前 tile 的计算在进行的时候Runtime 已经把下一个 tile 的数据从 HBM 搬到 UB 上了。这样计算单元就不会停下来等数据。# Runtime 的 overlap 机制简化版# 来源runtime/core/mem_manager/overlap_manager.cc# overlap 的核心逻辑# 1. 把算子按 tile 切分# 2. 当前 tile 在计算的时候预取下一个 tile 的数据# 3. 计算完当前 tile立刻开始计算下一个 tile数据已经就位# 验证用 Profiler 抓 trace看计算 kernel 和数据搬运 kernel 的时间轴fromtorch_npu.profilerimportprofile,ProfilerActivity Qtorch.randn(4,32,4096,64,dtypetorch.float16).npu()Ktorch.randn(4,32,4096,64,dtypetorch.float16).npu()Vtorch.randn(4,32,4096,64,dtypetorch.float16).npu()withprofile(activities[ProfilerActivity.NPU],export_nameruntime_overlap.json):outputtorch.nn.functional.scaled_dot_product_attention(Q,K,V,is_causalTrue)torch.npu.synchronize()# 分析 runtime_overlap.json# - 如果计算 kernelFlashAttentionKernel和数据搬运 kernelMemcpyH2D有重叠# → Runtime 的 overlap 生效了 ✅# - 如果计算 kernel 和数据搬运 kernel 完全串行# → Runtime 的 overlap 未生效 ❌# 对比 overlap 开启/关闭的性能os.environ[ASCEND_OVERLAP_DISABLE]1# 关闭 overlaptorch.npu.synchronize()starttime.time()for_inrange(50):outputtorch.nn.functional.scaled_dot_product_attention(Q,K,V,is_causalTrue)torch.npu.synchronize()endtime.time()print(foverlap 关闭后 50 次耗时:{end-start:.2f}s)os.environ[ASCEND_OVERLAP_DISABLE]0# 开启 overlaptorch.npu.synchronize()starttime.time()for_inrange(50):outputtorch.nn.functional.scaled_dot_product_attention(Q,K,V,is_causalTrue)torch.npu.synchronize()endtime.time()print(foverlap 开启后 50 次耗时:{end-start:.2f}s)误解Runtime 是任务调度器决定算子执行顺序。纠正Runtime 的核心是 overlap——让数据搬运和计算并行减少计算单元等待数据的时间。GE 和 Runtime 不是上下游是协同决策很多人以为 GE 做完融合决策生成融合后的算子交给 Runtime 执行就行了。这个理解太浅了。GE 的融合决策必须考虑 Runtime 的调度约束。比如如果一个算子融合后太大tile 数太多Runtime 可能无法有效地做 overlap因为内存不够存两个 tile 的数据。GE 在决策融合的时候必须参考 Runtime 的 overlap 可行性。反过来Runtime 的调度策略也必须参考 GE 的融合结果。比如融合后的算子更适合 tile 级 pipeline因为一个融合算子内部可以切分 tileRuntime 会根据融合算子的特性调整调度策略。# GE 和 Runtime 的协同决策简化版# 场景GE 在决策是否为 FlashAttention 做融合时会参考 Runtime 的 overlap 可行性# GE 的考虑# 1. 融合后的 FlashAttentionKernel 有多大tile 数 × 每个 tile 的 UB 占用# 2. Runtime 能不能有效地做 overlapUB 够不够存两个 tile 的数据# 3. 如果 UB 不够GE 可能不会触发融合或者选择一个更小的 tile 大小# Runtime 的考虑# 1. 这个算子是不是融合算子融合算子更适合 tile 级 pipeline# 2. 融合算子的 tile 大小是多少决定预取策略# 3. 根据融合算子的特性调整调度策略比如更多的 pipeline 级# 验证对比不同 tile 大小下GE 是否触发融合 Runtime 的 overlap 效率importtorchimporttimefortile_sizein[64,128,256,512]:Qtorch.randn(4,32,4096,tile_size,dtypetorch.float16).npu()Ktorch.randn(4,32,4096,tile_size,dtypetorch.float16).npu()Vtorch.randn(4,32,4096,tile_size,dtypetorch.float16).npu()# 查看 GE 日志看这个 tile_size 下是否触发了 FlashAttentionFusionoutputtorch.nn.functional.scaled_dot_product_attention(Q,K,V,is_causalTrue)torch.npu.synchronize()# 计时starttime.time()for_inrange(100):outputtorch.nn.functional.scaled_dot_product_attention(Q,K,V,is_causalTrue)torch.npu.synchronize()endtime.time()print(ftile_size{tile_size}, 100次耗时:{end-start:.2f}s)# 用 npu-smi 查看 Compute Cube 利用率# 如果利用率 80%说明 Runtime 的 overlap 做得好计算单元没怎么等数据# 如果利用率 50%说明计算单元经常在等数据overlap 没生效或 tile 大小不合适误解GE 和 Runtime 是上下游关系——GE 做完决策Runtime 执行就行。纠正GE 和 Runtime 是协同决策关系——GE 的融合决策要考虑 Runtime 的调度约束Runtime 的调度策略要参考 GE 的融合结果。ops-transformer 不是被动适应是主动配合很多人以为 ops-transformer 的算子只要实现功能就行GE 和 Runtime 会自动优化。这个理解是错的。ops-transformer 的算子设计必须主动配合GE 的融合规则和 Runtime 的调度策略。具体来说暴露 tiling 参数让 GE 在决策融合的时候知道这个算子支持什么样的 tile 大小支持 causal mask让 GE 在匹配 FlashAttentionFusionPass 的时候知道这个算子支持 causal mask优化 UB 使用让 Runtime 在做 overlap 的时候有足够的内存预取下一个 tile 的数据# ops-transformer 的算子设计主动配合 GE 和 Runtime# 来源ops-transformer/src/ops_transformer/flash_attention/flash_attention_kernel.cpp# 主动配合1暴露 tiling 参数让 GE 知道这个算子支持什么 tile 大小# void FlashAttentionKernel(..., int tiling) { ... }# 主动配合2支持 causal mask让 GE 匹配 FlashAttentionFusionPass# if (causal) { ... // 在 softmax 之前把 mask 位置设为 -inf ... }# 主动配合3优化 UB 使用让 Runtime 有足够的空间做 overlap# - 每个 tile 的 UB 占用尽量小# - 预留足够的 UB 空间给下一个 tile 的数据预取# 验证读 ops-transformer 的源码看它是怎么主动配合 GE 和 Runtime 的importsubprocess# 查看 tiling 参数的定义resultsubprocess.run([grep,-r,tiling,ops-transformer/src/ops_transformer/flash_attention/],capture_outputTrue,textTrue)print(tiling 参数定义:)print(result.stdout)# 查看 causal mask 的实现resultsubprocess.run([grep,-r,causal,ops-transformer/src/ops_transformer/flash_attention/],capture_outputTrue,textTrue)print(causal mask 实现:)print(result.stdout)# 查看 UB 使用的优化resultsubprocess.run([grep,-r,UB,ops-transformer/src/ops_transformer/flash_attention/],capture_outputTrue,textTrue)print(UB 使用优化:)print(result.stdout)误解ops-transformer 的算子只要实现功能就行GE 和 Runtime 会自动优化。纠正ops-transformer 的算子设计必须主动配合 GE 和 Runtime——暴露 tiling 参数、支持 causal mask、优化 UB 使用。相关仓库https://atomgit.com/cann/ops-transformerhttps://atomgit.com/cann/gehttps://atomgit.com/cann/runtime

相关文章:

GE 和 Runtime:不是上下游,是协同决策

你以为 GE 做完融合决策,交给 Runtime 执行就行了?其实它们是一个协同系统——GE 决定"融什么",Runtime 决定"怎么跑",但 GE 的融合决策必须考虑 Runtime 的调度约束,Runtime 的调度策略也必须参考…...

【芯片测试】:6. 向量、Sequencer 指令与高速串行 IO

Pattern 详解:向量、Sequencer 指令与高速串行 IO系列: Advantest V93000 SmarTest 8 核心概念解析|第 6 篇(共 8 篇) 适合读者: 需要理解数字测试激励数据结构的工程师前言 Pattern(模式&#…...

ICE-T框架:破解机器学习教学黑箱,培养计算与解释性思维

1. 项目概述:为什么我们需要一个全新的机器学习教学框架?在过去的几年里,我亲眼见证了“人工智能”和“机器学习”从一个高深莫测的学术词汇,迅速演变为中小学乃至大学课堂上的热门话题。作为一名长期关注教育技术落地的从业者&am…...

AutoIRT:融合AutoML与IRT,实现自适应测试题目参数的自动化高效校准

1. 项目概述与核心价值在语言能力测评、职业资格认证乃至教育领域的个性化学习路径规划中,计算机化自适应测试(CAT)正扮演着越来越核心的角色。它的魅力在于“千人千面”——系统能根据考生上一题的作答表现,实时调整下一题的难度…...

量子机器学习数据集构建:从核心要素到工程实践

1. 量子机器学习数据集构建:从分类到实践的核心思路量子机器学习(QML)这个领域,现在就像十年前的深度学习,概念很热,但真正能上手、能复现、能出成果的“基础设施”还非常稀缺。我接触过不少从经典机器学习…...

经典通信赋能分布式量子机器学习:NISQ时代的实用化路径探索

1. 项目概述:当量子机器学习遇上分布式架构量子机器学习(QML)这几年火得不行,它背后的逻辑其实挺吸引人的:利用量子态的叠加和纠缠特性,把数据映射到指数级庞大的希尔伯特空间里进行处理。理论上&#xff0…...

机器学习增强无导数优化:Sobolev学习与代理模型实践

1. 项目概述与核心思路在工程优化、材料设计乃至金融建模中,我们常常会遇到一类“黑箱”问题:你有一个复杂的仿真程序或物理实验,输入一组参数,它能吐出一个结果(比如性能指标、成本或误差),但你…...

AI Agent记忆方案大比拼:RAG、Mem0、Zep、Letta怎么选?告别选型迷茫!

本文综述了多种AI Agent记忆方案,包括RAG、Mem0、Zep、Letta、LangMem等,并分析了它们各自的适用场景和优缺点。文章指出,选择合适的记忆方案需要根据具体应用场景来确定,如RAG适合知识库检索,Mem0适合跨会话个性化&am…...

自动去偏机器学习:正交损失与Riesz表示定理驱动的高效统计推断

1. 项目概述与核心价值在统计机器学习和因果推断的实际研究中,我们经常面临一个经典困境:为了捕捉数据中复杂的非线性关系,我们不得不使用像梯度提升树、深度神经网络这类灵活且强大的机器学习模型来拟合干扰参数(例如倾向得分、条…...

ml_edm:基于成本敏感的时间序列早期分类Python工具包详解

1. 项目概述在工业监控、医疗诊断和金融风控这些领域,我们常常面对一个共同的困境:数据是随着时间一点点“流”进来的,但决策却不能等到所有数据都齐备了再做。比如,一台设备传感器传回的振动信号刚开始出现异常,你是立…...

为什么你的MJ图总像“老胶片过曝”?揭秘ISO模拟算法缺陷,5种降颗粒参数组合实测对比(含LUT映射表)

更多请点击: https://kaifayun.com 第一章:为什么你的MJ图总像“老胶片过曝”?揭秘ISO模拟算法缺陷,5种降颗粒参数组合实测对比(含LUT映射表) MidJourney 默认的图像生成流程中隐式嵌入了一套基于扩散步长…...

Agent 状态持久化:基于 Redis 的多轮交互上下文存储方案

一、 引言 (Introduction) 1.1 钩子:从 Siri 答非所问到 AI Agent 的「失忆症噩梦」 你有没有遇到过这种令人血压升高的场景: 早上起床,对着家里的智能音箱(假设它搭载了最新的「多轮对话」AI Agent)说:“嘿…...

开源机器学习项目贡献者角色演化与社区健康度分析

1. 开源机器学习项目中的贡献者角色:一个动态的生态系统在开源软件的世界里,尤其是像TensorFlow、PyTorch这样的机器学习(ML)库,项目的生命力并非仅仅源于几行精妙的代码,而是根植于一个由多元角色构成的、…...

基于共享潜在空间的贝叶斯优化:解决异构算法超参数联合选择难题

1. 项目概述与核心挑战在机器学习项目的落地过程中,我们常常面临一个看似简单实则复杂的选择:面对一个具体的数据集,究竟该用哪个算法,以及这个算法的最佳超参数组合是什么?这个问题,在学术上被称为“联合算…...

Leslie矩阵建模:从种群动力学到捕食竞争与机器学习拟合

1. 项目概述:从矩阵视角看种群兴衰在生态学和种群生物学里,我们总想预测未来:这片森林里的鹿群十年后会怎样?引入狼群后,整个系统会稳定还是崩溃?传统微分方程模型(比如经典的Lotka-Volterra方程…...

B物理反常的全局拟合:有效场论与机器学习解析新物理信号

1. 项目概述:当B介子衰变“不听话”时,我们如何用数学语言寻找新物理?在粒子物理的精密前沿,标准模型(Standard Model, SM)一直是我们理解微观世界最成功的理论框架。然而,物理学家们从未停止过…...

Android加固反调试绕过:Frida动态劫持pthread_create实战

1. 这不是“破解”,而是理解Android加固对抗中的一次典型动态插桩实践你打开B站App,刚点开首页,进程就闪退了;或者在Frida脚本里下断点到pthread_create,App直接静默终止——这不是崩溃日志里常见的NullPointerExcepti…...

从DALL·E 3到Midjourney 6:对比度渲染引擎差异白皮书(附17组跨模型PSNR/SSIM实测数据)

更多请点击: https://codechina.net 第一章:从DALLE 3到Midjourney 6:对比度渲染引擎差异白皮书(附17组跨模型PSNR/SSIM实测数据) 现代文本到图像生成模型在对比度建模策略上存在根本性分歧:DALLE 3 采用基…...

Spark Transformer:稀疏激活优化与计算效率提升

1. Spark Transformer 核心设计解析Transformer架构在自然语言处理领域展现出卓越性能,但其计算密集型特性也带来了显著的资源消耗。传统Transformer模型的前馈网络(FFN)和注意力机制采用全连接计算模式,导致FLOPs(浮点运算次数)居高不下。Spark Transfo…...

从《原神》到《黑神话》都在用的AI Agent中间件:轻量级推理框架v0.9.3内部测试版首次泄露(仅限前500名开发者)

更多请点击: https://codechina.net 第一章:AI Agent游戏行业应用全景图 AI Agent 正在重塑游戏开发、运营与玩家体验的全生命周期。从智能NPC行为建模到实时动态世界生成,从自动化测试脚本到个性化内容推荐,AI Agent已不再局限于…...

车企AI Agent团队组建白皮书(附2024头部厂商组织架构图+7个核心岗位能力雷达图)

更多请点击: https://intelliparadigm.com 第一章:车企AI Agent团队组建的战略意义与行业演进 在智能网联汽车加速落地的背景下,AI Agent已从实验室概念演进为车载系统的核心决策单元——它不再仅执行预设指令,而是具备环境感知、…...

KNO标度律与粒子多重数:从QCD喷注结构到夸克-胶子鉴别的理论推导

1. 项目概述:从粒子计数到喷注身份鉴别 在粒子物理实验里,我们经常面对一个看似简单却极其棘手的问题:眼前这个由上百个粒子组成的“喷注”(Jet),最初到底是从一个夸克还是从一个胶子产生的?这…...

别急着重启!深入理解Ubuntu 22.04的needrestart:守护进程、库文件与系统更新背后的原理

别急着重启!深入理解Ubuntu 22.04的needrestart:守护进程、库文件与系统更新背后的原理在Ubuntu 22.04 LTS的系统维护中,许多管理员都曾遇到过这样的场景:执行apt upgrade后,终端突然弹出"Daemons using outdated…...

新手避坑指南:在Ubuntu 22.04上从零搭建Plexe-SUMO自动驾驶仿真环境

新手避坑指南:在Ubuntu 22.04上从零搭建Plexe-SUMO自动驾驶仿真环境自动驾驶仿真技术已成为学术界和工业界验证算法有效性的重要手段。对于刚接触该领域的研究者而言,环境搭建往往是第一个"拦路虎"。本文将手把手带你完成Plexe-SUMO环境的完整…...

如何用OneMore插件让OneNote成为你的高效笔记神器

如何用OneMore插件让OneNote成为你的高效笔记神器 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 你是否曾经在使用OneNote时感到功能不够用?想要更强大的…...

Windows 11 + Ubuntu 20.04双系统避坑:搞定WiFi图标消失的完整保姆级流程

Windows 11与Ubuntu 20.04双系统WiFi修复全指南1. 双系统网络问题的根源探究刚完成Windows 11和Ubuntu 20.04双系统安装的用户,经常会遇到一个令人头疼的问题——Ubuntu系统下WiFi图标神秘消失。这不是个例,而是双系统环境下相当普遍的现象。要彻底解决这…...

Decompyle++:Python字节码源码恢复实战指南

1. 这不是“反编译”,是字节码层面的源码重建——为什么Decompyle成了Python逆向事实标准你有没有遇到过这样的情况:接手一个只有.pyc文件的遗留项目,没有源码,连__pycache__目录都被人删干净了;或者审计第三方SDK时&a…...

Unity深度调试框架UniHacker:突破IL2CPP可观测性断层

1. 这不是“破解工具”,而是一套面向Unity开发者的深度调试与逆向协作框架“UniHacker”这个名字在社区里常被误读为某种一键解锁Asset Store资源或绕过License校验的黑盒程序——这恰恰是我们今天要彻底厘清的第一件事。它既不触碰Unity官方EULA中关于授权使用的核…...

深度学习框架与编程语言选型指南:从TensorFlow、PyTorch到Java生态的实战解析

1. 项目概述在人工智能浪潮席卷全球的今天,机器学习与深度学习已不再是实验室里的概念,而是驱动产业变革、解决实际问题的核心引擎。无论是识别网络中的异常流量以抵御攻击,还是从海量数字证据中快速定位关键线索,这些技术都展现出…...

3D高斯渲染技术原理与Lumina架构优化实践

1. 3D高斯渲染技术原理与挑战3D高斯渲染(3D Gaussian Splatting)作为神经渲染领域的前沿技术,其核心思想是将3D场景表示为一系列带有属性的高斯分布集合。每个高斯点包含位置(μ)、协方差矩阵(Σ&#xff0…...