深夜的快递分拣中心灯火通明。包裹从卡车上卸下来,先被送到扫码站验证身份,再被搬到称重站记录重量,之后又被拖到贴标站打印面单。每一站都只完成一件事,但麻烦的是:每做完一步,包裹都要放到暂存货架上,等下一站的工作人员来取。货架上的存取看似不起眼,包裹一多,搬运工一半以上的时间都耗在“放上去、拿下来”上。TensorRT 的层融合,正是要把这些独立工作站合并成一个“综合工位”,让包裹从传送带一端进去,扫码、称重、贴标一气呵成,不再在中间货架上反复进出。这个看似简单的改变,正是 GPU 推理提速的核心密码。
对 AI 从业者而言,层融合是 TensorRT 性能优化中最立竿见影的手段。理解它,你才能在模型部署时真正读懂引擎日志里的加速数字,也知道该往哪个方向调优,是走向资深推理工程师的关键一步。
目录
可视化演示
通过融合流程、CBR三合一融合与kernel数量对比,直观展示层融合如何减少内核启动与内存读写开销。
本节配有交互动效(进入视口后自动加载,约 3KB)。
融合流程 图解析得到计算图 匹配融合模式 kernel = fuse(layers) 三阶段生成融合内核。
层融合概念——把三站快递合成一条流水线
深夜的快递分拣中心灯火通明。包裹从卡车上卸下来,先被送到扫码站验证身份,再被搬到称重站记录重量,之后又被拖到贴标站打印面单。每一站都只完成一件事,但麻烦的是:每做完一步,包裹都要放到暂存货架上,等下一站的工作人员来取。货架上的存取看似不起眼,包裹一多,搬运工一半以上的时间都耗在“放上去、拿下来”上。
神经网络推理中也有同样的“包裹”——特征图(Feature Map)。一个卷积层输出的特征图要先写回显存,下一个批归一化层再把它读进内核,ReLU 激活层又要重新读取一次。每个算子就像一座独立工作站,而显存就是中间的暂存货架。网络越深,货架往返越频繁,推理延迟也越高。
TensorRT 提出的层融合(Layer Fusion),就是把多个相邻算子合并成一个复合算子,编译成单个 CUDA 内核。数据在寄存器或共享内存中完成上一步之后,立刻接着做下一步,不需要在显存中完整走一个来回。这样,K 个独立内核变成了 1 个融合内核,从源头减少了搬运次数。
如果把三个独立工作站合并成一个“综合工位”,包裹从传送带一端进去,扫码、称重、贴标一气呵成,不需要任何人把它从货架上搬上搬下。层融合就是这组工序上的“综合工位”,模型因此跑得更快。
- 算子索引用求和符号把 K 个算子逐一列出,每一个算子的耗时都要计入总时间。
- 计算耗时第 k 个算子内部做数学运算的时间,比如卷积的乘加运算。
- 搬运耗时第 k 个算子把中间结果写回显存,下一个算子再读入的时间。
- 启动开销每个内核启动时,CPU 提交命令、GPU 切换到执行上下文的固定等待。
性能瓶颈——为什么“中间搬运”如此昂贵
快递中心里,货架上的存取看似只是两秒钟的动作,但包裹成千上万,搬运工一晚上的路程大部分都花在了货架之间。GPU 同理:显存带宽的增长速度远赶不上计算单元的增长速度。算一个卷积也许只要 1 微秒,但把特征图写回显存、再读出来,可能就要花 3 微秒。当访存量超过计算量,GPU 核心就在“空转等数据”。
每个内核启动还有一笔固定的开销。GPU 执行一个内核,需要 CPU 把命令写入命令队列、GPU 驱动完成上下文切换、分配线程块、执行完后再做一次同步等待返回。单次开销大约 5 到 10 微秒,听起来不多,但一个百层模型可能要启动几百次内核,累积起来就是几毫秒——对低延迟推理任务来说,这是不可忽视的延迟。
从访存量来看,假设中间特征图大小为 S,未融合时有 K 个算子、K-1 个中间张量。每个中间张量要写一次、读一次,总计就是 2(K-1)S 的访存量。融合之后,整个链路的输入只需读一次,输出只需写一次,访存量大幅下降。
少搬一次货架,就省一次来回。把三个中间货架全部取消,快递中心腾出了场地,也释放了搬运工的双手——这就是层融合解决的核心问题。
- 算子数量K 代表链路上参与推理的算子总数,K 越大,中间停靠越多。
- 中间张量大小S 是每层之间传递的特征图字节数,分辨率越高、通道越多,S 越大。
- 未融合访存量K 个算子之间有 K-1 个中间结果,每个都要“写进显存、再读进下一内核”,所以乘以 2。
- 融合后访存量数据只在入口读一次、出口写一次,中间过程完全留在片上。
典型融合模式——Conv-BN-ReLU 的数学折叠
聪明的快递中心主管发现,称重站其实是可以被取消的。称重动作本身只是在面单上记录一个“修正重量”,而这个修正值完全可以折进扫码站的读数里,由扫码枪直接输出最终重量。于是称重站被撤销了,流水线少了一站。
神经网络里也有这样的“称重站”——批归一化(Batch Normalization,BN)。BN 在推理阶段的参数是固定的,它做的事情就是对一个中间结果做“缩放加平移”的线性变换。而卷积(Conv)也是一个线性变换。两个线性变换复合之后,仍然是一个线性变换,所以 BN 的参数可以“折叠”进卷积的权重和偏置里。
具体来说,假设卷积权重为 W、偏置为 b,BN 参数为缩放系数 γ、平移系数 β、均值 μ、方差 σ²。令缩放因子 α = γ / √(σ² + ε),那么折叠后的权重 W′ = αW,折叠后的偏置 b′ = αb + (β − αμ)。整理之后,原本的“卷积 → 批归一化 → ReLU”三步运算就变成了“融合卷积 → ReLU”两步运算。
撤销称重站之后,包裹只需经过合并后的“综合工位”,整条流水线减少了物理设备,也减少了一次搬运。这就是 Conv-BN-ReLU 三合一融合的本质:用数学等价变换,把中间环节折叠进前一个算子。
- 定义缩放因子γ 除以标准差,得到每个通道的缩放系数 α,它描述的是 BN 对每个通道“放大或缩小”的比例。
- 折叠权重卷积的每个输出通道权重直接乘上对应通道的 α,这一步吸收了 BN 的缩放效果。
- 折叠偏置原来卷积偏置 b 被缩放,再减去均值带来的平移,最后加上 β,把 BN 的整个线性变换收入偏置。
- 融合输出原本三步操作等价于对折叠后的卷积输出直接应用 ReLU,激活函数原样保留在末尾。
扩展融合模式——从卷积到矩阵乘的全家福
快递中心不止一条流水线。除了扫码、称重、贴标的主线,还有一条人工复核线:核对面单地址、打印发票、贴上“易碎品”标签。主管发现,这三个小工序也可以合并成一个“复核一体工位”,于是又一轮改造开始了。
在神经网络中,除了卷积网络,全连接网络和 Transformer 里最常见的片段是“矩阵乘 → 加偏置 → 激活函数”。例如一个全连接层通常写作 Y = σ(WX + b),其中 WX 是矩阵乘,加 b 是偏置,σ 是激活函数(如 ReLU、GELU)。这三步也完全可以融合成一个复合内核,中间不落显存。
TensorRT 把这些常见的融合模式放进一个“模式匹配库”。构建引擎时,它会扫描整个计算图,寻找匹配的子图结构——就像拿着标准作业卡去核对每个工位——一旦命中,就把整段子图替换为一个融合节点。常见的可融合模式包括:卷积+批归一化+激活、矩阵乘+偏置+激活、逐点缩放+激活、逐点加法+激活等。
所有工位都检查一遍,能合并的尽量合并。快递中心的“综合工位”不止一种:有的整合了扫码称重,有的整合了称重贴标——模式匹配库就是这些“标准作业卡”的集合,帮助 TensorRT 自动完成各类融合。
- 矩阵乘输入 X(形状为“批次×特征维度”)与权重矩阵 W 相乘,得到线性投影。
- 加偏置对每个输出位置加上可学习偏置 b,调整预测的基准位置。
- 激活函数σ 把线性输出映射到非线性空间,例如 ReLU 将负值截断为 0。
- 融合算子三步合为一步,GPU 在同一个内核里完成矩阵乘、偏置相加和激活。
GPU执行效率——少启动、多复用
合并工位之后,包裹在传送带上不停留,整个场地的利用率大幅提高。搬运工省下了路上的时间,传送带空出的位置又能承接新包裹。GPU 里的“搬运工”就是计算核心,而层融合让它们更少地原地等待。
从内核数量上看,未融合时每一层都对应一次独立的内核启动。每个内核启动都要经历“CPU 提交命令 → GPU 调度线程块 → 加载执行上下文 → 执行 → 同步返回”的完整周期。层数成百上千时,这个开销会线性累积。融合后,内核数量大幅减少,原本要启动十几次甚至几十次的操作,变成一次启动、一次执行、一次同步。
技术层面,融合还带来了缓存局部性的提升。中间特征图不需要写回全局显存,而是留在寄存器或共享内存中,下一个操作直接读取,访问延迟低了一个数量级。全局内存带宽不再是瓶颈,GPU 的浮点计算单元得以真正“吃饱”,吞吐量随之上升。
融合后的快递中心不再有频繁的货架往返,同样的人力可以处理更多包裹。GPU 执行效率提升的关键,就是让计算核心把时间花在“计算”上,而不是“等待数据和切换任务”上。
- 未融合计算总时间K 个算子各算一次,总共 K·t_c。
- 未融合访存总时间K-1 次中间往返,每次一写一读共 2 次搬运。
- 未融合启动总开销K 个内核各自启动,固定开销乘以 K。
- 融合后开销计算、访存、启动三种开销都只保留一份,分母因此大幅变小。
自动化融合——TensorRT 如何“看图施工”
快递中心负责人拿到一张全新的工序流程图,他不需要亲手改造每一条传送带,而是让工程队照着图纸,把所有标红的“可合并工位”一次性改装成综合工位。第二天开门营业,新的流水线已经自动运转。
TensorRT 扮演的就是这个“负责人 + 工程队”的角色。当开发者把 ONNX 或 PyTorch 模型输入 TensorRT 时,它首先把模型解析成一张内部计算图(Graph),图的每个节点是一个算子,每条边是数据流。接下来进入构建期(Build Time)优化管线。
构建期管线的核心是模式匹配:遍历图中所有子图,与预定义的融合模板逐一比对。一旦某段子图命中模板(比如“卷积 → 批归一化 → ReLU”),优化器就把这段子图替换为一个融合节点,并调用内核生成器为它生成一个高效的 CUDA 内核。所有融合完成后,引擎文件被序列化保存;部署时直接加载 engine,推理过程中不再重复融合优化。
工程队照着图纸连夜改装,第二天流水线焕然一新。TensorRT 的“看图施工”是自动化的:开发者不需要手写融合内核,只要在构建阶段等待片刻,就能拿到一份已经完成层融合的高效引擎。
- 原始计算图G 是模型解析后的算子图,节点是算子,边是张量流动。
- 模式匹配函数Φ 是 TensorRT 内置的模式匹配引擎,它用融合模板扫描图结构。
- 匹配与替换找到符合模板的子图后,将多个节点折叠为一个融合节点。
- 输出新图G′ 是优化后的计算图,节点更少、内核更精简,直接用于生成引擎。
部署价值——更快的端到端,更低的成本
快递中心的吞吐量上去了,客户等待时间下降,中心甚至不需要再租用第二块场地。同样的成本,处理了更多的包裹——这是每个快递中心老板都想要的账。云服务商眼中的“包裹”就是推理请求,而层融合让同一块 GPU 吃下了更多请求。
在真实部署中,推理服务的两个核心指标是延迟(Latency)和吞吐量(Throughput)。延迟用 p99 衡量:99% 的请求都在这个时间内完成;吞吐量用每秒处理请求数(QPS)或每秒处理的 token 数来衡量。层融合直接缩短单次推理在 GPU 上的执行时间,因而 p99 延迟显著下降,同一 GPU 也能支撑更高的并发。
从端到端视角看,一次推理服务包括数据预处理、GPU 推理、后处理三个阶段。层融合作用在中间的推理阶段,而这一阶段往往是耗时大头。以经典的 ResNet-50 为例,在 TensorRT 上部署后吞吐量可提升数倍,层融合正是其中贡献最大的一项优化。对在线推荐、自动驾驶、大语言模型推理等场景,这项优化直接转化为成本节约。
快递中心的账本从此好看了:同样的场地、同样的人手,每天多送出几千个包裹。部署工程师在 GPU 集群上看到的是:相同的硬件,更低的延迟,更高的吞吐,以及更少的预算。
- 端到端延迟一个请求从进入服务到返回结果的总耗时。
- 预处理时间把原始输入(图像、文本)转换成模型输入的耗时,比如图像缩放。
- 融合推理时间TensorRT 引擎在 GPU 上执行融合后计算图的耗时,层融合优化的对象。
- 后处理时间把模型输出转换成业务结果(如画框、生成文本)的耗时。
AI 应用场景
在线推荐系统的低延迟推理
阶段:推理部署
解决的问题:推荐模型通常由 Embedding 层和多层全连接网络组成。传统方式下,每个全连接层独立执行,输出要写回显存再由下一层读取,几十层累计下来,单次推理的 p99 延迟高达 10ms 以上,用户刷推荐时能明显感到卡顿。TensorRT 利用“矩阵乘+偏置+激活”的融合模式,把连续线性层合并为复合内核,中间结果不落显存,p99 延迟降到 3ms。
具体案例:某短视频平台的推荐粗排服务,模型包含 12 层全连接网络。改用 TensorRT 引擎后,单 GPU 的 QPS 从 800 提升到 2400,p99 延迟从 12ms 降到 4ms,用户滑动刷新时的等待感显著消失。
自动驾驶多任务感知的实时推理
阶段:模型编译优化
解决的问题:车载 GPU 功耗和算力有限,而摄像头、激光雷达数据必须在几十毫秒内完成处理。CNN 主干网络里布满“卷积+批归一化+ReLU”的三连结构,如果不融合,每个三连都会造成两次显存往返和三次内核启动,浪费宝贵的带宽和功耗。层融合把这些三连折叠成单个内核,让功耗和延迟同时下降。
具体案例:某自动驾驶公司的 3D 目标检测模型,主干为 ResNet 风格网络。TensorRT 构建后融合了全部 53 组 Conv-BN-ReLU,推理耗时从 48ms 降到 31ms,GPU 功耗降低约 18%,为后端的路径规划留出了更多时间预算。
云端大模型推理的成本优化
阶段:资源调度与成本优化
解决的问题:大语言模型和视觉模型的推理服务是云上最大的 GPU 开销来源。传统部署方式中,未融合引擎的 GPU 利用率可能只有 30% 到 40%,大量时间消耗在数据搬运和内核切换上。层融合提升了 GPU 计算密度,让同样的 GPU 承担更多推理请求,从而减少服务器采购量。
具体案例:某云厂商的 Stable Diffusion 图像生成服务,将 UNet 中的卷积与注意力线性层做融合优化后,单卡吞吐从每秒 4 张图提升到每秒 9 张图,原本需要 20 张 A100 支撑的业务量缩减到 12 张,年度 GPU 成本下降约 40%。
Python 演示
import numpy as np def conv2d(x, w, b, stride=1): """简化二维卷积,w形状为(C_out,C_in,KH,KW)""" co, ci, kh, kw = w.shape n, _, h, wl = x.shape oh = (h - kh) // stride + 1 ow = (wl - kw) // stride + 1 y = np.zeros((n, co, oh, ow), dtype=np.float32) for i in range(oh): for j in range(ow): patch = x[:, :, i*stride:i*stride+kh, j*stride:j*stride+kw] for c in range(co): y[:, c, i, j] = (patch * w[c]).sum(axis=(1, 2, 3)) + b[c] return y def batch_norm(x, gamma, beta, mu, var, eps=1e-5): """批归一化前向,推理阶段参数固定""" return gamma * (x - mu) / np.sqrt(var + eps) + beta def fused_conv_bn(x, w, b, gamma, beta, mu, var, eps=1e-5): """把BN参数折进Conv权重再做卷积,数学等价于先Conv再BN""" alpha = gamma / np.sqrt(var + eps) w_fused = w * alpha.reshape(-1, 1, 1, 1) b_fused = alpha * b + (beta - alpha * mu) return conv2d(x, w_fused, b_fused) def run(): np.random.seed(0) x = np.random.randn(2, 3, 8, 8).astype(np.float32) w = np.random.randn(4, 3, 3, 3).astype(np.float32) b = np.random.randn(4).astype(np.float32) gamma = np.random.randn(4).astype(np.float32) beta = np.random.randn(4).astype(np.float32) mu = np.random.randn(4).astype(np.float32) var = np.ones(4, dtype=np.float32) y_conv = conv2d(x, w, b) y_bn = batch_norm(y_conv, gamma, beta, mu, var) y_separate = np.maximum(0, y_bn) y_fused = np.maximum(0, fused_conv_bn(x, w, b, gamma, beta, mu, var)) diff = np.abs(y_separate - y_fused).max() print("最大误差:", diff) assert diff < 1e-4, "融合与分离结果不一致" print("验证通过:融合后的单次推理与三步分离推理结果一致") if __name__ == "__main__": run()
alpha = gamma / np.sqrt(var + eps)计算每个通道的缩放系数,这是把 BN 折进卷积的关键“螺丝刀”。w_fused = w * alpha.reshape(-1, 1, 1, 1)卷积权重按通道乘上缩放系数,BN 的缩放效果从此被“吸收”。b_fused = alpha * b + (beta - alpha * mu)偏置同时完成缩放和平移,BN 的剩余参数全部并入。y_fused = np.maximum(0, fused_conv_bn(...))融合后只需一次卷积加一次 ReLU,对应 TensorRT 的单一融合内核。np.abs(y_separate - y_fused).max()用最大误差验证两种路径的数值一致性,证明融合不改变数学结果。
常见误区
误区我以为层融合就是程序员偷懒,把几个算子的代码放进一个函数里,合并一下循环,数学上没什么变化。既然输出都一样,那融合就只是代码层面的整理。
正解如果只是把代码合在一起而不做数学变换,数值结果可能完全错误。以 Conv-BN-ReLU 为例,必须先把 BN 的缩放和平移参数推导出来,折进卷积的权重和偏置中,才能让“融合后的单次计算”与“分离的三步计算”严格等价。TensorRT 的融合内核在生成前会做完整的数学等价变换,不是简单代码合并。
为何常见:“融合”这个词字面听起来很像代码合并,容易让人忽略背后严格的数学推导,初学者最容易产生这种误解。
误区融合后模型跑得更快了,那它一定是把某些层剪掉了,减少了总的浮点运算量,类似模型剪枝的效果。
正解层融合并不会减少任何数学运算,卷积的乘加、BN 的缩放平移、ReLU 的截断,该算的都还在算。它减少的是数据搬运量和内核启动次数。由于 GPU 推理的瓶颈往往在显存带宽而非计算单元,砍掉中间搬运后,速度自然大幅提升。
为何常见:人们习惯用“算得快”推断“算得少”,但 GPU 上“等数据”才是真正的时延来源,这是初学者最容易忽略的硬件特性。
误区既然融合这么好,那把所有相邻操作都合成一个内核不就行了?能合就合,反正没有代价,融合应该适用于任何模型。
正解只有满足兼容条件的算子才能融合。逐点算子、卷积、批归一化、激活这类局部模式适合融合;但动态形状的分支、自定义控制流、非连续内存布局的算子往往无法融合,强行融合会导致寄存器压力过大、线程占用率下降,反而变慢。TensorRT 只能按照模式库中的模板进行匹配。
为何常见:资料里反复强调 Conv-BN-ReLU 这个漂亮案例,容易让人误以为融合是普适的“银弹”,而忽视了融合本身的约束条件。
误区把几个算子合并成一个,中间过程被“压缩”了,输出肯定会有偏差,所以层融合一定是以牺牲精度换速度。
正解层融合在不做量化的情况下是数学等价变换,输出与原始模型在浮点误差范围内几乎完全一致。真正影响精度的是后续可能搭配的 FP16 或 INT8 量化,那是另一套优化机制。融合本身不会引入精度损失,它只是把计算重新组织得更紧凑。
为何常见:TensorRT 的多种优化常常一起出现在部署流程中,新手把量化的精度影响记到了融合头上,久而久之形成误解。
面试题
Q1. TensorRT 层融合的主要作用是什么?
- A.减少启动等待及访存← 正确答案
- B.增加模型参数规模
- C.提升模型泛化能力
- D.简化数据预处理流程
答案:A。层融合把多个算子合并成单一 CUDA 内核,主要消灭的是内核启动开销和层间内存读写,而不是改变模型结构或泛化能力。就像快递中心合并工位,目的是减少包裹搬运,而不是让包裹变得更多。
Q2. 以下哪个组合是 TensorRT 最经典的融合模式?
- A.Conv+BN+ReLU← 正确答案
- B.Flatten+Softmax
- C.Dropout+L2正则
- D.卷积+池化+全连接
答案:A。Conv-BN-ReLU 三合一是 TensorRT 文档和案例中出现频率最高的融合模式。卷积输出经 BN 线性变换后可直接折进卷积权重,最后接 ReLU 成为一个融合内核。其他组合要么跨度大、要么涉及训练期操作,不是经典融合对象。
Q3. 层融合带来的好处有哪些?
- A.提升推理服务吞吐← 正确答案
- B.降低端到端延迟← 正确答案
- C.减小显存带宽压力← 正确答案
- D.增加模型网络层数
答案:ABC。层融合减少中间数据搬运和内核启动,直接带来吞吐提升、延迟降低和带宽压力减小。增加网络层数是模型设计时的事,与融合无关。类比快递中心合并工位,提升的是处理效率而不是增加工序。
Q4. 在 Conv-BN-ReLU 融合中,BN 参数如何“折叠”进卷积?
- A.使用BN参数改写权重偏置← 正确答案
- B.将gamma整体替换卷积核
- C.将ReLU输出减去均值
- D.把BN当作独立层保留
答案:A。BN 推理时是固定线性变换,与卷积的线性变换复合后仍是线性变换,因此可以用 α=γ/√(σ²+ε) 改写卷积权重 αW,并用平移量改写偏置。B 的说法颠倒了角色,C 的操作没有数学依据,D 则是拒绝融合。
Q5. 内核启动开销主要来自哪里?
- A.GPU核心频率不足
- B.显存容量已经耗尽
- C.CPU调度与设备同步开销← 正确答案
- D.输入图像分辨率太高
答案:C。每次内核启动都需要 CPU 提交命令、GPU 驱动调度线程块、执行后同步等待返回,这是一笔固定的调度开销,与算力或显存容量无关。就像派一辆货车前要先填单据、调度司机,这个动作本身要花时间。
Q6. 融合后的推理中,中间特征图主要待在哪里?
- A.全局显存之中
- B.宿主内存之中
- C.寄存器或共享内存← 正确答案
- D.固态硬盘页面
答案:C。层融合的核心价值之一就是中间结果不落全局显存,而是留在 GPU 的寄存器或共享内存里,让下一个算子直接读取。如果还放在全局显存里,就回到了未融合的“货架存取”模式,融合的意义就消失了。
Q7. 融合内核中的 Activation 通常指什么?
- A.激活函数如ReLU← 正确答案
- B.动态形状变换
- C.内存池分配策略
- D.数据增强策略
答案:A。在 MatMul+Bias+Activation 这类融合模式中,Activation 指激活函数,如 ReLU 或 GELU。它在线性变换后立即执行,不需要单独写回显存。融合后的算子形式是 Y=σ(WX+b),其中 σ 就是激活函数。
Q8. 未融合执行时,中间张量反复“写→读”指的是什么?
- A.写入磁盘再读回显存
- B.显存中写中间结果再读取← 正确答案
- C.CPU与GPU间拷贝特征
- D.跨越网络传输数据
答案:B。未融合时每个内核算完,要把输出特征图写到显存,下一个内核再从显存读入,这就是“写→读”往返。它不是磁盘、CPU 或网络层面的事情,而是 GPU 显存内部的频繁读写,是访存瓶颈的来源。
Q9. TensorRT 实现层融合需要做哪些事情?
- A.图遍历与模式匹配← 正确答案
- B.数学等价权重变换← 正确答案
- C.生成融合后的内核← 正确答案
- D.增加训练数据规模
答案:ABC。层融合完整流程包括:遍历计算图、用模式库匹配可融合子图、对匹配子图做数学等价变换(如 BN 折叠)、最后生成融合 CUDA 内核。增加训练数据是模型训练阶段的职责,与 TensorRT 构建期优化无关。
Q10. 动态形状的操作符为什么可能阻断层融合?
- A.动态形状使内存布局无法静态确定← 正确答案
- B.动态形状会让GPU直接报错
- C.融合后无法运行量化
- D.动态形状需要更多显存
答案:A。层融合要求中间张量的形状和内存布局在构建期静态可知,融合内核才能预分配寄存器和共享内存。动态形状意味着输出大小运行时才确定,内存布局无法静态规划,优化器只能把融合边界断开在动态操作符附近。GPU 并不会直接报错,量化也和动态形状没有必然冲突。