ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

NPU与TPU硬件加速实战:从端侧推理到云端训练的选型与调优

NPU与TPU硬件加速实战:从端侧推理到云端训练的选型与调优

1. 为什么到了这一章才讲硬件加速——算力需求的真实拐点

聊到NPU和TPU,先得说清楚一个现实:不是所有项目都需要硬件加速,但一旦需要,软件层面的优化基本上已经走到头了。

我带过一个实际项目,最开始用CPU跑一套实时姿态估计模型,输入是 640x640 的视频帧,模型本身不大,参数量在 5M 左右。听起来不重吧?可一旦要求端到端延迟低于 30ms,CPU 就彻底顶不住了。哪怕用上了 AVX512、多线程流水、OpenVINO 的CPU侧优化,推理耗时也稳定在 80~120ms 之间。后来把同样的模型部署到一块 NPU 上,耗时直接降到 8ms,功耗从 45W 掉到 8W。这个差距不是我调参调出来的,是硬件架构决定的。

这其实就是硬件加速的核心价值:用专用的计算单元,去替代通用处理器上那些“什么都能干但什么都干不快”的运算路径。NPU 和 TPU 虽然都叫AI加速器,但它们的出发点、适用场景、编程模型差别非常大,理解这些差异,比只记住“NPU快、TPU更快”要重要得多。

这一章的内容,适合正在做边缘部署、端侧推理、或者准备把训练和推理搬到云端的开发者。不管你是算法出身还是嵌入式出身,只要你的模型已经在软件层面优化到了瓶颈,那硬件加速就是你下一步必须掌握的东西。

1.1 纯CPU推理的瓶颈在哪里

很多人一提到硬件加速,第一反应是“算力不够”。但真正做过性能分析的人会告诉你,CPU 推理的核心瓶颈往往不是算力,而是“数据搬运”和“指令开销”。

CPU 是冯·诺依曼架构的产物,指令和数据都走同一条总线,每做一次乘加运算,要先取指令、再取数据、然后执行、最后写回。这套流程在跑分支密集的通用程序时没问题,但神经网络恰恰是“数据密集、分支极少”的负载——99% 的时间都在做矩阵乘法和卷积累加。CPU 的控制器和缓存把这些时间白白浪费掉了。

另外一个被低估的问题是内存带宽。一颗主流服务器 CPU 的内存带宽通常在 50~100GB/s 左右,而一个 7B 参数的模型,光权重就要占 14GB(FP16),这意味着哪怕只做一次全量前向推理,也要把 14GB 的数据从内存里过一遍,光搬运就要花掉 0.2 秒左右。NPU/TPU 的解决思路完全不同,它们把计算单元和片上SRAM做得很近,数据尽量留在片上,省掉了大量访存。

所以你得理解,硬件加速的本质不是“算得更快”,而是“让数据少搬家”。NPU 和 TPU 的所有架构设计,几乎都是围绕这一点展开的。

1.2 NPU和TPU,本质上是两套不同的解题思路

NPU(Neural Processing Unit)和 TPU(Tensor Processing Unit)名字听着像,实际上是完全不同的两种产品形态。

NPU 通常是一颗 SoC 里的独立计算单元,也可以是独立的协处理器,它的特点是“和主控紧耦合”。我实际接触过的 NPU 方案就有好几种:有的集成在手机SoC里,有的做成 PCIe 卡插在工控机上,有的直接嵌在摄像头模组里。它们面向的场景高度一致——低功耗、低延迟、单模型、小批量推理。你在端侧跑一个分类网络、一个检测网络,用 NPU 是最合适的。

TPU 则是“为大规模训练和超大批次推理设计的专用处理器”,它几乎不会出现在你的开发板上,而是以云服务的形式提供。我第一次用 TPU 的时候,感觉最强烈的不是“快”,而是“整机架构完全不同”——每颗 TPU 芯片通过高速互联(ICI)相连,组成一个 2D 网格,你写代码时需要明确感知到这个网格的存在,数据怎么切、怎么在芯片间流动,都会影响最终性能。

打个不太严谨但很直观的比方:NPU 像你雇了一个专门做菜的厨师,他就在你家厨房里,擅长做你常点的几道菜,速度快、省燃气;TPU 像一个中央厨房,有几十个厨师同时开工,每个厨师只负责切菜、配菜、炒菜里的一个环节,但你得提前把食材按他们的工序分好,哪个环节慢了都得你来协调。

所以,看到“NPU/TPU硬件加速”这个标题,不能把它们当成一回事。接下来的内容,我按两条线拆开讲,先 NPU,再 TPU,最后用一个迁移案例把两者的实操差异串起来。

2. NPU实战拆解:从算法到芯片的“翻译”全过程

我最早接触 NPU 是在一个端侧人脸识别项目上。模型是 MobileFaceNet,权重 4MB 左右,输入 112x112 的图。当时方案选型的原则很明确:不上 GPU,因为设备是电池供电的;不上 CPU 硬算,因为帧率要求 30FPS。最后选了一颗集成 NPU 的 SoC,NE16 算力大约 2 TOPS,刚好够用。

但真正开始部署才发现,模型训练得好好的,挪到 NPU 上之后性能稀碎——要么精度掉了 3 个点,要么推理时间忽快忽慢。折腾了快两周,我才把 NPU 部署这件事彻底摸透。下面把整个经验拆成三层来讲。

2.1 信架构一改,性能天差地别

NPU 部署的第一步,是把训练好的模型从 PyTorch/TensorFlow 的权重格式,转换到芯片厂商提供的中间表示(IR)。这一步表面上是“格式转换”,本质上是在做“指令翻译”——把面向通用硬件的计算图,重新映射到 NPU 的专用计算单元上。

我用的工具链是某厂商提供的模型转换器,支持 ONNX 输入,转换后会生成一个加密的二进制格式(后缀通常是 .nb 或 .kmodel)。转换之前,需要在模型里显式地指定输入输出的 shape。这里有个容易踩的坑:如果你在 PyTorch 里用了动态 shape(比如 batch 维度为 None),转换器会报错,因为 NPU 的硬件调度单元需要提前知道每一层的张量尺寸,才能分配内存并编排计算流水线。

提示:在训练时就固定输入尺寸,对后续 NPU 部署极其重要。哪怕只是把 Resize 层放在模型内部,也比在外部用 OpenCV 缩放再喂给 NPU 要省事得多——后者意味着每次推理都要做一次 CPU 侧预处理,延迟直接翻倍。

转换的时候还有一个关键参数:量化方式。现在主流 NPU 都支持 INT8 量化,但量化不是简单地把 float32 转成 int8,而是要经过“校准”过程。校准集通常是训练数据的子集,数量不需要太多,几百张图就够。芯片工具链会统计每一层激活值的分布,然后选择合适的缩放系数(scale)和零点(zero point),把浮点数值映射到 INT8 的 [-128, 127] 范围内。

这里要注意,校准集的选择会直接影响量化精度。我用过一次全部用白天图片训练的模型做校准,结果一到晚上场景就掉精度,后来把校准集换成涵盖白天黑夜雨雾的多场景图片,精度就恢复了大半。这是很多新手容易忽略的细节。

2.2 量化与校准:让模型“说”芯片的语言

量化是整个 NPU 部署里最玄学、也最值钱的环节。同样是 INT8,量化做得好不好,精度差距可以从几乎无损到掉 10 个点。

先讲原理,再说实操。神经网络里的权重和激活值分布差异极大:有些层输出集中在 0 附近,呈正态分布;有些层输出跨度特别大,有大量离群点。如果一刀切地把所有层都映射到同一个量化范围,离群点会把精度范围撑大,导致大多数数值落在很少的几个量化粒度上,精度自然就崩了。

所以好的 NPU 工具链会采用“逐层量化”——每一层自己选一个最优的 scale 和 zero point。但这种做法对工具链的成熟度要求很高。我实际用下来的体会是,不同厂商的量化工具做得参差不齐。有的厂商会提供“混合精度量化”选项,即某些敏感层保持 FP16,其余层用 INT8,还有的提供“量化感知训练”(QAT)的接口,让模型在训练阶段就模拟量化噪声。

如果你是第一次接触某个 NPU 工具链,我的建议是:先跑一遍纯后训练量化(PTQ),看精度损失。如果掉点不超过 1%,直接上线;如果掉点超过 2%,再考虑 QAT 或者混合精度。千万不要一上来就 QAT,因为那需要重新训练模型,还要改训练代码里的伪量化节点,成本高了一个数量级。

实操里还有一个技巧:把 BN 层和卷积层融合之后再量化。BN 在推理时本质上是一组线性运算: y = (x - mean) / sqrt(var + eps) * gamma + beta,可以融合进卷积的权重里。融合之后,模型在数值上更干净,量化误差也更容易控制。很多工具链的转换器会自动做这个融合,但你最好在转换日志里确认这一步确实是做了的。

2.3 算子调度与内存布局:性能的最后一公里

模型转换成功、量化精度达标,不代表 NPU 就一定能跑得快。我在一个目标检测项目上遇到过诡异现象:同一个模型,在芯片 A 上跑 60 FPS,在芯片 B 上只有 20 FPS,但两者的 TOPS 算力明明差不多。

后来发现,问题不在算力,而在算子调度。NPU 的计算单元是固定的 MAC 阵列(乘加单元矩阵),每种算子(卷积、池化、全连接、激活函数)对应不同的计算模式。芯片的调度器会把模型的计算图切分成一个个子任务,按依赖关系排列执行。如果某个算子不匹配硬件原生的计算模式,调度器就会把它“卸载”到 CPU 上跑,或者插入大量内存拷贝操作来完成数据重排——这种场景下,算力再高也白搭。

所以你看 NPU 性能,不能只看 TOPS 数字,更要看“算子覆盖率”。工具链在转换模型时,日志里通常会列出每一层被映射到哪个硬件单元。如果发现有大量层跑在 CPU fallback 上,就要考虑替换算子(比如把某些自定义算子改写为芯片原生支持的标准算子),或者调整网络结构。

内存布局也是一门学问。NPU 的片上内存非常有限,通常只有几百 KB 到几 MB,而模型中间层的特征图往往远超这个容量。调度器要决定什么时候把数据留在片上、什么时候写回 DDR、什么时候预取下一层的数据,这直接影响了有效算力利用率。我见过一个 trick:把模型的第一个卷积层的 stride 改大,或者把输入降采样后再进网络,片上内存压力小很多,整体延迟反而更低,因为 DDR 读写的开销省下来了。

注意:NPU 的“算力利用率”通常只有 30%~60%,这是正常现象,不是芯片不行。真正的高手,是在有限的 TOPS 里把有效利用率压榨到极限。

3. TPU的“云上”加速模式:把模型塞进分布式张量处理器

如果说 NPU 是端侧的“贴身侍卫”,TPU 就是云端算力的“重型坦克”。我第一次用 TPU 是在某云平台上跑大规模语言模型的微调任务,事先做了不少功课,但真正上手后还是被几个完全不同的使用习惯震撼到了。

3.1 TPU不是一块芯片,而是一整套系统

TPU 与 GPU 最大的不同,是它从一开始就是为分布式矩阵运算设计的。以我接触过的某代 TPU 为例,单颗芯片包含两个 TensorCore,每个 TensorCore 拥有 128x128 的 MAC 矩阵,单芯片 FP16 算力约 123 TFLOPS。听起来比 GPU 猛,但如果只跑一个小模型,单颗 TPU 的利用率往往很低——因为这个系统最擅长的是“把大模型切成很多块,让每一颗芯片各算一块”。

TPU 的硬件架构里,芯片之间通过 ICI(Inter-Chip Interconnect)互联,带宽和延迟都比较理想。这个互联拓扑非常重要,因为 TPU 不像 GPU 那样通过 PCIe 访问显存,而是每颗 TPU 有自己独立的 HBM 内存,数据必须在芯片之间显式流动。你在编写或配置模型时,需要告诉编译器“哪些数据在哪些芯片上,它们怎么通信”,这比在 GPU 上写代码多了一层分布式思维。

另外,TPU 对 batch size 极度敏感。因为计算单元是固定的 128x128 矩阵,数据形状必须补齐到这个粒度的整数倍,否则就会出现计算单元空转。举个例子,如果全连接层的输入维度是 100,你喂给 TPU 后实际会拿 128 个计算单元去算,其中 28 个是补零的——虽然结果正确,但算力利用率只有 78%。所以,用 TPU 时调整模型宽度(比如 hidden size 对齐到 128 的倍数)会对性能有明显影响。

3.2 用TPU跑一次完整训练的关键步骤

在 TPU 上跑训练,整体流程跟 GPU 上类似,但有三个关键差异。

第一,你需要把模型代码转换成 TPU 编译器能处理的格式。我用的是 JAX/Flax 框架,也有一些项目用 TensorFlow + Keras 的 TPU 策略。JAX 的 xmap/pmap 可以显式地把模型参数和数据切分到多颗芯片上,灵活度最高。TensorFlow 的 TPUStrategy 会自动处理数据并行和模型并行,对新手友好,但灵活性差一些。

第二,数据管道的处理方式不同。TPU 不像 GPU 那样可以直接从 CPU 内存拷贝数据,它需要通过 TFRecord 或类似格式把数据预加载到云存储,再由 TPU 服务按批次读取。我第一次跑任务时,数据管道没调好,TPU 大部分时间都在等待数据,利用率只有 20%。后来我把 TFRecord 的 shard 数量调成和 TPU 芯片数一致,并在训练开始前做了数据预取预热,利用率才拉到 70% 以上。

第三,自定义算子在 TPU 上实现成本较高。XLA 编译器(TPU 的计算图编译器)支持一部分标准算子,但如果你用了自定义算子(比如某些注意力机制的变体),编译器可能无法高效映射,甚至直接报错。我的经验是,用 TPU 之前,先检查你的模型结构里有没有 XLA 不支持的算子,如果有,尽早改写为标准算子组合。

3.3 动态形状、op分离、ICI通信这些真问题

TPU 的使用过程中,有三个问题几乎是每个人都会撞到的。

第一个是动态形状(dynamic shape)。XLA 编译器在编译计算图时需要知道每个张量的形状,如果模型里有依赖运行时数据的 shape(比如基于序列长度做 mask 操作),编译器就无法一次性生成高效的机器码,只能退回“动态编译”模式——每来一个新 shape 就重新编译一次,训练速度掉得让人血压升高。解决方案也简单直接:把输入 padding 到固定长度,并计算好 mask,让所有张量形状在编译期就是确定的。

第二个是算子分离(op placement)。TPU 的资源池里通常还配有 CPU 和 GPU,XLA 编译器会自动决定哪些算子放在 TPU 上,哪些放到 CPU 上。但它的自动决策不一定最优。我遇到过一些张量统计类算子(比如计算标准差、top-k),被编译器放到了 CPU 上,导致 TPU 和 CPU 之间频繁同步。优化方法是手动设置算子设备(比如用 jax.device_put 强制指定),把统计类算子挪到 TPU 内部完成。

第三个是 ICI 通信开销。数据并行训练时,每步训练结束后所有芯片需要做梯度同步。对于 7B 级别的大模型,梯度张量本身就有几十 GB,如果通信拓扑不合理,光梯度同步的耗时可能比计算还长。我试过一种优化方案:把梯度切分成小块,让每个芯片先做一部分本地梯度累积,再做部分聚合,从而让通信和计算部分重叠。这一步调好之后,训练吞吐提升了大概 40%。

4. 一次从NPU迁移到TPU的实战全过程

理论讲了不少,接下来用一个我实际做过的案例,把 NPU 和 TPU 的实操差异串起来。

4.1 任务背景与原始状态

模拟项目X是一个端云协同的质检系统。端侧部署在产线工控机上,用 NPU 跑一个图像分类模型(判断电路板是否有缺件),云侧需要对所有端侧上传的疑似样本做二次复检——复检模型是一个较大的语义分割网络,端侧 NPU 放不下,也跑不动。

最初云侧用的是 GPU 推理,4 张卡并行,单张图片的端到端延迟大约 200ms,高峰期排队严重。后来决定把云侧推理迁移到 TPU 上,利用其高吞吐大批次的优势来削峰。

4.2 迁移步骤与实测数据

整个迁移过程,我拆成了五步。

第一步,把 PyTorch 分割模型导出为 ONNX,检查算子兼容性。这一步就卡住了,模型里有一个自定义的边界细化模块,XLA 不支持。我把它改写成了标准卷积+全连接组合,精度几乎没有损失。

第二步,处理动态形状。原模型支持任意分辨率输入,但 TPU 要求固定 shape。我把输入统一 resize 到 1024x1024,并调整了损失函数里的 mask 逻辑,让 mask 在编译期就可计算。

第三步,设置 TPU 虚拟机并准备数据管道。我把测试数据全部转成 TFRecord,shard 数量设为 TPU 芯片数(本例是 8 颗),并在 ImageNet 格式的数据管道里预取缓冲。

第四步,用 JAX/Flax 重写推理服务。这步工作量最大,因为原来的推理代码是基于 PyTorch 的,加载权重、前向传播、后处理全都耦合在一起。我保留了后处理代码在 CPU 上运行,只把模型的 forward 部分移植到 JAX。

第五步,性能调优。初始迁移后,TPU 利用率只有 35%。后来我调整了 batch size(16 -> 64),重新设计了数据管道的工作线程数,并把 ICI 通信对齐到芯片拓扑,利用率最终达到 62%。

实测数据如下:

项目GPU基线(4x A级别显卡)TPU方案(8核 TPU v4)
单卡/单核吞吐量5.2 img/s2.1 img/s(单核)
总吞吐量20.8 img/s134.5 img/s
batch size864
端到端平均延迟200ms480ms(单张)
1000张图片总耗时48s7.4s

数据说明一个规律:TPU 的强项是“总吞吐”,不是“单请求延迟”。如果你只跑单张图片,TPU 甚至不如一张中端 GPU 快;但当你把请求攒成大批次一起喂进去,TPU 的算力优势就完全释放出来了。所以选型时必须明确业务形态:延迟敏感型适合 NPU/GPU,吞吐敏感型适合 TPU。

4.3 踩坑记录与优化手法

迁移过程中有几个坑,虽然最后绕过去了,但代价不小,值得写下来。

第一个坑是“日志陷阱”。TPU 的硬件监控工具会展示每颗芯片的温度、算力利用率、内存占用率,但这些指标都反映“整机状态”,无法直接告诉你某个具体算子是不是瓶颈。我第一次调优时,看到芯片利用率只有 40%,以为是 batch size 不够,加到 128 后利用率提升了,但端到端延迟反而变差——后来才发现瓶颈在数据预处理的 CPU 侧,TPU 大部分时间是在等待喂数据。调优时一定要看“端到端流水线时间线”,而不是只盯 TPU 芯片利用率。

第二个坑是“前处理放在哪”。原始方案是在 CPU 侧把图片 decode、resize、归一化,再转成 NumPy 数组传给 TPU。这个流程在高吞吐时成了瓶颈。我后来把 decode 和 resize 也改成 TPU 上的算子(JAX 里用 jax.image.resize 等函数),CPU 只负责读取 TFRecord 字节流。这样 CPU 只做 I/O,计算全部在 TPU 侧完成,整体吞吐直接翻倍。

第三个坑是“多线程数据加载被解释器锁卡死”。Python 的多线程做数据加载时,解释器锁会严重限制并发。我用多进程替代多线程,把 TFRecord 读取、解码、预处理每个阶段放在单独的进程里,再通过队列传给训练循环。这一步对大多数 Python 写的数据管道都适用,收益非常明显。

5. 选型逻辑与长期维护经验

到了这一步,NPU 和 TPU 各自的特点已经比较清楚了。但选型不是“哪个快选哪个”,而是要结合业务阶段、团队技术栈和成本模型来判断。

5.1 算力、生态、成本三个维度的取舍

我总结了一个三维度评估法,几乎适用于所有硬件加速选型场景。

算力维度:不能只看 TOPS/TFLOPS,要看“有效算力”。有效算力= 理论算力 × 算子覆盖率 × 平均利用率。NPU 的算子覆盖率取决于工具链的成熟度,TPU 则取决于你对 XLA 的理解深度。对同样的模型,不同硬件的有效算力差距可能有 3~5 倍。

生态维度:看你的模型是用什么框架写的,团队里有没有熟悉该硬件工具链的人。如果你的团队全是 PyTorch 背景,上手 TPU 的成本会很高,因为 JAX/XLA 的调试经验和 PyTorch 完全不同。NPU 则相对接近嵌入式开发,对 C/C++ 和 Python 混合编程有要求。

成本维度:NPU 通常是整体方案里的一颗芯片,边际成本低,适合量大的端侧产品;TPU 是按时租赁的云资源,适合短时突发算力需求,但长期常驻训练任务的总成本不一定比 GPU 便宜。我见过一个项目,因为误以为 TPU 一定比 GPU 划算,把常驻训练任务也迁了过去,结果月末账单比之前高了 30%,后来只好迁回。

5.2 工作负载画像决定路线

根据负载特征,我把常见项目分成四类,每一类的最优选型都不同:

负载特征推荐方案理由
单路低延迟推理、端侧部署NPU功耗低、响应快、无网络依赖
批量离线推理、吞吐优先TPU大批次算力优势明显,总成本可控
中小模型训练、交互式调参GPU生态最成熟,调试体验最好
超大模型预训练、分布式并行TPU互联带宽高,分布式扩展性最好

说白了,没有“最好的硬件”,只有“最匹配的负载形态”。端侧产品硬上 TPU 是不现实的,吞吐型服务硬用 NPU 也会被单核算力限制拖垮。

5.3 维护期的两个真实体会

选型只是开始,长期维护才是真正考验执行力的地方。这里有两个体会。

第一,NPU 的驱动和工具链迭代速度非常快,但版本兼容性常常是噩梦。我遇到过芯片厂商升级了工具链版本,旧版本的模型文件直接加载失败,只能重新转换和量化。后来我养成了一个习惯:每更换一个工具链版本,就把旧版本完整存档(包括转换器二进制、校准脚本、日志),确保可以随时回退复现。

第二,TPU 的云资源要特别关注“实例启动和释放”的自动化。TPU 是按分钟计费的,如果训练脚本中途崩溃,而你没有配置自动释放策略,空闲的 TPU 资源会持续扣费。我后来给所有 TPU 任务都加了一层自动关机脚本,定期检测训练进程是否存活,一旦退出就立即释放实例。这个操作看似简单,但省下的成本相当可观。

6. 常见问题排查与避坑速查

最后整理一个速查表,把我在 NPU 和 TPU 使用中遇过的典型问题、原因和排查方向列出来,方便你收藏备用。

6.1 常见问题速查表

问题现象可能原因排查与解决方向
NPU 推理结果偶发错误片上内存访问越界或 DMA 描述符配置错误检查输入输出缓冲区内存对齐,确认尺寸与模型输入一致
NPU 精度掉点多于 2%校准集与真实数据分布不一致扩充校准集多样性,考虑混合精度量化或 QAT
NPU 推理速度远低于预期算子被 fallback 到 CPU查看转换日志中的算子映射表,替换原生算子
NPU 在低功耗模式下性能抖动电源管理策略导致 NPU 频率跌落在驱动层设置性能模式,锁定 NPU 最低工作频率
TPU 编译时间过长模型存在动态 shape固定所有输入/中间张量维度,去除运行时推断 shape 的操作
TPU 利用率甚至低于 30%数据管道成为瓶颈使用更深的预取队列,增加数据读取进程,或把预处理算子上移
TPU 大批次时 OOMbatch size 超出 TPU HBM 容量按芯片可用内存反推 batch size,或启用模型并行
TPU 跨芯片通信频繁阻塞ICI 流量分布不均调整数据切分策略,使各芯片的计算量尽量均衡

6.2 实操经验补充

几条额外的经验,不放进表格是因为它们更适合用大白话讲。

一是“日志就是调试的第一现场”。每次跑 NPU 转换或 TPU 编译任务,我都会把日志保留下来,至少留到项目完结以后。很多诡异问题,几个月后在日志里看到个关键词,瞬间就知道原因了。

二是“备份一种可复现的环境”。芯片厂商的工具链也好、云平台的 TPU 镜像也好,它们的更新不受你控制,但你的项目必须长期可复现。所以项目一开始,就把工具链版本记录在 README 里,有条件的话把整个工具链打包成容器镜像。

三是“不要过度追求新版本”。新版本工具链通常会修复一些 bug、增加一些算子支持,但也可能引入新的回归问题。生产环境里,稳定优先,功能升级之前先在测试环境里跑完整回归,再决定要不要上线。

四是“性能测试要带业务负载跑”。空跑一个模型看 FPS 很容易,但真实场景里的前处理、后处理、结果传输都会影响端到端表现。我每次做性能验证,都会用和线上一致的数据管道和调用方式,而不是单独测模型推理时间。

我在实际使用中的体会是,NPU 和 TPU 的“难”,不是难在硬件本身,而是难在理解硬件的思维模式。NPU 要求你站在嵌入式系统的角度思考资源边界,TPU 要求你站在分布式系统的角度思考数据流动。一旦你把这套思维模式建立起来,工具链再变、芯片再换,你都能很快摸到调优的门路。把本章前前后后这些经验在项目里过一遍,大概率能少走不少弯路。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进