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

OpenPPL之二,优化器里面的算子融合

算子融合的执行时机完整的时间线模型加载阶段一次 运行时阶段多次推理 ↓ ↓ ┌─────────────────────┐ ┌─────────────┐ │ 1. 解析ONNX模型 │ │ 输入数据 │ │ 2. 构建IR Graph │ │ ↓ │ │ 3. 图优化融合 │ ←── │ 执行融合算子 │ │ 4. 图分割多硬件 │ │ ↓ │ │ 5. 编译成执行计划 │ │ 输出结果 │ └─────────────────────┘ └─────────────┘关键点融合发生在模型加载时只执行一次运行时直接执行融合后的算子不再重新融合因此融合的误差是固定的不会随输入变化OpenPPL 的算子融合功能主要通过以下优化器实现文件功能说明act_reorder_for_conv_optimizer.cc激活函数重排序优化。将卷积后的激活函数如ReLU提前或调整顺序以便与卷积核融合或减少中间内存开销constant_node_optimizer.cc常量折叠。将输入全为常量的节点在编译时预计算替换为常量节点engine_graph_partitioner.cc引擎图分割器。根据硬件后端如x86、CUDA将计算图分割成多个子图每个子图由对应引擎执行fuse_bn_optimizer.ccConv BatchNorm 融合。将 BN 的参数融合到 Conv 的权重和偏置中删除 BN 节点fuse_constant_optimizer.ccConv Add/Mul 融合。将 Add 或 Mul 的常量值融合到 Conv 的 bias 中fuse_parallel_node_optimizer.cc并行节点融合。融合可以并行执行的无依赖节点fuse_shape_optimizer.ccShape 相关算子融合。将 Shape → Gather → Slice → Concat → Add/Div 等多个算子融合成一个PPL.ShapeOperation自定义算子identity_node_optimizer.ccIdentity 节点删除。Identity 算子恒等映射在推理时无实际作用直接删除并重新连接输入输出skip_dropout_optimizer.ccDropout 删除。推理时 Dropout 无效直接删除这9个优化器可以分为几类优化器实现方式说明fuse_bn_optimizer.cc只改参数将BN参数融合到Conv的weight/bias中Conv节点类型不变fuse_constant_optimizer.cc只改参数将Add/Mul的常量融合到Conv的bias中Conv节点类型不变constant_node_optimizer.cc只改参数常量折叠预计算结果替换原节点不产生新算子类型skip_dropout_optimizer.cc只改参数删除Dropout节点不产生新算子identity_node_optimizer.cc只改参数删除Identity节点不产生新算子act_reorder_for_conv_optimizer.cc只改参数调整激活函数顺序不产生新算子engine_graph_partitioner.cc非融合图分割不是算子融合fuse_parallel_node_optimizer.cc非融合并行节点融合实际是调度优化fuse_shape_optimizer.cc生成新算子将Shape→Gather→Slice→Concat→Add/Div等多个算子融合成一个新的 自定义算子在fuse_shape_optimizer.cc的Optimize里node-SetType(ir::Node::Type{pmx, Shape, 1});实际看到的是pmx.Shape算子一、卷积相关融合最核心1. Conv BN 融合实现位置FuseBNOptimizer融合方式将BatchNorm的参数融合到Conv的权重和偏置中官方记录2021年12月已支持batchnormrelu融合2. Conv Add/Mul 融合实现位置FuseConstantOptimizer融合方式将Conv后面的Add或Mul常量节点融合到Conv的bias中3. Conv ReLU/ReLU6 融合官方记录x86后端所有卷积算法支持 ReLU/ReLU6 融合融合方式卷积计算后直接执行激活函数避免中间结果回写内存4. Conv DepthwiseConv 融合官方记录x86后端支持ConvDepthwiseConv融合使用AVX512/FMA指令集优化5. Conv Concat 融合修复记录2022年12月修复了ConvConcat融合时channel不能整除的计算问题二、Shape相关融合动态模型专用PPL.ShapeOperation 自定义算子OpenPPL设计了专门的自定义算子PPL.ShapeOperation来处理Shape相关计算支持融合以下算子 融合类型具体算子提取类Gather, Slice拼接类Concat数值计算类Add, Div, Mul, Sub融合示例Shufflenet网络融合前Shape → Gather → Div → Concat 等多个算子融合后单个PPL.ShapeOperation算子维护系数矩阵表示完整计算逻辑效果融合共计20个Shape相关算子三、其他算子融合1. Identity 算子融合官方记录支持 identity 算子的融合2. QuickGelu 算子融合官方记录Onnxruntime后端已支持 QuickGelu 算子融合3. Add/Sub/Mul/Div 就地计算Inplace官方记录x86后端支持 Add/Sub/Mul/Div 就地计算减少内存分配四、各后端支持汇总融合类型x86CUDA说明Conv BN✅✅CUDA支持batchnormrelu融合Conv ReLU✅✅x86所有卷积算法支持Conv Add✅✅FuseConstantOptimizer实现Conv DepthwiseConv✅❌AVX512/FMA指令集优化Shape融合✅✅PPL.ShapeOperation自定义算子Identity融合✅✅2022年12月加入QuickGelu❌✅Onnxruntime后端支持算子融合在大多数情况下确实只是修改节点信息而不生成新算子类型但在某些情况下也会生成全新的算子类型。两种融合模式模式1修改节点信息最常见这种模式不生成新算子类型只是修改现有节点的属性或删除冗余节点。典型例子Conv BN 融合cpp// 融合前 Conv节点weightW, biasb BN节点gammaγ, betaβ, meanμ, varσ² // 融合后 Conv节点weightW, biasb ← 只修改了属性 BN节点被删除发生了什么没有创建新节点类型Conv节点的类型仍然是Conv只是更新了它的权重和偏置删除了BN节点模式2生成新算子类型少见但有这种模式会创建全新的节点类型通常用于融合模式无法用现有算子表达后端有专门优化的融合Kernel典型例子Conv Add Relu 融合有专门优化时// 融合前 Conv → Add → Relu // 融合后如果有专门优化的Kernel FusedConvAddRelu ← 新类型为什么需要新类型Conv Add Relu 融合后数据流从Conv→Add→Relu变成了一个端到端的计算如果后端有专门的手工汇编优化版本如CUDA的cudnnConvolutionBiasActivationForward就需要一个新的算子类型来调用它为什么大多数融合不生成新算子1. 数学等价性很多融合如ConvBN可以完全用修改参数来表达不需要改变计算结构。2. Kernel复用修改属性后现有的Conv Kernel仍然可以正确执行只是参数不同。3. 避免组合爆炸如果为每种组合都创建新算子ConvBN ConvBNRelu ConvAdd ConvAddRelu ConvBNAdd ConvBNAddRelu ... 组合数 2^n 爆炸增长4. 保持图结构简单算子类型越少图越简单后续优化和调试越容易。什么时候需要生成新算子场景原因例子后端有专门优化利用硬件特性如CUDA的Fused ConvConvReluFused数据布局改变融合后需要特殊的内存排布NC4HW4Conv无法用原算子表达融合后的计算模式与原算子不同DepthwiseConvBN性能关键路径为特定融合模式手写汇编优化ConvAddReluInt8

相关文章:

OpenPPL之二,优化器里面的算子融合

算子融合的执行时机 完整的时间线 模型加载阶段(一次) 运行时阶段(多次推理)↓ ↓ ┌─────────────────────┐ ┌─────────────┐ │ 1. 解析ON…...

OpenClaw安全指南:使用GLM-4.7-Flash时的权限管理

OpenClaw安全指南:使用GLM-4.7-Flash时的权限管理 1. 为什么需要特别关注OpenClaw的安全配置 当我第一次在本地部署OpenClaw并接入GLM-4.7-Flash模型时,最让我震惊的是这个框架赋予AI的权限范围。它不仅能读取我的文件,还能执行系统命令、发…...

RBD_Timer:嵌入式轻量级多定时器时间轮调度框架

1. RBD_Timer 库深度解析:面向嵌入式实时系统的轻量级多定时器管理框架1.1 问题根源:Arduino 原生delay()与中断阻塞对实时性的破坏在 Arduino 生态中,delay()函数被广泛用于实现时间等待逻辑。然而其底层实现本质是忙等待(busy-w…...

DFS经典例题(八皇后,数独)

1.1P1036 [NOIP 2002 普及组] 选数 解题思路 这里是组合思想与元素的排序无关&#xff0c;列举出所有符合的组合再判断是否符合素数 代码 #include<iostream> using namespace std; const int N 21; int a[N]; int path; int ret; int n, m;bool is(int path) {if (pa…...

别再只盯着IoU了!用Python手把手教你计算语义分割的95% Hausdorff距离(附完整代码)

超越IoU&#xff1a;用Python实战95% Hausdorff距离的医学影像分割评估 当我们在医院看到CT扫描图像上肿瘤边缘被红色轮廓线精准勾勒时&#xff0c;很少有人会思考这背后的算法是如何评估自己分割结果的准确性的。传统指标如IoU&#xff08;交并比&#xff09;和Dice系数固然流…...

为什么你的Flask农业API总在灌溉高峰期崩?Python高并发部署的4层熔断架构设计(实测QPS提升6.8倍)

第一章&#xff1a;为什么你的Flask农业API总在灌溉高峰期崩&#xff1f;Python高并发部署的4层熔断架构设计&#xff08;实测QPS提升6.8倍&#xff09; 当全省智能灌溉系统在每日清晨5:00–7:00集中调度水阀、上传土壤墒情数据时&#xff0c;基于默认配置的Flask API常出现进程…...

JiYuTrainer:极域电子教室多任务学习解决方案 - 提升教学环境下的自主操作能力

JiYuTrainer&#xff1a;极域电子教室多任务学习解决方案 - 提升教学环境下的自主操作能力 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 在现代数字化教学环境中&#xff0c;极…...

终极指南:使用Legacy-iOS-Kit轻松降级、越狱和修复旧款iOS设备

终极指南&#xff1a;使用Legacy-iOS-Kit轻松降级、越狱和修复旧款iOS设备 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...

一文搞懂训练大模型的数据怎么准备!

谈到大模型&#xff0c;很多人第一反应都是模型参数大、算力强&#xff0c;但其实数据才是大模型真正的底座。没有足够大、足够干净的数据&#xff0c;再先进的模型也发挥不出威力。今天就从数据层面&#xff0c;把大模型训练的几个关键环节梳理清楚。 数据采集与清洗 大模型训…...

项目管理工具怎么选?8款主流产品测评与选型建议

项目管理工具怎么选&#xff1f;真正需要比较的&#xff0c;不只是功能多少&#xff0c;而是它是否适合团队的协作方式、项目复杂度和管理阶段。本文围绕场景匹配、流程灵活性、信息沉淀、管理视图和落地成本&#xff0c;对8款主流项目管理工具做一轮顾问式测评。引言很多企业在…...

零基础手写大模型

从零搭建大模型&#xff1a;零基础学习实现职业经济跃迁指南 引言 在人工智能重塑全球产业格局的今天&#xff0c;“大模型”已不再仅仅是科技巨头的专利&#xff0c;而是成为了数字经济时代新的“电力”与“石油”。对于广大职场人士、创业者及寻求转型的个体而言&#xff0…...

XL6008直流升压电路设计与应用指南

基于XL6008的直流升压电路设计指南 1. 项目概述 1.1 应用背景 便携式电子设备对电源系统提出了特殊要求&#xff1a;在保持轻量化的同时&#xff0c;需要提供稳定的工作电压。由于单节锂电池的标称电压为3.7V&#xff08;满电4.2V&#xff09;&#xff0c;而许多电子元件需要…...

vLLM实战:手把手教你用LLMEngine构建高效推理服务(附代码解析)

vLLM实战&#xff1a;从零构建高性能大模型推理服务的工程指南 当大语言模型从实验室走向生产环境时&#xff0c;如何实现高吞吐、低延迟的推理服务成为工程化落地的关键挑战。vLLM作为当前最受关注的开源推理框架之一&#xff0c;其核心组件LLMEngine的设计理念值得每一位AI工…...

Python AOT编译卡在wasm-ld阶段?揭秘2026年新引入的WASI-SDK v22.0工具链冲突——附3行patch脚本+验证清单

第一章&#xff1a;Python AOT编译卡在wasm-ld阶段&#xff1f;揭秘2026年新引入的WASI-SDK v22.0工具链冲突——附3行patch脚本验证清单自2026年WASI-SDK v22.0发布以来&#xff0c;Python官方AOT编译流程&#xff08;基于pyodide-build aot&#xff09;在链接阶段频繁阻塞于w…...

OpenClaw任务监控:GLM-4.7-Flash执行状态可视化方案

OpenClaw任务监控&#xff1a;GLM-4.7-Flash执行状态可视化方案 1. 为什么需要任务监控&#xff1f; 去年冬天的一个深夜&#xff0c;我被手机警报惊醒——OpenClaw正在执行的周报生成任务已经连续失败了三次。打开电脑检查日志时才发现&#xff0c;原来是本地部署的GLM-4.7-…...

Cartographer实战:如何用Velodyne 32E激光雷达跑通GraphSLAM(附避坑指南)

Cartographer实战&#xff1a;Velodyne 32E激光雷达的GraphSLAM全流程解析与性能调优 当Velodyne 32E激光雷达遇上Cartographer的GraphSLAM算法&#xff0c;如何在复杂环境中实现厘米级建图精度&#xff1f;本文将拆解从硬件配置到算法调优的完整落地流程&#xff0c;分享我在大…...

STS4x温度传感器I²C驱动库深度解析与跨平台移植

1. STS4x温湿度传感器驱动库技术解析1.1 项目定位与工程价值Sensirion STS4x系列是瑞士Sensirion公司推出的高精度数字温度传感器&#xff0c;采用CMOSens技术&#xff0c;具备0.1C典型精度、0.01C分辨率、低功耗&#xff08;典型待机电流仅0.5μA&#xff09;及快速响应&#…...

PDF Arranger:开源PDF管理的终极解决方案,3分钟掌握高效文档处理技巧

PDF Arranger&#xff1a;开源PDF管理的终极解决方案&#xff0c;3分钟掌握高效文档处理技巧 【免费下载链接】pdfarranger Small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an intera…...

3分钟搞定!LyricsX让你的macOS音乐播放器拥有完美歌词体验

3分钟搞定&#xff01;LyricsX让你的macOS音乐播放器拥有完美歌词体验 【免费下载链接】LyricsX &#x1f3b6; Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX 还在为macOS上的音乐播放器找不到合适的歌词而烦恼吗&#xff1f;L…...

Teensy41嵌入式FTP服务器库:轻量协议栈与多网络适配

1. 项目概述FTP_Server_Teensy41 是一款专为 Teensy 4.x 系列微控制器&#xff08;特别是 Teensy 4.0 和 Teensy 4.1&#xff09;深度定制的嵌入式 FTP 服务器库。它并非从零构建&#xff0c;而是基于 Jean-Michel Gallego 开发的成熟开源项目 Arduino-Ftp-Server 进行了系统性…...

【独家逆向分析】:2026年Python官方AOT预编译包(.so/.dylib/.dll)签名验证失败报错的底层机制——绕过签名强制校验的合规临时方案

第一章&#xff1a;Python原生AOT编译方案2026报错解决方法总览Python原生AOT&#xff08;Ahead-of-Time&#xff09;编译在2026年生态中已进入稳定试用阶段&#xff0c;但开发者常遭遇如 ModuleNotFoundError: No module named _aot_runtime、Unsupported AST node: Match 或 …...

效率革命:设计师必备的Sketch批量命名神器RenameIt完全指南

效率革命&#xff1a;设计师必备的Sketch批量命名神器RenameIt完全指南 【免费下载链接】RenameIt Keep your Sketch files organized, batch rename layers and artboards. 项目地址: https://gitcode.com/gh_mirrors/re/RenameIt 在现代UI/UX设计流程中&#xff0c;保…...

【操作系统】第三章 内存管理(一)

第三章 内存管理 3.1 内存管理概念 3.1.1 内存管理的基本原理和要求 内存管理的主要功能&#xff1a; 内存空间的分配与回收。[连续分配管理方式](#3.1.2 连续分配管理方式)和非连续分配管理方式&#xff08;分页、分段&#xff09;地址转换&#xff1a;实现逻辑地址到物理…...

基于Spring AI的MCP服务开发实战指南

1. Spring AI与MCP服务初探 第一次接触Spring AI框架时&#xff0c;我就被它简洁优雅的API设计所吸引。作为Spring生态中专门为AI应用开发提供的工具集&#xff0c;它让Java开发者能够像开发普通Web应用一样轻松构建AI服务。而MCP&#xff08;Model Calling Protocol&#xff0…...

UE4.62生成sln时失败:Missing .../DotNET/UnrealBuildTool/UnrealBuildTool/UnrealBuildTool.exe

问题1&#xff1a; vs编译报错&#xff0c;以为是热加载&#xff0c;把项目的几个文件删了&#xff0c;想右键点击Generate Visual Studio Project Files重构&#xff0c;报错。 解决方法&#xff1a;: 是看m0_62179790这个博主解决的。 只要把下面这行东西添加到你自己的UE…...

SAP EWM开发实战:手把手教你用ABAP OO类 /SCWM/CL_SP_PRD_INB 创建内向交货单

SAP EWM开发实战&#xff1a;基于ABAP OO类实现内向交货单自动化创建 1. 理解内向交货单创建的技术背景 在SAP扩展仓库管理(EWM)系统中&#xff0c;内向交货单(Inbound Delivery)是管理入库流程的核心凭证。与传统的SAP ERP系统不同&#xff0c;EWM模块在设计上采用了更加灵活的…...

OpenClaw自动化测试:Qwen3-32B批量执行LeetCode题目

OpenClaw自动化测试&#xff1a;Qwen3-32B批量执行LeetCode题目 1. 为什么需要自动化编程能力测试 作为一名长期关注AI编程辅助工具的技术博主&#xff0c;我一直在寻找能够客观评估大模型编程能力的方法。传统的单次对话测试往往带有偶然性&#xff0c;无法系统性地反映模型…...

二分查找/二分答案

0.前言二分算法&#xff08;Binary Search&#xff09;&#xff0c;也叫折半查找&#xff0c;是一种在有序数据集合中高效查找目标值的算法。它通过不断将查找范围缩小一半&#xff0c;快速定位目标&#xff0c;时间复杂度为 O(logn)&#xff0c;远优于线性查找的 O(n)。1.原理…...

基于springboot的志愿者招募管理系统

目录系统架构设计数据库设计核心功能实现报名与审核流程统计与报表部署方案项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统架构设计 采用SpringBoot作为后端框架&#xff0c;搭配MyBatis或JPA实现数据持久化。前端可选择T…...

Arduino轻量级哈希表UnorderedMap实战指南

1. 项目概述UnorderedMap是一款专为 Arduino 平台设计的轻量级哈希表&#xff08;Hash Table&#xff09;实现&#xff0c;其核心目标是在资源极度受限的微控制器环境中提供高效、可靠、内存可控的键值对&#xff08;Key-Value Pair&#xff09;存储能力。它并非 C STLstd::uno…...