1. 从计算范式切入:为什么选型不能只看跑分
很多人第一次接触加速器选型,习惯性地打开一张参数对比表,看TFLOPS、看显存带宽、看功耗比,然后挑数字最大的那个下单。我早年也这么干过,结果买回来的卡在实际业务里跑得还不如一张中端卡稳。问题出在哪?出在计算范式这四个字上。加速器不是孤立的一块硅片,它是为某一类计算模式量身定制的执行引擎。你拿一个为稠密矩阵乘法优化的架构去跑稀疏图算法,参数再漂亮也白搭。
所谓计算范式,说白了就是“数据怎么流动、计算怎么发生、内存怎么被访问”这三件事的组合。GPU的范式是大规模SIMT(单指令多线程),成千上万个线程同时执行同一条指令,靠线程级并行把延迟藏起来;TPU的范式是脉动阵列(Systolic Array),数据像心跳一样在计算单元之间规律流动,每个周期完成一次乘加,专为矩阵运算而生;NPU的范式更杂,有走数据流架构的,有走近存计算的,核心思路是把神经网络里的算子固化或半固化到硬件里;FPGA则是可重构逻辑,你写什么电路它就变成什么电路,灵活性拉满但开发门槛高;ASIC是全定制,为单一任务把电路做到极致,性能和能效天花板最高,但一旦流片就改不了。
理解了这个层次,选型逻辑就清晰了:先看你的计算任务属于哪种范式,再看哪种硬件天生适配这种范式,最后才在适配的候选里比参数。这个顺序反了,就会陷入“参数党”的陷阱。我见过太多团队拿着GPU的思维去选NPU,结果发现算子不支持、精度对不上、调度器不兼容,最后项目延期三个月。所以这篇内容我会从范式出发,把GPU、TPU、NPU、FPGA、ASIC这五类硬件的本质掰开讲,再落到实际选型的决策树和踩坑经验上。
适合谁看?如果你是算法工程师,正在纠结训练该用哪家卡;如果你是嵌入式开发者,要在边缘设备上部署模型;如果你是架构师,需要为团队规划异构计算集群;甚至你只是刚入门,想搞明白这些缩写到底差在哪——这篇都能给你一个可操作的判断框架。我不堆砌官方文档里的漂亮数字,只讲实际项目里真正影响决策的那些点。
2. 五类加速器的计算范式与本质差异
2.1 GPU:用海量线程藏延迟的通用并行引擎
GPU的本质是一个延迟隐藏机器。CPU遇到内存访问延迟时,靠大缓存和乱序执行来减少等待;GPU没那么多缓存,它的策略是“这个线程等数据的时候,我立刻切换到另一个就绪线程”。所以GPU的核心里塞了几千个线程上下文,靠**线程级并行(TLP)**把访存延迟盖住。这也是为什么GPU的SIMT模型要求同一warp内的线程尽量走同一分支——一旦分支发散,线程串行执行,延迟隐藏的效果就打折了。
从计算范式看,GPU最擅长的是规则的大规模并行计算:矩阵乘法、卷积、逐元素操作、归约。这些操作的共同点是数据访问模式规整,线程之间没有复杂依赖。深度学习恰好就是这类计算的集合体,所以GPU在过去十年成了AI训练的事实标准。但GPU不是万能的,它的短板在于:控制流复杂的任务(比如递归、动态图)效率低;稀疏计算利用率差;片外内存带宽是瓶颈,数据搬运的能耗远高于计算本身。
实际选GPU时,除了看算力,更要看显存容量和带宽。大模型微调场景下,显存不够直接OOM,算力再高也跑不起来。另外卡间互联很关键,多卡训练时如果互联带宽不足,梯度同步会成为瓶颈,加卡反而降速。我实测过一个案例:两张卡通过PCIe互联做数据并行,扩展效率只有60%出头;换成NVLink互联后,同样两张卡效率拉到92%。这个差距在八卡集群上会被放大到不可忽视。
注意:GPU选型时不要只看单卡峰值算力,要结合你的batch size、序列长度、并行策略一起算有效利用率。很多标称算力在实际负载下只能跑到30%到50%。
2.2 TPU:为矩阵乘法而生的脉动阵列
TPU的设计哲学和GPU完全不同。它不追求通用性,而是把矩阵乘法这个深度学习里最核心的运算做到极致。核心结构是脉动阵列:一个二维的计算单元网格,数据从左侧和上方流入,每个周期每个单元完成一次乘加,结果从下方流出。这种结构的妙处在于,数据复用率极高——一个权重值进入阵列后,会和多个激活值相乘,不需要反复从内存读取。
脉动阵列的代价是灵活性差。它要求矩阵维度对齐,如果维度不匹配,要么填充浪费算力,要么走低效路径。所以TPU对算子形状有要求,动态shape的场景下效率会掉。另外TPU通常以板卡或Pod的形式提供,通过专用互联组成大规模集群,适合超大规模训练。但它的软件栈相对封闭,自定义算子开发成本高,调试工具链也不如GPU生态成熟。
从范式角度,TPU适合的是静态图、固定shape、大规模矩阵运算为主的训练任务。如果你的模型结构频繁变动,或者有大量自定义算子,TPU的迁移成本会很高。我见过一个团队把BERT类模型迁到TPU上,因为用了自定义的attention变体,结果性能还不如GPU,最后又迁回来了。所以TPU选型的前提是:你的计算图足够规整,且愿意接受生态锁定。
2.3 NPU:把神经网络算子固化到硬件里
NPU这个词现在被用得很泛,从手机里的协处理器到数据中心的加速卡都叫NPU。但它们的共同范式是领域专用:针对神经网络里的常见算子(卷积、池化、激活、矩阵乘)设计专用的计算单元和数据通路。有的NPU采用数据流架构,让数据在计算单元之间按需流动,减少对片外内存的依赖;有的采用近存计算,把计算单元放到内存旁边,降低搬运能耗。
NPU的优势是能效比。在同等功耗下,NPU跑推理任务的吞吐通常远高于GPU,因为它的电路是为这些算子定制的,没有通用性的冗余。但代价是算子支持有限。如果你的模型里有NPU不支持的算子,要么走CPU回退(性能暴跌),要么等厂商更新工具链。我踩过的一个坑是:某款NPU对某类激活函数的支持有精度问题,导致推理结果和GPU对不上,排查了两天才定位到是硬件层面的近似计算。
选NPU时,工具链成熟度比峰值算力更重要。你要确认:你的模型里的算子是否都被支持?量化精度是否满足要求?调试工具是否能定位性能瓶颈?这些问题的答案往往决定了项目能不能按时交付。另外NPU的内存布局通常有特殊要求,数据需要按特定格式排布才能发挥性能,这部分适配工作要在项目初期就评估。
2.4 FPGA:用可重构逻辑换灵活性和确定性延迟
FPGA的本质是一堆可编程的逻辑单元和布线资源。你写Verilog或VHDL描述电路,综合工具把它映射到这些资源上,FPGA就“变成”了你设计的电路。这种范式的最大特点是确定性:没有操作系统调度,没有缓存命中率波动,每个时钟周期的行为都是可预测的。这对需要硬实时的场景(比如工业控制、高频交易、雷达信号处理)是刚需。
FPGA的另一个优势是接口灵活性。它可以原生支持各种高速接口(LVDS、MIPI、QSPI、PCIe),直接对接传感器或专用设备。我做过一个图像处理项目,相机输出的是LVDS信号,用GPU方案需要先经过采集卡转成PCIe,延迟和成本都上去了;换成FPGA直接接收LVDS,在片内做预处理,延迟从毫秒级降到微秒级。
但FPGA的开发门槛确实高。你需要懂硬件描述语言、懂时序约束、懂布局布线。一个在CPU上几行代码搞定的事情,在FPGA上可能要写几百行状态机。而且FPGA的定点数处理需要自己设计位宽和截断策略,浮点运算资源有限。所以FPGA适合的是:计算模式固定、对延迟或能效有极致要求、且团队有硬件开发能力的场景。如果只是想做AI推理,除非有特殊的接口或延迟需求,否则NPU或GPU通常是更省事的选择。
2.5 ASIC:为单一任务把电路做到极致
ASIC是全定制芯片,为某一个特定任务把电路设计到最优。没有通用性的妥协,每个晶体管都为这个任务服务。所以ASIC的能效比和性能天花板最高,在大规模量产下单位成本最低。比特币矿机就是典型的ASIC,它的算力能效比远超任何通用硬件。
但ASIC的代价是不可更改。一旦流片,电路就固定了。如果算法变了,芯片就废了。而且流片成本极高,先进工艺下动辄几千万甚至上亿。所以ASIC只适合算法稳定、出货量巨大的场景。对于大多数AI应用来说,算法还在快速迭代,ASIC的风险太高。不过有一种折中方案:结构化ASIC或eASIC,在掩模层面做部分定制,成本和灵活性介于FPGA和全定制ASIC之间。
从选型角度,ASIC通常不是初期方案,而是产品成熟、出货量起来之后的降本手段。我见过一家做智能摄像头的公司,初期用FPGA做原型,算法稳定后转成ASIC,单颗芯片成本从几十美元降到几美元,功耗也降了一个数量级。但这个转换需要提前规划,因为ASIC的验证周期很长,通常要一年以上。
3. 选型决策树:从任务特征反推硬件
3.1 第一步:判断你的计算任务属于哪种范式
选型的第一步不是看硬件,而是看任务。我通常用三个问题来分类:
第一个问题:计算是否以稠密矩阵运算为主?如果是,GPU和TPU都是候选。再进一步:如果模型结构固定、shape静态、追求极致能效,TPU更合适;如果需要通用性、频繁改模型、生态丰富,GPU更稳。
第二个问题:是否有硬实时或确定性延迟要求?如果是,FPGA是首选。GPU和NPU的调度都有不确定性,虽然可以通过优化减少抖动,但做不到FPGA那种周期级确定性。
第三个问题:算法是否已经冻结、出货量是否巨大?如果都是,考虑ASIC。否则用FPGA或GPU做原型,等算法稳定再考虑定制。
这三个问题能把候选范围缩小到一到两类硬件。然后才进入参数对比阶段。
3.2 第二步:在候选硬件里比关键指标
不同场景下,关键指标完全不同。我整理了一个对照表,是我在实际项目中总结的优先级排序:
| 场景 | 第一优先级 | 第二优先级 | 第三优先级 | 典型选择 |
|---|---|---|---|---|
| 大模型训练 | 显存容量与带宽 | 卡间互联带宽 | 算力利用率 | GPU集群 |
| 大规模推理 | 能效比 | 算子覆盖率 | 批处理延迟 | NPU/TPU |
| 边缘推理 | 功耗 | 延迟确定性 | 工具链成熟度 | NPU/FPGA |
| 信号处理 | 接口灵活性 | 延迟确定性 | 定点运算资源 | FPGA |
| 高频交易 | 延迟确定性 | 接口延迟 | 开发周期 | FPGA/ASIC |
| 量产消费电子 | 单位成本 | 功耗 | 算力 | ASIC |
这张表的核心逻辑是:先满足硬约束,再优化软指标。比如边缘推理,功耗是硬约束,超过散热能力直接不能用;在这个前提下再比延迟和工具链。很多选型失败案例都是因为把软指标当硬约束,或者反过来。
3.3 第三步:评估软件栈和团队能力
硬件参数达标只是及格线,软件栈决定实际开发效率。GPU的CUDA生态最成熟,文档、社区、第三方库最丰富;TPU的XLA编译器在静态图下表现好,但自定义算子麻烦;NPU各家工具链差异大,有的连基本的profiling工具都不全;FPGA需要硬件团队,软件工程师转过去学习曲线陡峭;ASIC基本没有“开发”一说,只有前端设计和验证。
我通常建议团队在选型时做一个两周的PoC(概念验证):拿真实模型或任务,在候选硬件上跑一遍,记录开发时间、调试难度、性能达标情况。这个投入远比看文档靠谱。我见过一个团队花了一个月做纸面选型,结果PoC一周就发现首选硬件的算子不支持,白白浪费一个月。
提示:PoC阶段一定要用真实数据量和真实模型结构,不要用简化版。很多问题只在真实负载下才暴露,比如内存碎片、算子融合失败、多卡通信瓶颈。
4. 实操落地:从环境搭建到性能调优
4.1 GPU环境搭建与常见坑
GPU环境的坑主要集中在驱动、CUDA版本、框架版本三者的兼容性上。我踩过最典型的一个坑是:服务器装好了驱动,PyTorch也能识别GPU,但一跑训练就报“device capability不匹配”。原因是编译PyTorch时用的CUDA架构版本和实际GPU的计算能力不匹配。解决办法是查清楚GPU的计算能力(比如是8.6还是9.0),然后确保CUDA和框架都支持这个架构。
安装顺序我推荐:先装驱动,再装CUDA Toolkit,最后装框架。驱动版本要满足CUDA Toolkit的最低要求,CUDA版本要满足框架的编译要求。用conda装框架时,它会自带CUDA运行时,但驱动还是要单独装。我习惯用nvidia-smi确认驱动和GPU状态,用nvcc --version确认CUDA编译器版本,用python -c "import torch; print(torch.version.cuda)"确认框架用的CUDA版本。三个版本要对齐。
多卡环境还要注意NCCL的配置。NCCL是NVIDIA的集合通信库,多卡训练时梯度同步靠它。如果NCCL版本和驱动不匹配,会出现通信超时或性能异常。另外PCIe拓扑会影响通信效率,用nvidia-smi topo -m可以看卡间连接方式,尽量让通信密集的卡走NVLink或同一PCIe Switch。
# 查看GPU状态和驱动版本 nvidia-smi # 查看CUDA编译器版本 nvcc --version # 查看PyTorch使用的CUDA版本 python -c "import torch; print(torch.version.cuda)" # 查看GPU拓扑结构 nvidia-smi topo -m4.2 NPU部署的算子适配与精度对齐
NPU部署最大的工作量在算子适配和精度对齐。主流框架(PyTorch、TensorFlow)的模型不能直接跑在NPU上,需要经过转换工具转成NPU的中间表示。这个转换过程中,不支持的算子会被拆分或回退到CPU,精度也可能因为量化而损失。
我的实操流程是:先用转换工具把模型转过去,然后跑一遍逐层对比,看每一层的输出和GPU的差异。差异大的层重点排查,看是算子实现不同还是量化策略问题。如果某个算子不支持,优先找等效算子替换,比如用多个基础算子组合出目标功能。实在不行才走CPU回退,但要评估性能影响。
精度对齐方面,NPU通常支持混合精度,关键层用FP16或FP32,非关键层用INT8。量化校准集要覆盖真实数据的分布,否则量化误差会很大。我一般会准备一个几百张图的校准集,跑完量化后对比精度,如果掉点超过1%就调整量化策略。
注意:NPU的量化工具通常有“精度模式”和“性能模式”的选项。精度模式保留更多信息但速度慢,性能模式激进量化但可能掉点。实际部署时要在两者之间找平衡,我的经验是关键层用精度模式,其余用性能模式。
4.3 FPGA开发流程与定点数设计
FPGA开发流程和软件完全不同:写RTL代码、功能仿真、综合、布局布线、时序收敛、上板调试。每一步都可能卡住。我刚开始做FPGA时,最头疼的是时序不收敛——综合出来的电路跑不到目标频率。后来发现是组合逻辑太长,插入流水线寄存器后就好了。所以FPGA设计要流水线化,把长组合逻辑切成多级,每级之间加寄存器。
定点数设计是另一个关键点。FPGA的浮点资源有限,大多数信号处理用定点数。你需要决定整数位宽和小数位宽:整数位宽决定动态范围,小数位宽决定精度。位宽太窄会溢出或精度不够,太宽浪费资源。我的方法是先用浮点仿真确定算法需要的动态范围和精度,然后据此选位宽,留一点余量。
// 一个简单的定点数乘法示例 // 输入:a为8位定点数(4位整数+4位小数),b为8位定点数(4位整数+4位小数) // 输出:16位乘积,截断为8位(4位整数+4位小数) module fixed_mult ( input signed [7:0] a, input signed [7:0] b, output signed [7:0] result ); wire signed [15:0] product; assign product = a * b; // 8位乘8位得16位 assign result = product[11:4]; // 截取中间8位,保留4位小数 endmodule复位信号的处理也要注意。FPGA上电时寄存器状态不确定,需要复位信号初始化。但复位信号本身可能有时序问题,比如亚稳态。我的做法是复位信号先经过两级寄存器同步,再分发到各模块。另外复位要异步复位、同步释放,避免复位释放时的时序问题。
4.4 异构计算集群的调度与虚拟化
当集群里同时有GPU、NPU、FPGA时,调度就成了大问题。Kubernetes原生不支持GPU细分,一张卡只能整卡分配,利用率低。所以需要GPU虚拟化方案,比如把一张卡切成多个vGPU,或者用时间片轮转。NPU和FPGA的虚拟化支持更差,很多厂商没有成熟的方案。
我的经验是:训练任务用整卡,推理任务用虚拟化。训练对显存和算力要求高,整卡能避免干扰;推理任务通常资源需求小,虚拟化能提高利用率。调度器方面,K8s的device plugin机制可以扩展支持各种加速器,但需要厂商提供插件。如果厂商没有,就得自己写,工作量不小。
多卡通信的拓扑配置也很关键。比如在多ASIC系统里,config_db.json定义拓扑结构,要确保通信路径最短。我见过一个配置错误导致跨ASIC通信走了远路,带宽只有理论值的30%。排查时用带宽测试工具逐对测,找到瓶颈链路再调整拓扑。
5. 常见问题与排查技巧实录
5.1 GPU相关问题速查
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 训练报OOM | 显存不足 | nvidia-smi看显存占用 | 减小batch size、梯度累积、混合精度 |
| 多卡扩展效率低 | 互联带宽瓶颈 | nvidia-smi topo -m | 调整并行策略、用NVLink卡 |
| 算力利用率低 | 数据加载瓶颈 | profiling看GPU利用率 | 优化DataLoader、预取数据 |
| 驱动崩溃 | 驱动版本不匹配 | dmesg看内核日志 | 重装匹配的驱动版本 |
| 计算结果不对 | 精度问题 | 对比CPU结果 | 检查混合精度设置、关闭TF32 |
GPU崩溃或D3D设备移除这类报错,在Windows上做图形渲染时常见,通常是驱动超时或显存耗尽。解决办法是增加TDR超时时间或降低显存占用。在Linux训练场景下,更常见的是CUDA out of memory,这个就要从batch size和模型并行入手。
5.2 NPU相关问题速查
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 算子不支持 | 工具链版本旧 | 查算子支持列表 | 升级工具链、替换等效算子 |
| 精度掉点 | 量化误差大 | 逐层对比输出 | 调整量化策略、关键层保精度 |
| 性能不达标 | 数据排布不对 | profiling看内存访问 | 按NPU要求重排数据格式 |
| 设备识别失败 | 驱动或库缺失 | 检查torch_npu是否安装 | 安装匹配的NPU库和驱动 |
| 多卡通信慢 | 拓扑配置错误 | 带宽测试 | 调整通信拓扑 |
“NPU is selected as device, but torch_npu is not available”这个报错很典型,就是框架的NPU适配库没装或版本不对。解决方法是确认torch和torch_npu版本匹配,然后正确设置设备参数。昇腾NPU上跑Swift+Megatron这类组合时,还要注意分布式训练的初始化顺序,先初始化NPU设备再初始化通信组。
5.3 FPGA相关问题速查
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 时序不收敛 | 组合逻辑太长 | 时序报告 | 插入流水线寄存器 |
| 亚稳态 | 跨时钟域未同步 | 仿真波形 | 加两级同步器 |
| 资源不够 | 设计太大 | 资源利用率报告 | 优化逻辑、复用资源 |
| 仿真通过上板失败 | 约束不完整 | 检查约束文件 | 补全时序和引脚约束 |
| 定点溢出 | 位宽不够 | 仿真看数值范围 | 增加整数位宽 |
FPGA实现UART接收仿真时,常见问题是采样点不对齐。我的做法是用过采样:用16倍波特率的时钟采样,在中间点取值,这样抗干扰能力强。复位信号亚稳态的问题,除了加同步器,还要注意复位树的分布,避免复位偏斜。
5.4 选型决策的独家避坑经验
第一个坑:被峰值算力忽悠。厂商标称的算力是理论峰值,实际能跑到多少取决于你的任务。我见过标称256TFLOPS的卡,跑实际模型只有40TFLOPS。所以一定要看实际负载下的有效算力,最好用你的模型做PoC。
第二个坑:忽视软件栈的锁定效应。用了某家的NPU,工具链、调试器、部署流程都得跟着走。如果这家厂商的生态不够开放,后续迁移成本很高。选型时要评估退出成本,别把自己锁死。
第三个坑:低估数据搬运的能耗。在加速器里,数据从片外内存搬到计算单元的能耗,往往比计算本身还高。所以内存带宽和片内缓存比算力更值得关注。一个算力稍低但缓存大的芯片,实际表现可能更好。
第四个坑:忽略散热和供电。高算力卡功耗高,机箱散热跟不上会降频。我见过一个集群因为散热设计不足,夏天频繁降频,实际算力只有标称的60%。选型时要把散热和供电纳入评估。
第五个坑:没有预留升级空间。算法在迭代,今天的硬件可能明年就不够用了。选型时要考虑扩展性:能不能加卡?能不能换更强的型号?接口是否通用?这些在初期就要规划。
6. 不同场景下的选型建议与实战案例
6.1 大模型训练场景
大模型训练的核心约束是显存和互联带宽。模型参数、梯度、优化器状态、激活值都要占显存,7B模型全量微调大概需要80GB以上显存,70B模型需要多卡并行。所以选型第一看单卡显存,第二看卡间互联。
我的建议是:训练用GPU集群,优先选NVLink互联的卡。TPU在超大规模下能效更好,但生态锁定和迁移成本要考虑。NPU目前在大模型训练上还在追赶,工具链成熟度不如GPU。如果预算有限,可以考虑混合精度+梯度累积+LoRA来降低显存需求,这样中端卡也能跑。
实战案例:一个团队要微调13B模型,预算有限。我建议用两张48GB显存的卡做张量并行,配合LoRA和梯度检查点,实际显存占用控制在70GB以内,训练速度可接受。如果强行用单卡,要么OOM,要么batch size小到训练不稳定。
6.2 边缘推理场景
边缘推理的核心约束是功耗和成本。设备通常靠电池或PoE供电,散热空间有限。所以选型第一看能效比,第二看算子覆盖率,第三看工具链。
我的建议是:优先考虑NPU,如果算子不支持再考虑FPGA。NPU的能效比通常最好,开发也相对简单。FPGA适合有特殊接口或延迟要求的场景。GPU在边缘场景功耗偏高,除非需要跑复杂模型。
实战案例:一个智能摄像头项目,需要在本地做目标检测。最初用GPU方案,功耗15W,散热片很大。换成NPU后功耗降到3W,散热片缩小一半,检测帧率还略有提升。但NPU对某些后处理算子支持不好,最后把NMS用CPU实现,整体延迟仍在可接受范围。
6.3 信号处理与实时控制场景
这类场景的核心约束是确定性延迟和接口灵活性。雷达、相控阵、工业控制都要求微秒级确定性响应,GPU和NPU的调度抖动满足不了。所以FPGA是首选。
我的建议是:用FPGA做前端信号处理,用GPU或NPU做后端智能分析。FPGA负责高速采集、滤波、波束成形等确定性任务,把处理后的数据传给后端做AI推理。这样各取所长。
实战案例:一个相控阵项目,需要控制每个阵元的相位。FPGA直接生成相位控制字,延迟在纳秒级,抖动几乎为零。如果用GPU,光是数据从采集卡传到GPU就有毫秒级延迟,完全满足不了要求。FPGA实现MIPI接收也是类似逻辑,原生接口直接对接传感器,省去转换芯片。
6.4 量产消费电子场景
消费电子的核心约束是单位成本和功耗。出货量大的话,ASIC能把成本压到最低。但算法必须冻结,否则流片风险高。
我的建议是:先用FPGA或NPU做原型,算法稳定后转ASIC。转ASIC前要做充分的验证,包括功能验证、时序验证、功耗验证。流片一次的成本很高,不能有闪失。
实战案例:一个TWS耳机项目,需要在本地做语音唤醒。最初用NPU,单颗成本几美元。出货量到千万级后,转成ASIC,单颗成本降到几毛钱,功耗也降了一半。但转换过程中发现NPU上的某些近似计算在ASIC上实现后精度不够,又调整了算法,多花了三个月。
7. 写在最后:一些个人体会
做了这么多年加速器选型和部署,我最大的体会是:没有最好的硬件,只有最合适的硬件。GPU通用但能效不是最优,TPU高效但生态封闭,NPU能效好但算子受限,FPGA灵活但开发难,ASIC极致但不可改。选型的过程就是在约束条件下找平衡。
另一个体会是:软件栈的重要性不亚于硬件。一个工具链成熟的中端硬件,实际开发效率可能远超一个工具链糟糕的高端硬件。所以选型时一定要做PoC,用真实任务测开发效率和实际性能。
最后分享一个小技巧:建立自己的选型评分卡。把硬约束(功耗、接口、延迟)作为一票否决项,软指标(算力、生态、成本)加权评分。每次选型都按这个流程走,能避免拍脑袋决策。我用了这个方法后,选型失误率明显下降。
这个领域变化很快,新硬件、新工具链层出不穷。保持学习,保持动手,比记住任何参数都重要。