設(shè)施的實(shí)戰(zhàn)指南)
在高性能計(jì)算這個(gè)圈子里混久了很容易形成一種慣性思維算力不夠就加卡跑得慢就堆機(jī)器。直到我開始認(rèn)真研究NPU相關(guān)的項(xiàng)目這種慣性思維被徹底打破了——AI基礎(chǔ)設(shè)施和生態(tài)層里的水遠(yuǎn)比加卡兩個(gè)字深得多。所謂NPU全稱Neural Processing Unit神經(jīng)網(wǎng)絡(luò)處理器。這幾年它頻繁出現(xiàn)在手機(jī)發(fā)布會上、端側(cè)AI的PPT里、大模型推理服務(wù)器的宣傳冊上。但說實(shí)話很多團(tuán)隊(duì)的認(rèn)知還停留在NPU是GPU之外另一個(gè)加速器的程度。真到選型、部署、調(diào)優(yōu)的時(shí)候NPU和GPU之間的差異會直接改寫你的模型結(jié)構(gòu)、量化策略、軟件棧甚至機(jī)柜里的散熱規(guī)劃。這篇文章我想把NPU這件事從底到上拆開講為什么神經(jīng)網(wǎng)絡(luò)計(jì)算需要專門的芯片、MAC陣列和峰值算力是怎么算出來的、為什么標(biāo)稱TOPS跑不滿、端側(cè)和云端NPU的兩種活法、以及決定NPU能不能落地的軟件棧。最后一部分會聊一些我在實(shí)際部署推理模型時(shí)踩過的坑和調(diào)優(yōu)思路。適合做模型推理服務(wù)、邊緣設(shè)備方案選型的技術(shù)負(fù)責(zé)人也適合想從基礎(chǔ)設(shè)施層面理解AI生態(tài)怎么轉(zhuǎn)的產(chǎn)品和技術(shù)愛好者。1. 神經(jīng)網(wǎng)絡(luò)處理器的誕生邏輯通用計(jì)算為什么扛不住1.1 從通用復(fù)雜到專用重復(fù)的計(jì)算模式變遷CPU的設(shè)計(jì)哲學(xué)是什么都能干無論是操作系統(tǒng)調(diào)度、數(shù)據(jù)庫查詢、還是游戲物理引擎都能用一套通用邏輯來處理。但通用是有代價(jià)的為了支持各種指令CPU里大量面積和功耗都消耗在指令譯碼、分支預(yù)測、亂序執(zhí)行、緩存一致性這些管理開銷上真正用來做數(shù)學(xué)運(yùn)算的算術(shù)單元只占一小部分。神經(jīng)網(wǎng)絡(luò)計(jì)算恰恰和CPU擅長的事是擰著來的。一個(gè)卷積層或者注意力層本質(zhì)上就是反復(fù)做同一件數(shù)學(xué)操作乘法和累加。CNN里的卷積是一個(gè)filter窗口在特征圖上滑來滑去Transformer里的矩陣乘法更是把乘累加應(yīng)用到了極致。這類負(fù)載的特點(diǎn)非常鮮明計(jì)算模式極度規(guī)律、數(shù)據(jù)訪問高度重復(fù)、單個(gè)操作本身極其簡單但數(shù)量驚人。用生活化的方式類比CPU像是一個(gè)精通十八般武藝的雜貨店老板什么需求都能應(yīng)付而神經(jīng)網(wǎng)絡(luò)計(jì)算則像是流水線上的擰螺絲工人動作單一但需要一天擰幾萬次。你要是讓雜貨店老板去擰螺絲他也能干但效率一定是浪費(fèi)的——他的經(jīng)驗(yàn)和體力本應(yīng)花在更復(fù)雜的問題上。1.2 NPU到底專在哪矩陣運(yùn)算、數(shù)據(jù)復(fù)用與片上存儲NPU的出現(xiàn)在于把擰螺絲這件事做到極致。它不再帶沉重的指令流水和亂序執(zhí)行邏輯而是把芯片面積幾乎全部留給計(jì)算單元和專用存儲只做神經(jīng)網(wǎng)絡(luò)推理/訓(xùn)練中頻率最高的操作矩陣乘法和卷積。這里的關(guān)鍵技術(shù)點(diǎn)是數(shù)據(jù)復(fù)用。做矩陣運(yùn)算時(shí)同一份權(quán)重會被反復(fù)使用同一塊輸入特征也會被多個(gè)計(jì)算單元同時(shí)用到。如果能把這些數(shù)據(jù)留在芯片內(nèi)部的片上存儲SRAM里反復(fù)讀取而不是每次都去片外DRAM搬運(yùn)能節(jié)省的功耗和時(shí)間是數(shù)量級的。NPU的架構(gòu)核心就是圍繞如何最大化片上數(shù)據(jù)復(fù)用、減少片外訪存來設(shè)計(jì)的這才是它效率遠(yuǎn)超通用芯片的根本原因。我見過不少人對NPU有誤解以為它只是把GPU里的Tensor Core搬出來單獨(dú)做成一款芯片。這個(gè)理解不完全對。GPU里的Tensor Core本質(zhì)上是給GPU這輛跑車加了一個(gè)氮?dú)饧铀傧到y(tǒng)整體架構(gòu)仍然是通用的而NPU則直接把這輛車改裝成了只跑直線加速賽的專用機(jī)器在特定負(fù)載下效率更高但靈活性大幅下降。1.3 大模型時(shí)代NPU的重新登場2023年之后大模型爆發(fā)圍繞算力的討論幾乎無處不在token、參數(shù)量、訓(xùn)練FLOPs這些詞滿天飛。也是在那個(gè)階段我注意到一個(gè)明顯的變化過去NPU主要出現(xiàn)在手機(jī)SoC和邊緣攝像頭這些設(shè)備上做的是人臉識別、語音喚醒這類小模型但大模型來了以后CPU跑不動、GPU太貴太耗電的中間地帶開始顯露出巨大的空間——端側(cè)跑7B甚至更大參數(shù)量模型、數(shù)據(jù)中心跑高吞吐推理、AI Agent應(yīng)用需要低延遲連續(xù)推理這些都是NPU的機(jī)會。它解決的核心問題可以概括成一句話在給定的功耗和成本約束下用最少的資源把海量矩陣運(yùn)算跑完。理解了這句話后面所有的架構(gòu)設(shè)計(jì)、性能指標(biāo)、調(diào)優(yōu)手段就都有了主線。2. NPU的架構(gòu)底細(xì)MAC陣列、數(shù)據(jù)流與片上內(nèi)存的三角關(guān)系2.1 數(shù)一數(shù)MAC算力指標(biāo)的真正含義要讀懂NPU的算力標(biāo)稱值繞不開一個(gè)基本動作MAC也就是Multiply-Accumulate乘累加。一次MAC完成y y w × x這是神經(jīng)網(wǎng)絡(luò)里最基本的計(jì)算原子。把一堆MAC單元排列成二維陣列同一時(shí)刻讓陣列里所有單元都工作就構(gòu)成了矩陣乘法的硬件加速引擎。廠家宣稱的TOPSTera Operations Per Second每秒萬億次操作就是用這個(gè)陣列算出來的TOPS MAC單元總數(shù) × 2 × 時(shí)鐘頻率注意那個(gè)2因?yàn)橐淮蜯AC包含一次乘法和一次加法業(yè)界習(xí)慣把這兩個(gè)操作都算進(jìn)操作數(shù)里。舉個(gè)例子假設(shè)一顆芯片有4096個(gè)MAC單元跑1GHz那么它的算力是4096 × 2 × 1GHz 8.192 TOPS。這里給出一個(gè)直接的參考當(dāng)前主流旗艦手機(jī)SoC里的NPU算力在幾十TOPS量級專門的云端推理芯片能到數(shù)百TOPS而英偉達(dá)最新數(shù)據(jù)中心GPU在FP4精度下能到幾千TOPS注意精度差異。只看數(shù)字沒有意義必須把精度的前提綁定在一起否則就是不同量綱在比大小。2.2 數(shù)據(jù)流設(shè)計(jì)權(quán)重固定、輸入固定還是輸出固定MAC陣列只是積木真正決定NPU效率的是數(shù)據(jù)怎么在陣列之間流動。業(yè)界把各種流動策略統(tǒng)稱為Dataflow數(shù)據(jù)流主要有三種流派第一種是權(quán)重固定Weight Stationary權(quán)重一次性從片外搬到片上后就不動了后續(xù)所有輸入特征都來復(fù)用這份權(quán)重。卷積神經(jīng)網(wǎng)絡(luò)里權(quán)重復(fù)用度極高這種策略特別適合CNN場景。第二種是輸入固定Input Stationary把輸入特征留在片上多個(gè)不同的權(quán)重輪流來跟它計(jì)算。這適合權(quán)重不斷變化、輸入需要反復(fù)使用的場景。第三種是輸出固定Output Stationary把部分累積結(jié)果留在計(jì)算單元里一邊讀新的輸入和權(quán)重一邊累加減少中間結(jié)果的搬移。實(shí)際芯片很少用單一數(shù)據(jù)流大多是混合策略根據(jù)模型結(jié)構(gòu)動態(tài)調(diào)整。我在調(diào)研昇騰、Google TPU這些公開資料時(shí)發(fā)現(xiàn)它們在數(shù)據(jù)流選擇上的文檔描述五花八門但本質(zhì)都是在減少數(shù)據(jù)搬移這個(gè)目標(biāo)下做權(quán)衡。這個(gè)權(quán)衡是極其關(guān)鍵的矩陣乘法的計(jì)算量隨矩陣維度增長如果數(shù)據(jù)在片外和片上之間反復(fù)搬運(yùn)功耗和延時(shí)都會迅速失控算力再高也無濟(jì)于事。2.3 片上內(nèi)存和帶寬NPU性能的真正瓶頸芯片計(jì)算單元速度再快數(shù)據(jù)喂不進(jìn)來也是白搭。NPU設(shè)計(jì)中有一個(gè)我特別想強(qiáng)調(diào)的規(guī)律性能和功耗的瓶頸往往不在計(jì)算陣列而在存儲和帶寬。以一張1080×1920的輸入圖像為例如果進(jìn)行3×3卷積卷積核要滑過大約37萬個(gè)位置每個(gè)位置需要讀取9個(gè)像素。如果這些數(shù)據(jù)全靠從片外DRAM讀取內(nèi)存訪問次數(shù)會被放大數(shù)倍。將圖像塊緩存到片上SRAM中后訪問量就是圖像本身的數(shù)據(jù)量了。片上SRAM越大能裝下的權(quán)重和中間結(jié)果越多對外部內(nèi)存帶寬的要求就越低但SRAM面積成本極高容量做大會直接讓芯片尺寸和成本失控。這就形成了一個(gè)三角制約計(jì)算陣列規(guī)模決定峰值算力上限片上SRAM決定數(shù)據(jù)復(fù)用能力片外內(nèi)存帶寬決定數(shù)據(jù)的供水能力。三者必須匹配任何一塊短板都會讓芯片實(shí)際表現(xiàn)遠(yuǎn)低于標(biāo)稱值。這也解釋了為什么同樣標(biāo)稱100TOPS的兩顆芯片實(shí)測性能可能差出兩倍——短板的位置不同。3. 算力不等于峰值有效算力、內(nèi)存帶寬與功耗的三方掰扯3.1 為什么實(shí)測跑不到標(biāo)稱TOPS幾乎所有剛接觸NPU的團(tuán)隊(duì)都會在第一個(gè)性能驗(yàn)證項(xiàng)目里撞上同一堵墻芯片標(biāo)稱50TOPS實(shí)測跑一個(gè)常規(guī)的ResNet或Transformer模型實(shí)際有效算力可能只有20TOPS出頭。這個(gè)落差是由多方面原因疊加造成的。第一個(gè)原因是利用率打不滿。MAC陣列需要源源不斷地供數(shù)才能全速運(yùn)轉(zhuǎn)但模型里的算子并不都是整齊劃一的矩陣乘法。卷積、激活函數(shù)、歸一化、殘差連接、非線性操作這些算子對MAC陣列的利用率參差不齊有些算子甚至幾乎不使用MAC陣列。把這些算子的耗時(shí)平均下來陣列利用率落到50%~70%是非常正常的。第二個(gè)原因是訪存受限。Roofline模型把計(jì)算強(qiáng)度定義為每讀取一字節(jié)數(shù)據(jù)可以執(zhí)行的浮點(diǎn)操作數(shù)。如果某個(gè)算子的計(jì)算強(qiáng)度遠(yuǎn)低于做乘加運(yùn)算所需的數(shù)據(jù)量計(jì)算單元就會長時(shí)間處于等數(shù)據(jù)的空閑狀態(tài)。大模型推理里特別典型的decode階段每個(gè)token只做一次矩陣運(yùn)算但權(quán)重必須全部從內(nèi)存過一遍——這時(shí)候芯片的瓶頸已經(jīng)從算力轉(zhuǎn)移到了內(nèi)存帶寬。第三個(gè)原因是調(diào)度和同步開銷。多核并行時(shí)核與核之間需要同步、輸出結(jié)果需要匯總拼接這些操作都會產(chǎn)生真實(shí)的時(shí)間開銷但在標(biāo)稱值里是看不見的。3.2 有效算力怎么評估才靠譜基于這些經(jīng)驗(yàn)我給團(tuán)隊(duì)定的評估方法很簡單不要信TOPS就用準(zhǔn)備上線的真實(shí)模型去工程板上跑一遍同時(shí)結(jié)合芯片的計(jì)算強(qiáng)度和存儲帶寬做一次Roofline分析判斷當(dāng)前模型是受算力限制還是帶寬限制。評估時(shí)我會在同樣的情況下跑幾個(gè)驗(yàn)證指標(biāo)單batch延時(shí)一次推理從輸入到輸出了多久、多batch吞吐每秒能過多少個(gè)樣本、以及達(dá)到這些數(shù)據(jù)時(shí)的功耗和芯片溫度。把這幾個(gè)數(shù)放到同一個(gè)坐標(biāo)系里和廠商提供的算力曲線做對比基本就能判斷這顆芯片的實(shí)際可用算力水平。需要特別提醒的是不同尺寸的模型在NPU上的表現(xiàn)差異巨大。模型越大權(quán)重片外讀取的比例越高對帶寬越敏感模型越小越容易整體塞進(jìn)片上SRAM計(jì)算陣列的利用率就越高。我在一個(gè)項(xiàng)目里測過同一顆芯片小模型利用率能到70%以上換成大模型直接掉到30%。這不是芯片變差了而是模型特征和硬件特征的匹配度不同。選型時(shí)如果只看廠商給的標(biāo)準(zhǔn)模型測試報(bào)告很容易被誤導(dǎo)。3.3 能效比和TDP端側(cè)和云端都躲不開的硬約束功耗是算力之外另一個(gè)決定選型的硬指標(biāo)。數(shù)據(jù)中心里一顆300W的GPU可以暴力堆算力對能效比沒有那么敏感因?yàn)闄C(jī)柜電源和散熱都能兜住但邊緣盒子和手機(jī)完全不同TDP可能只有幾瓦到十幾瓦電池和散熱約束把可用的算力上限死死壓住了。能效比通常用TOPS/W來表示。例如一個(gè)10TOPS、功耗5W的端側(cè)NPU能效比約2TOPS/W而一顆達(dá)到300W的高性能加速芯片即使算力做到500TOPS能效比也只約1.7TOPS/W。在高性能計(jì)算這個(gè)圈子里混久了你會在各種發(fā)布會PPT里反復(fù)看到一個(gè)話術(shù)我們的能效比遠(yuǎn)高于GPU。但必須冷靜想想它是在什么樣的精度、什么樣的模型、什么樣的batch、什么樣的占空比下測出來的。端側(cè)芯片宣傳能效比時(shí)常常用的是稀疏化激活后的小模型實(shí)測數(shù)據(jù)而這個(gè)數(shù)據(jù)在真實(shí)負(fù)載下不一定能復(fù)現(xiàn)。4. 端側(cè)NPU和數(shù)據(jù)中心NPU同一技術(shù)路線的兩種活法4.1 手機(jī)SoC里的NPU在功耗預(yù)算里做文章端側(cè)NPU的代表形態(tài)是集成在手機(jī)SoC里的獨(dú)立計(jì)算單元。無論是蘋果的Neural Engine、高通的Hexagon DSP衍生出的NPU架構(gòu)還是各廠商自研的AI加速模塊它們面對的共同約束都是功耗預(yù)算只有幾瓦還得和CPU、GPU、基帶、ISP搶面積和帶寬。這迫使端側(cè)NPU在設(shè)計(jì)上極端重視能效比寧可犧牲通用性也要把常見視覺模型跑得飛快。端側(cè)NPU最常見的加速對象是攝像頭相關(guān)的CV模型、語音識別、翻譯、以及大模型出現(xiàn)后的端側(cè)LLM推理。以目前手機(jī)上流行的小參數(shù)模型為例一個(gè)7B模型用INT4量化后權(quán)重約3.5GB左右遠(yuǎn)超片上內(nèi)存必須流式地從LPDDR讀取這時(shí)推理速度基本被內(nèi)存帶寬鎖死。這也是為什么有些手機(jī)宣傳本地跑大模型實(shí)際每秒只能吐幾個(gè)token——硬件本身沒有做錯(cuò)什么只是工作模式已經(jīng)完全切換到了訪存受限狀態(tài)。4.2 云端可擴(kuò)展的AI芯片把陣列做成規(guī)模云端NPU和端側(cè)的思路截然不同。數(shù)據(jù)中心里的AI推理芯片不再那么計(jì)較單瓦能效更強(qiáng)調(diào)的是絕對吞吐、大批量處理能力和可擴(kuò)展的互聯(lián)能力。Google TPU、昇騰的推理芯片、Amazon Inferentia這類產(chǎn)品的共同點(diǎn)是核心還是MAC陣列但陣列規(guī)模更大、片上內(nèi)存和HBM帶寬配置更高同時(shí)通過PCIe或?qū)S没ヂ?lián)協(xié)議把多顆芯片拼成一個(gè)計(jì)算集群。云端NPU最典型的使用場景是高并發(fā)的推理服務(wù)一個(gè)在線推薦服務(wù)可能每秒要處理幾萬個(gè)請求一個(gè)LLM服務(wù)可能要同時(shí)服務(wù)數(shù)千個(gè)并發(fā)會話。這類場景下batch維度為持續(xù)利用MAC陣列提供了條件——把多個(gè)請求的矩陣乘法合并成更大的矩陣運(yùn)算陣列利用率能大幅提升。這里要提一個(gè)最近討論度很高的詞token算力需求評估。LLM推理的算力需求是有明確物理公式的。模型推理一個(gè)token的理論計(jì)算量大約等于模型參數(shù)量的兩倍單位FLOPs所以一個(gè)7B模型生成一個(gè)token大約需要14GFLOPs換算成MAC操作就是7GMAC。如果芯片標(biāo)稱100TOPS且利用率100%理論上每秒能生成約1.4萬token但實(shí)際要考慮prefill階段的高計(jì)算量和decode階段的帶寬瓶頸還要算上batch的疊加效應(yīng)。網(wǎng)上有不少人在問評估token算力需求到底怎么算我的經(jīng)驗(yàn)是先拆解模型的參數(shù)量、上下文長度、并發(fā)數(shù)和響應(yīng)速度目標(biāo)再反推出需要的譯碼吞吐量和帶寬這才是一個(gè)可執(zhí)行的需求評估框架而不是停留在感覺層面。4.3 NPU與GPU共存基礎(chǔ)設(shè)施層的分工對應(yīng)到實(shí)際的數(shù)據(jù)中心NPU和GPU并不是你死我活的替代關(guān)系。訓(xùn)練階段模型結(jié)構(gòu)頻繁變化、需要大規(guī)模通用矩陣運(yùn)算和混合精度支持這仍然是GPU的主場而訓(xùn)練完成后的在線推理服務(wù)、大批量、模型結(jié)構(gòu)固定NPU在能效比和單卡吞吐上往往更有優(yōu)勢更適合承擔(dān)這些負(fù)載。在AI基礎(chǔ)設(shè)施規(guī)劃里我看到越來越多團(tuán)隊(duì)采用CPU負(fù)責(zé)調(diào)度和前后處理、GPU負(fù)責(zé)訓(xùn)練和復(fù)雜推理、NPU承擔(dān)高并發(fā)固定模型的策略。這種分工對應(yīng)著整個(gè)AI基礎(chǔ)設(shè)施的演進(jìn)趨勢基礎(chǔ)設(shè)施層不再是一臺機(jī)器裝一張GPU那么簡單而是由異構(gòu)計(jì)算節(jié)點(diǎn)、調(diào)度平臺、存儲和網(wǎng)絡(luò)共同構(gòu)成的生態(tài)。后面講到軟件棧時(shí)你會更深刻地理解這個(gè)生態(tài)的黏合劑根本不在硬件本身。5. 軟件棧才是NPU的隱形戰(zhàn)場算子庫、編譯器與量化方案5.1 算子缺失AI芯片落地的第一大難題關(guān)于NPU一個(gè)經(jīng)常被嚴(yán)重低估的事實(shí)是NPU本身只是半成品周圍的軟件工具鏈、算子庫、編譯器決定了它是否真的能被用起來。一款全新AI芯片就算峰值算力做到全球第一如果TensorFlow/PyTorch模型導(dǎo)進(jìn)去有一堆算子無法編譯團(tuán)隊(duì)照樣不會選它。云端GPU生態(tài)之所以強(qiáng)大恰恰是CUDA二十年積累的算子庫和開發(fā)工具的深厚沉淀這是留給新NPU最重要的生態(tài)門檻。我在一個(gè)邊緣端項(xiàng)目里遇到的情況很有代表性選了一款算法團(tuán)隊(duì)認(rèn)為性價(jià)比極高的NPU芯片結(jié)果模型里一個(gè)在高版本PyTorch里非常普通的注意力機(jī)制變體使用了一種非標(biāo)準(zhǔn)的相對位置編碼實(shí)現(xiàn)在該芯片的SDK中沒有對應(yīng)實(shí)現(xiàn)。后續(xù)查算子映射表發(fā)現(xiàn)雖然2D卷積、全連接這些標(biāo)準(zhǔn)算子都有但transformer里常用的reshape和transpose組合在特定數(shù)據(jù)布局下觸發(fā)了一個(gè)未優(yōu)化的路徑性能掉了一個(gè)數(shù)量級。大家只能改網(wǎng)絡(luò)實(shí)現(xiàn)或者等廠商更新工具鏈。芯片算力強(qiáng)但算子不全這種情況在工程上的代價(jià)遠(yuǎn)比多買幾塊GPU大得多——因?yàn)橹匦略O(shè)計(jì)和驗(yàn)證模型的時(shí)間成本是不可接受的。5.2 神經(jīng)網(wǎng)絡(luò)的編譯與圖優(yōu)化為了讓模型從訓(xùn)練框架跑到NPU上軟件棧一般會經(jīng)歷一個(gè)前端對接→圖優(yōu)化→算子映射→指令生成的流水線。前端對接負(fù)責(zé)讀入ONNX、TensorFlow或PyTorch導(dǎo)出的模型格式轉(zhuǎn)換成統(tǒng)一的中間表示。圖優(yōu)化階段做的是算子融合、維度折疊、數(shù)據(jù)布局轉(zhuǎn)換這些事情。算子融合是最直觀的優(yōu)化手段把卷積后面的激活函數(shù)、批量歸一化這些逐元素操作融合進(jìn)卷積本身減少中間結(jié)果的搬運(yùn)和多次啟動的開銷。這類優(yōu)化在做傳統(tǒng)推理優(yōu)化時(shí)RISC風(fēng)格的思路是完全一致的NCNN、MNN這些推理框架在CPU和GPU上都在做同樣的事。算子映射決定了一個(gè)模型算子能不能落到NPU的MAC陣列上。如果算子能直接映射就調(diào)用廠商提供的算子庫如果不能就嘗試將其拆解成多個(gè)簡單算子的組合實(shí)在拆不了只能退回到CPU執(zhí)行。一個(gè)模型里只要有少數(shù)幾個(gè)算子落到CPU上性能就會塌方因?yàn)閿?shù)據(jù)要在NPU和CPU之間來回搬運(yùn)走一次仿存可能比在NPU上跑幾次算子還慢。5.3 量化用精度換速度的經(jīng)典交易NPU能效比高的一大來源是低精度計(jì)算。云端GPU訓(xùn)練常用FP16、BF16甚至FP8而NPU推理主流是INT8端側(cè)LLM更是大量采用INT4/INT8混合精度。量化就是把FP32/FP16的權(quán)重值和激活值用更少的bit來表示。量化按方式分為訓(xùn)練后量化PTQ和量化感知訓(xùn)練QAT。PTQ是最省事的路線直接用一批代表數(shù)據(jù)做校準(zhǔn)統(tǒng)計(jì)激活值的分布算出合適的縮放系數(shù)后就直接把模型轉(zhuǎn)成INT8。QAT則需要在訓(xùn)練階段就模擬量化誤差讓模型通過訓(xùn)練去適應(yīng)低精度表示精度損失通常更小但需要訓(xùn)練資源和流程改造。這里有一個(gè)非常重要的認(rèn)知量化不是簡單的四舍五入而是要在最小化精度損失和最大化計(jì)算效率之間尋找平衡。per-tensor量化給整個(gè)張量一個(gè)縮放系數(shù)實(shí)現(xiàn)簡單但誤差大per-channel量化給每個(gè)通道單獨(dú)一個(gè)系數(shù)精度好但計(jì)算復(fù)雜度略高。具體用哪種取決于模型對數(shù)值范圍的敏感度。我在做過一個(gè)視覺模型時(shí)模型里的某一層對量化特別敏感改用混合精度方案只對這一層保持FP16其余層用INT8最終在精度損失低于0.1%的前提下拿到了數(shù)倍的速度提升。這個(gè)經(jīng)驗(yàn)說明要善用工具提供的profiling信息不要一股腦全員INT8。6. NPU實(shí)戰(zhàn)經(jīng)驗(yàn)部署推理模型時(shí)踩過的坑和調(diào)優(yōu)思路6.1 模型跑不起來的頭號原因算子不支持如果你準(zhǔn)備把一個(gè)PyTorch模型部署到NPU上我先給你一個(gè)心理準(zhǔn)備第一次編譯大概率會報(bào)算子不支持。這幾乎是所有NPU入局團(tuán)隊(duì)都要經(jīng)歷的第一課區(qū)別只是報(bào)錯(cuò)早晚而已。我踩坑最深的一次是一個(gè)目標(biāo)檢測模型前向傳播里用了Torch自帶的torch.topk做候選框挑選。這個(gè)算子在NPU SDK的算子列表里明確標(biāo)記為不支持編譯直接失敗。當(dāng)時(shí)第一個(gè)想法是換一顆硬件支持更好的NPU但重新選型代價(jià)極大。最終解決方式是重構(gòu)后處理邏輯候選框數(shù)量固定用argsort取前K個(gè)替代復(fù)雜的topk動態(tài)邏輯再配合NMS在CPU上做。模型的檢測精度完全沒變但模型終于能完整地跑到NPU上去了。這段經(jīng)歷讓我總結(jié)了一條流程在選型階段就把模型的關(guān)鍵算子列出來逐項(xiàng)比對廠商提供的算子支持列表。重點(diǎn)看三個(gè)地方動態(tài)shape尤其是reshape、slicing這類在編譯期無法確定維度的操作、控制流操作循環(huán)、條件分支、以及各種自定義op。這三個(gè)地方是模型遷移到NPU時(shí)最常出問題的高風(fēng)險(xiǎn)區(qū)。寧可前期多花幾天做算子審計(jì)也不要等模型已經(jīng)跑通CPU版本后在最后一步換硬件。6.2 性能調(diào)優(yōu)的幾個(gè)抓手如果你的模型已經(jīng)能在NPU上正確跑通但速度達(dá)不到預(yù)期我建議按下面的順序排查和調(diào)優(yōu)這個(gè)順序是根據(jù)經(jīng)驗(yàn)教訓(xùn)得出來的每一步都有真實(shí)意義先看數(shù)據(jù)布局。深度學(xué)習(xí)框架里數(shù)據(jù)有NCHW和NHWC兩種排布不同NPU偏好的布局不一樣且對卷積層和全連接層的影響不同。如果布局和硬件不匹配算子可能會觸發(fā)重排操作性能會顯著受損。首選手段是通過編譯器選項(xiàng)指定實(shí)在不行才考慮改模型。再看batch策略。很多NPU在batch較小時(shí)無法打滿計(jì)算陣列。LLM服務(wù)優(yōu)化的關(guān)鍵手段之一就是動態(tài)batch——把多個(gè)并發(fā)請求聚合成一個(gè)大batch同時(shí)處理大幅提升吞吐。如果服務(wù)延遲在可接受范圍內(nèi)盡量讓batch大一些。再看多核調(diào)度。多核NPU產(chǎn)品里模型如何在核之間切分是決定性能的關(guān)鍵。常見切分方式有按通道切分、按空間切分、按batch切分。廠商SDK通常有自動切分能力但自動方案不一定最優(yōu)特別是對不規(guī)則的模型結(jié)構(gòu)。實(shí)測后效果不理想時(shí)就要考慮手動指定切分策略。最后看計(jì)算與數(shù)據(jù)傳輸?shù)牧魉丿B。NPU和CPU異步工作時(shí)數(shù)據(jù)搬運(yùn)可以和計(jì)算并發(fā)進(jìn)行做到邊搬邊算。很多NPU的SDK都提供異步接口、用stream/task隊(duì)列來實(shí)現(xiàn)這一點(diǎn)如果代碼寫成同步式性能會損失一截。這個(gè)優(yōu)化做到位往往能帶來20%~30%的總耗時(shí)下降。6.3 NPU選型時(shí)的現(xiàn)實(shí)問題清單最后結(jié)合近期被反復(fù)提及的怎么統(tǒng)一管理多臺算力服務(wù)器這個(gè)方向給大家一份我在項(xiàng)目里實(shí)際使用的選型和部署檢查清單按重要程度排序算力需求和內(nèi)存帶寬是否匹配。模型多大、權(quán)重多大、片上SRAM多大、片外帶寬多少這幾個(gè)數(shù)先測算不要只看TOPS。內(nèi)存容量夠不夠。《token算力需求評估》提到的LLM場景尤其要算KV Cache占用的顯存跟模型權(quán)重加在一起再乘以并發(fā)數(shù)就是所需內(nèi)存容量的下限。KV Cache的大小是上下文長度的數(shù)倍乘以隱藏層維度和層數(shù)很多項(xiàng)目都在這里栽過跟頭。算子支持列表和模型算子集合做diff。這個(gè)上面講過了提前做別等到最后。軟件工具鏈的迭代速度。SDK活躍度多高、發(fā)布節(jié)奏多快、遇到的問題能不能獲得及時(shí)反饋決定了踩坑之后的存活率。多節(jié)點(diǎn)統(tǒng)一管理方案。多臺算力服務(wù)器管理本質(zhì)上是一個(gè)異構(gòu)調(diào)度問題。如果是同品牌NPU廠商通常提供集群管理平臺如果是混合了不同N卡、不同NPU就需要靠Kubernetes加設(shè)備插件來做統(tǒng)一資源抽象。實(shí)際管理多臺設(shè)備時(shí)的核心訴求是設(shè)備的可觀測性、故障自動轉(zhuǎn)移、作業(yè)的親和性調(diào)度。建議先從這兩個(gè)維度出發(fā)搭建一是選一個(gè)支持異構(gòu)設(shè)備接入的調(diào)度框架把NPU設(shè)備插件化接入二是建立統(tǒng)一的監(jiān)控面板把每臺服務(wù)器的算力利用率、顯存占用、溫度功耗采集上來。沒有監(jiān)控直接上多機(jī)負(fù)載出了問題排查成本會非常高。成本模型。把芯片價(jià)格、整機(jī)功耗、散熱改造成本、部署后的運(yùn)維人力全部算進(jìn)去再和GPU方案做全周期對比。NPU香不香答案一定是你自己算出來的而不是廠商PPT告訴你的。寫到這里基本都是我在多個(gè)NPU相關(guān)項(xiàng)目里用時(shí)間和夜班換來的教訓(xùn)?;叵肫饋碜詈诵牡囊粭l體會是NPU的價(jià)值從來不是一個(gè)芯片的性能參數(shù)而是它周邊那個(gè)完整的軟硬件生態(tài)能否閉環(huán)。你選的不是一個(gè)TOPS數(shù)字而是一整套研發(fā)工作流。只要把算力需求算清楚、算子審計(jì)做在前面、軟件棧驗(yàn)證做徹底NPU在很多場景下完全有能力成為比GPU更務(wù)實(shí)的算力選擇。