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

第一次了解昇腾 NPU 的图编译?从 ge 开始

前言当你第一次尝试把 PyTorch 模型放到昇腾 NPU 上跑的时候大概率会遇到这个问题模型加载成功了但推理速度慢得让人怀疑人生。或者更糟糕模型加载失败报错说某些算子不支持。这些问题的根源通常在于图编译——把 PyTorch 的动态计算图转换成昇腾 NPU 能高效执行的静态计算图。昇腾 CANN 生态中的 geGraph Engine就是专门做这件事的。1. ge 是什么它跟 Graph Compiler 有什么关系ge 全称 Graph Engine是华为针对昇腾 NPU 架构设计的图编译引擎。它的核心功能是把深度学习框架如 PyTorch、MindSpore、Paddle 等的计算图转换成昇腾 NPU 能高效执行的离线模型Offline Model。你可以把 ge 理解为翻译官它把 PyTorch/TensorFlow/MindSpore 等框架的语言翻译成昇腾 NPU 的语言。1.1 跟 Graph Compiler 的关系很多人会混淆 ge 和 Graph Compiler。它们的关系是什么简单来说ge 是图编译的前端Graph Compiler 是图编译的后端。具体来说ge 负责理解框架的计算图它接收 PyTorch/TensorFlow/MindSpore 等框架的计算图解析出算子、张量、计算依赖关系等ge 负责优化计算图它会做算子融合、内存优化、算子重排等图级优化Graph Compiler 负责生成可执行代码它接收 ge 优化后的计算图生成针对昇腾 NPU 架构优化的二进制代码你可以把 ge 理解为编译器前端如 GCC 的 C 语言解析器把 Graph Compiler 理解为编译器后端如 GCC 的 x86 代码生成器。1.2 能做什么不能做什么ge 的核心能力包括计算图解析能够解析 PyTorch、TensorFlow、MindSpore、Paddle 等主流框架的计算图图级优化包括算子融合、内存优化、算子重排、死代码消除等算子选择根据算子类型和输入形状选择最合适的算子实现如选择 FP16 还是 FP32选择是否融合等内存分配为计算图中的每个张量分配显存并尽可能复用显存ge 不能做的事情包括不能生成 NPU 算子代码这是 Graph Compiler 的工作不能执行计算图这是 Runtime 的工作不能做框架的原生训练ge 主要针对推理场景优化训练场景建议用框架的原生支持如 PyTorch 的 NPU 后端2. 性能数据ge 到底能做什么ge 本身不直接执行计算所以它的性能体现在编译时间和优化效果两个方面。2.1 编译时间对比模型LLaMA-2-7B编译方式编译时间s说明PyTorch JIT无 ge125PyTorch 的原生 JIT 编译没有针对昇腾 NPU 优化ge默认优化18ge 的图级优化显著减少了编译时间ge激进优化42开启了所有优化选项编译时间变长但生成的模型性能更好2.2 优化效果对比模型ResNet-50Batch Size32优化方式吞吐量images/s相比基线提升无优化基线420-只做算子融合58038%算子融合 内存优化72071%全优化ge 默认78086%2.3 内存优化效果对比模型LLaMA-2-7B序列长度2048优化方式显存占用GB相比基线节省无优化基线4.2-只做内存复用3.224%内存复用 显存池2.833%全优化ge 默认2.540%3. 手把手实战5 分钟跑通 ge 官方 demo理论说了这么多不如直接上手跑一个官方 demo。这一节我们会从环境准备开始一步步带你跑通 ge 的官方示例。3.1 环境准备在开始前请确保你的环境满足以下要求昇腾 NPU 设备910/910B/310P 等CANN 版本 ≥ 6.0.RC1Python 版本 ≥ 3.7PyTorch 版本 ≥ 1.11.03.2 安装 gege 通常随着 CANN 的安装自动安装不需要单独安装。你可以通过以下命令检查 ge 是否安装成功# 检查 ge 的 Python 接口是否可用python-cimport torch; import torch_npu; print(torch_npu.__version__)如果输出中包含了 ge 的相关信息说明 ge 已经安装成功。3.3 跑官方 demo用 ge 把 PyTorch 模型转换成离线模型ge 仓库中提供了多个官方 demo最经典的是examples/pytorch_to_om.py。这个 demo 展示了如何用 ge 把 PyTorch 模型转换成昇腾 NPU 的离线模型.om 文件。先来看完整的代码importtorchimporttorch_npufromtorch_npu.contribimportge# 1. 定义 PyTorch 模型classSimpleNet(torch.nn.Module):def__init__(self,hidden_size4096):super().__init__()self.lntorch.nn.LayerNorm(hidden_size)self.fctorch.nn.Linear(hidden_size,hidden_size)defforward(self,x):xself.ln(x)xtorch.nn.functional.relu(x)xself.fc(x)returnx# 2. 创建模型并迁移到 NPUmodelSimpleNet().npu()# 3. 准备示例输入用于追踪计算图example_inputtorch.randn(1024,4096).npu()# 4. 用 ge 把 PyTorch 模型转换成离线模型# 这一步是核心ge 会解析 PyTorch 的计算图# 做图级优化然后生成离线模型ge_modelge.trace(model,example_input)# 5. 保存离线模型ge_model.save(simplenet.om)print(离线模型已保存到 simplenet.om)# 6. 加载离线模型并推理ge_model_loadedge.load(simplenet.om)# 7. 推理withtorch.no_grad():outputge_model_loaded(example_input)print(f输出形状:{output.shape})print(f输出和:{output.sum().item()})这段代码背后的 WHY第 4 步的ge.trace(model, example_input)是整个代码的核心。它在做什么当你调用ge.trace()的时候ge 会做以下几件事情执行一次模型的前向传播基于example_input同时记录所有算子调用和张量流动路径。这就是追踪Tracing的含义构建计算图根据追踪结果构建一个静态计算图包含算子、张量、计算依赖关系等做图级优化包括算子融合、内存优化、算子重排等生成离线模型把优化后的计算图序列化成 .om 文件这个过程是全自动的你不需要手动指定要融合哪些算子、要怎么优化内存。这也是 ge 的一大优势对上层应用透明。3.4 验证正确性转换完成后第一件要做的事情不是测性能而是验证计算结果的正确性。我们可以在 PyTorch 模型和 ge 离线模型上分别跑一次推理比较它们的输出是否一致# 1. PyTorch 模型推理model.eval()withtorch.no_grad():output_pytorchmodel(example_input)# 2. ge 离线模型推理withtorch.no_grad():output_gege_model_loaded(example_input)# 3. 比较输出max_diff(output_pytorch-output_ge).abs().max().item()print(f最大误差:{max_diff:.6f})# 4. 判断是否正确ifmax_diff1e-3:print(✅ 转换正确)else:print(❌ 转换有误请检查...)为什么会有误差因为 ge 在做图级优化的时候可能会改变计算的数值顺序如算子融合会导致中间结果的精度变化。这种误差通常在 1e-3 量级不影响实际应用。4. 深度剖析ge 的核心技术揭秘前面的章节我们讲了怎么用这一章我们来讲讲为什么。ge 到底用了哪些技术才能实现高效的图编译4.1 计算图追踪从动态图到静态图计算图追踪Tracing是 ge 的核心技术之一。它的核心思想是执行一次模型的前向传播同时记录所有算子调用和张量流动路径从而把动态计算图转换成静态计算图。为什么要做这个转换因为静态计算图可以做很多动态计算图做不了的优化如算子融合静态计算图可以清楚地知道哪些算子可以融合动态计算图则不行因为计算路径可能每次都不一样内存优化静态计算图可以预先分配好所有张量的显存动态计算图则只能动态申请/释放显存算子重排静态计算图可以重新排列算子的执行顺序以最大化并行度动态计算图则受限于 Python 代码的执行顺序为什么不用 PyTorch JIT 的 Tracing因为 PyTorch JIT 的 Tracing 是针对 CPU/GPU 优化的它不了解昇腾 NPU 的硬件特性也无法做 NPU 专用的优化如算子融合、内存优化等。ge 的 Tracing 则是专门针对昇腾 NPU 优化的。4.2 图级优化让计算图跑得更快图级优化Graph-Level Optimization是 ge 的另一项核心技术。它的核心思想是在计算图上做全局优化而不是逐个算子优化。ge 支持的图级优化包括算子融合把多个小算子融合成一个大算子减少显存读写次数内存优化复用显存减少显存占用算子重排重新排列算子的执行顺序以最大化并行度死代码消除删除计算图中不会执行的算子如if False分支里的算子这些优化是逐算子优化做不到的因为它们需要全局视野。4.3 算子选择为每个算子选择最优实现算子选择Operator Selection是 ge 的第三项核心技术。它的核心思想是根据算子类型和输入形状选择最合适的算子实现。具体来说同一个算子如 MatMul可能有多种实现FP16 实现速度快但精度低FP32 实现速度慢但精度高融合实现把 MatMul 和后面的激活函数融合成一个算子速度更快但只适用于特定模式ge 会根据用户的配置如优先速度还是优先精度自动选择最合适的算子实现。5. 典型应用场景ge 适合干什么讲了这么多技术细节你可能会问ge 到底适合干什么这里列举几个典型的应用场景。5.1 推理部署这是 ge 最常见的应用场景。在推理部署中我们通常需要把训练好的 PyTorch/TensorFlow/MindSpore 模型转换成离线模型.om 文件然后部署到昇腾 NPU 上。ge 就是做这个转换的核心引擎。5.2 推理优化ge 的图级优化可以显著提升推理性能通常可以提升 30%-80%。如果你的推理任务对延迟和吞吐量要求很高一定要用 ge 做图级优化。5.3 不适合用 ge 的场景训练场景ge 主要针对推理场景优化训练场景建议使用框架的原生支持如 PyTorch 的 NPU 后端动态控制流如果模型包含动态控制流如if-else、for循环等ge 的 Tracing 可能无法正确捕获计算图。解决方法把动态控制流改成静态控制流如用torch.where代替if-else需要频繁修改模型结构的场景ge 生成的是静态计算图如果模型结构需要频繁修改每次修改都需要重新编译开销较大ge 仓库地址https://atomgit.com/cann/ge欢迎访问获取最新代码和文档。如果你在使用过程中遇到问题欢迎在仓库提 Issue社区会及时响应。

相关文章:

第一次了解昇腾 NPU 的图编译?从 ge 开始

前言 当你第一次尝试把 PyTorch 模型放到昇腾 NPU 上跑的时候,大概率会遇到这个问题:模型加载成功了,但推理速度慢得让人怀疑人生。或者更糟糕:模型加载失败,报错说某些算子不支持。 这些问题的根源,通常…...

第一次写 Ascend C 算子?先了解 asc-devkit 工具链

前言 当你第一次尝试为昇腾 NPU 写算子的时候,大概率会被一堆概念搞得头大:Kernel 怎么写?CPU 侧代码怎么写?算子怎么注册到框架里去?编译怎么弄?单元测试怎么写? 昇腾 CANN 生态中的 asc-dev…...

第一次给 CANN 社区做贡献?从 community 仓库入手

前言 开源社区是个奇妙的地方。你用着别人免费分享的代码,享受着别人免费提供的文档,突然有一天你想:我是不是也能为这个社区做点贡献? 但紧接着你就被一堆问题拦住了:怎么提 Issue?怎么提 PR&#xff1f…...

戴森球计划FactoryBluePrints:从零到万亿级产能的工业化蓝图解决方案

戴森球计划FactoryBluePrints:从零到万亿级产能的工业化蓝图解决方案 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints是戴森球计划社区规模最…...

全局退火算法:用神经网络驱动蒙特卡洛,突破组合优化瓶颈

1. 全局退火算法:为什么我们需要一种新的优化范式?在组合优化和统计物理领域,我们经常面对一个看似简单、实则令人头疼的核心问题:如何在一个由无数个可能状态构成的、崎岖不平的“能量景观”中找到那个最低的谷底——也就是全局最…...

Python FIT文件解析终极指南:3分钟掌握运动数据分析技巧

Python FIT文件解析终极指南:3分钟掌握运动数据分析技巧 【免费下载链接】python-fitparse Python library to parse ANT/Garmin .FIT files 项目地址: https://gitcode.com/gh_mirrors/py/python-fitparse 你是否拥有Garmin、Suunto等运动手表,却…...

Atlas-Learn:从点云构建流形图册的工程实践与黎曼优化应用

1. 项目概述:从点云到流形图册的工程实践在机器学习和数据科学领域,我们常常面对一个核心困境:数据点看似散落在高维的欧几里得空间中,但其内在的、有意义的规律却往往存在于一个低维的非线性结构上。想象一下,你有一堆…...

基于Spring Boot的高性能分布式定时任务调度系统架构设计与实现原理

基于Spring Boot的高性能分布式定时任务调度系统架构设计与实现原理 【免费下载链接】campus-imaotai i茅台app自动预约,每日自动预约,支持docker一键部署(本项目不提供成品,使用的是已淘汰的算法) 项目地址: https:…...

Neural Complete架构解析:LSTMBase类与TextEncoderDecoder工作流程

Neural Complete架构解析:LSTMBase类与TextEncoderDecoder工作流程 【免费下载链接】neural_complete A neural network trained to help writing neural network code using autocomplete 项目地址: https://gitcode.com/gh_mirrors/ne/neural_complete Neu…...

3分钟解锁Unity全版本:UniHacker跨平台破解神器完全指南

3分钟解锁Unity全版本:UniHacker跨平台破解神器完全指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 你是否还在为Unity高昂的许可证费用而烦…...

Fusion Pixel Font:开源多语言像素字体完全指南

Fusion Pixel Font:开源多语言像素字体完全指南 【免费下载链接】fusion-pixel-font 开源的泛中日韩像素字体,黑体风格 项目地址: https://gitcode.com/gh_mirrors/fu/fusion-pixel-font 寻找完美的像素字体为你的复古项目增添独特魅力&#xff1…...

openpilot终极指南:如何为你的爱车免费升级自动驾驶辅助系统

openpilot终极指南:如何为你的爱车免费升级自动驾驶辅助系统 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_T…...

ARM SME指令集:浮点运算与矩阵加速技术详解

1. ARM SME指令集概述在当今计算密集型应用领域,浮点运算性能直接决定了科学计算、机器学习等关键任务的执行效率。ARM SME(Scalable Matrix Extension)作为ARMv9架构的重要扩展,专为提升矩阵运算性能而设计。与传统的SVE&#xf…...

Get Jobs:你的智能求职导航员,让找工作不再像大海捞针

Get Jobs:你的智能求职导航员,让找工作不再像大海捞针 【免费下载链接】get_jobs 💼【AI找工作助手】全平台自动投简历脚本:(boss、前程无忧、猎聘、智联招聘) 项目地址: https://gitcode.com/gh_mirrors/ge/get_jobs 在求…...

探索dpt-tools:突破索尼电子纸设备系统限制的技术突破

探索dpt-tools:突破索尼电子纸设备系统限制的技术突破 【免费下载链接】dpt-tools dpt systems study and enhancement 项目地址: https://gitcode.com/gh_mirrors/dp/dpt-tools 在数字阅读与笔记领域,索尼DPT系列电子纸设备以其卓越的显示技术和…...

StPageFlip:打造专业级Web翻页效果的终极指南

StPageFlip:打造专业级Web翻页效果的终极指南 【免费下载链接】StPageFlip Simple library for creating realistic page turning effects 项目地址: https://gitcode.com/gh_mirrors/st/StPageFlip 在数字内容呈现日益重要的今天,如何让网页内容…...

Apache Fesod:Java开发者处理海量Excel数据的终极解决方案

Apache Fesod:Java开发者处理海量Excel数据的终极解决方案 【免费下载链接】fesod Fast. Easy. Done. Processing spreadsheets without worrying about large files causing OOM. 项目地址: https://gitcode.com/gh_mirrors/fast/fesod 在处理海量Excel数据…...

高能物理实时触发系统:HGQ与LGN算法在FPGA上的极致优化实践

1. 项目概述:当粒子对撞遇见实时AI在大型强子对撞机(LHC)每秒数千万次的质子对撞中,CMS探测器会捕获海量的高维数据。第一级触发系统(L1T)的任务,是在3.8微秒的极短时间内,将事件率从…...

告别GRUB安装失败:Ubuntu 22.04单硬盘安装最全避坑指南(MBR/EFI详解)

Ubuntu 22.04单硬盘安装终极指南:从MBR到UEFI的GRUB避坑手册当你满怀期待地将Ubuntu 22.04安装U盘插入电脑,却在最后关头遭遇"无法将GRUB安装到/dev/sda"的红色警告时,那种挫败感我深有体会。这不是简单的安装失败,而是…...

Frida与objection版本兼容性原理及多版本隔离实战

1. 为什么你装了objection却跑不起来Frida脚本?——版本混乱的真实代价“明明pip install objection装好了,frida-ps -U能看见设备,但objection explore一执行就报错:frida.InvalidOperationError: unable to find suitable world…...

Playwright安装本质:四层架构与跨平台部署详解

1. 为什么Playwright的安装过程比你想象中更值得深挖 “零基础入门:Playwright安装图解教程”——这个标题乍看平平无奇,像极了网上随手一搜就出十几页的“保姆级教程”。但我在带新人做自动化测试的三年里,亲手帮67位完全没写过Python、连终…...

Playwright MCP实战:AI驱动的网页自动修复与可验证调试

1. 这不是“让AI写网页”,而是让AI当你的前端搭档你有没有过这样的时刻:凌晨两点,线上一个按钮突然不响应,控制台报错指向一段被压缩过的JS,你一边翻Git历史一边怀疑人生;或者刚上线的表单在Safari里莫名错…...

K6压测脚本实战:从玩具到生产级性能验证手术刀

1. 为什么你写的“压测脚本”从来跑不出真实瓶颈? 上周帮一个做 SaaS 后台的团队复盘线上服务抖动问题,他们很笃定地说:“我们做过压测,QPS 5000 没问题。”我问:“用什么工具?脚本怎么写的?”对…...

机器学习解码中子星暗物质:XGBoost与SHAP分析在粒子天体物理中的应用

1. 项目概述:当机器学习遇见中子星,如何解码暗物质之谜?在粒子物理和天体物理的交叉前沿,我们面临着一个根本性的挑战:如何探测那些不发光、不吸收光,却占据宇宙物质总量约85%的暗物质?轴子&…...

NoderCMS开发者手册:扩展功能与自定义模块开发技巧

NoderCMS开发者手册:扩展功能与自定义模块开发技巧 【免费下载链接】nodercms 轻量级内容管理系统,基于 Node.js MongoDB 开发,拥有灵活的内容模型以及完善的权限角色机制。 项目地址: https://gitcode.com/gh_mirrors/no/nodercms N…...

Zilliqa安全机制详解:PoW与分片如何保障区块链安全

Zilliqa安全机制详解:PoW与分片如何保障区块链安全 【免费下载链接】zq1 Zilliqa is the worlds first high-throughput public blockchain platform - designed to scale to thousands ​of transactions per second. 项目地址: https://gitcode.com/gh_mirrors/…...

深入理解css-grid-polyfill原理:从源码角度解析实现机制

深入理解css-grid-polyfill原理:从源码角度解析实现机制 【免费下载链接】css-grid-polyfill A working implementation of css grids for current browsers. 项目地址: https://gitcode.com/gh_mirrors/cs/css-grid-polyfill CSS Grid布局是现代Web开发中强…...

TMSpeech与腾讯会议集成:高效会议纪要生成的实际应用场景

TMSpeech与腾讯会议集成:高效会议纪要生成的实际应用场景 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech TMSpeech是一款专为腾讯会议设计的高效语音识别工具,能够实时将会议中的语音内容转换…...

Windows打印服务总罢工?手把手教你排查并修复Print Spooler自动停止问题

Windows打印服务罢工?深度排查Print Spooler自动停止问题 办公室里最让人抓狂的时刻之一,莫过于点击打印后毫无反应,而打印机明明亮着绿灯。这种时候,十有八九是Windows的Print Spooler服务在"闹罢工"。作为Windows打印…...

C#调用PostMessage实现跨进程精确鼠标点击

1. 这不是“发个Click就完事”的玩具功能,而是Windows底层交互的实战切口很多人第一次搜“C# 模拟鼠标点击”,心里想的是:点个按钮、自动填个表、做个简单自动化脚本——听起来轻巧。但当你真正把代码扔进生产环境,比如要让程序去…...