算架構(gòu)設(shè)計(jì)挑戰(zhàn):從算力利用率到功能安全的工程實(shí)踐)
1. ADS-NPU 到底在解決什么問題1.1 從一次真實(shí)的架構(gòu)評(píng)審說起去年我參與過一個(gè)車載域控制器的方案評(píng)審會(huì)上有人拋出一個(gè)問題為什么我們用了算力標(biāo)稱 200 TOPS 的 NPU實(shí)際跑感知模型時(shí)有效利用率只有 30% 出頭當(dāng)時(shí)會(huì)議室里安靜了幾秒因?yàn)檫@個(gè)問題戳中了整個(gè)行業(yè)最不愿意公開討論的痛點(diǎn)——標(biāo)稱算力和有效算力之間的鴻溝。ADS-NPUAutonomous Driving System NPU這個(gè)說法嚴(yán)格來講不是某一顆具體芯片的型號(hào)而是指面向自動(dòng)駕駛場景的那一類神經(jīng)網(wǎng)絡(luò)處理單元及其配套計(jì)算架構(gòu)。它和手機(jī)里跑圖像識(shí)別的 NPU、和服務(wù)器里做推理加速的加速卡雖然都叫 NPU但設(shè)計(jì)約束完全不同。自動(dòng)駕駛對(duì) NPU 的要求是確定性延遲、功能安全、多傳感器融合、車規(guī)級(jí)可靠性同時(shí)還要在功耗和散熱極其受限的封裝里塞進(jìn)足夠多的 MAC 陣列。我寫這篇東西的目的很直接把 ADS-NPU 計(jì)算架構(gòu)在實(shí)際產(chǎn)品化過程中遇到的痛點(diǎn)以及架構(gòu)師在設(shè)計(jì)階段就必須提前想清楚的挑戰(zhàn)一條一條拆開講。如果你正在做芯片架構(gòu)定義、算法部署、或者域控選型這里面的每一條大概率你都會(huì)碰到。如果你只是剛接觸 NPU 概念我也會(huì)用生活化的類比把底層邏輯講明白保證你能跟上。1.2 先厘清概念NPU 不是更快的 CPU很多人第一次接觸 NPU會(huì)下意識(shí)把它理解成專門做矩陣乘法的 CPU。這個(gè)理解不算錯(cuò)但會(huì)誤導(dǎo)架構(gòu)設(shè)計(jì)。CPU 的核心是通用控制流它擅長的是分支判斷、循環(huán)、不規(guī)則內(nèi)存訪問NPU 的核心是數(shù)據(jù)流它擅長的是把一大塊數(shù)據(jù)按照固定模式反復(fù)搬運(yùn)和計(jì)算。打個(gè)比方CPU 像一個(gè)經(jīng)驗(yàn)豐富的項(xiàng)目經(jīng)理什么活都能干但一次只能專注處理一件事NPU 像一條流水線一旦開動(dòng)起來吞吐量驚人但你讓它臨時(shí)改個(gè)工序它就得停下來重新配置。ADS-NPU 的痛點(diǎn)本質(zhì)上都源于流水線這個(gè)特性——流水線怕停頓、怕數(shù)據(jù)供不上、怕工序切換太頻繁。自動(dòng)駕駛感知任務(wù)恰恰是工序切換頻繁的典型BEV 感知、Occupancy 網(wǎng)絡(luò)、多模態(tài)融合、時(shí)序?qū)R每個(gè)任務(wù)的算子組合都不一樣。這就埋下了后面要講的第一個(gè)大坑。1.3 為什么這個(gè)話題現(xiàn)在特別值得聊從熱搜詞能看出來大家關(guān)注的芯片話題跨度極大從 STM32 這種 MCU 到 RK3588 這種應(yīng)用處理器從 TP4056 充電芯片到交換機(jī)芯片說明整個(gè)行業(yè)處在人人都要懂點(diǎn)芯片的階段。而 NPU 相關(guān)的搜索詞里出現(xiàn)了npu 架構(gòu)olama start 指定 intel npurf-detr npu這些說明 NPU 已經(jīng)從實(shí)驗(yàn)室走向了實(shí)際部署。ADS-NPU 的特殊性在于它站在算力、功耗、安全、成本四重約束的交匯點(diǎn)上。消費(fèi)級(jí) NPU 可以為了峰值算力犧牲確定性服務(wù)器 NPU 可以為了吞吐犧牲功耗但 ADS-NPU 哪一頭都不能松。這種全都要的處境才是設(shè)計(jì)挑戰(zhàn)的真正來源。2. 算力標(biāo)稱值與有效利用率之間的鴻溝2.1 峰值算力是怎么算出來的又為什么跑不滿先講清楚峰值算力這個(gè)數(shù)字怎么來的。一顆 NPU 的峰值算力大致等于MAC 陣列數(shù)量 × 單 MAC 每周期操作數(shù) × 工作頻率 × 2乘加各算一次。比如一個(gè) 4096 個(gè) MAC 的陣列跑在 1GHz支持 INT8那峰值就是 4096 × 1G × 2 8 TOPS。這個(gè)數(shù)字是理論天花板前提是每個(gè)周期每個(gè) MAC 都在干活。現(xiàn)實(shí)中要滿足這個(gè)前提需要數(shù)據(jù)源源不斷喂進(jìn)來、算子形狀完美匹配陣列、沒有流水線氣泡、沒有訪存沖突。這四條里能同時(shí)滿足兩條就算不錯(cuò)了。我實(shí)測過的一個(gè)案例某 NPU 標(biāo)稱 128 TOPS跑一個(gè)典型的 BEV 感知模型實(shí)測有效算力只有 38 TOPS利用率 29.7%。拆解下來損失分布大概是這樣的損失來源占比具體原因算子形狀不匹配約 35%卷積核尺寸與陣列維度不對(duì)齊產(chǎn)生大量 padding 空轉(zhuǎn)訪存帶寬瓶頸約 25%權(quán)重和激活值搬運(yùn)速度跟不上計(jì)算速度流水線切換開銷約 20%不同算子之間切換需要重新配置產(chǎn)生氣泡量化精度損失補(bǔ)償約 10%為保精度插入的反量化/校準(zhǔn)操作其他調(diào)度、同步約 10%多核協(xié)同、任務(wù)依賴等待這張表是我根據(jù)多個(gè)項(xiàng)目實(shí)測數(shù)據(jù)歸納的不同模型會(huì)有浮動(dòng)但量級(jí)上很有參考價(jià)值。架構(gòu)設(shè)計(jì)時(shí)如果按峰值算力做預(yù)算最后一定會(huì)翻車。2.2 算子形狀不匹配最隱蔽的算力殺手卷積神經(jīng)網(wǎng)絡(luò)里卷積核尺寸五花八門3×3、5×5、7×7、1×1還有各種空洞卷積、分組卷積。NPU 的 MAC 陣列通常是規(guī)整的二維或三維結(jié)構(gòu)比如 64×64 或者 128×32。當(dāng)卷積核尺寸和陣列維度對(duì)不齊時(shí)硬件只能靠 padding 補(bǔ)齊補(bǔ)出來的位置算的是零純屬浪費(fèi)。舉個(gè)具體例子一個(gè) 3×3 卷積如果陣列是 64×64那一次能并行處理多少個(gè)輸出通道理論上 64 個(gè)輸出通道 × 64 個(gè)輸入通道的乘加但 3×3 的卷積核只有 9 個(gè)權(quán)重映射到 64 寬的維度上利用率只有 9/64 ≈ 14%。當(dāng)然實(shí)際實(shí)現(xiàn)會(huì)用 im2col 把卷積展開成矩陣乘但展開本身有開銷而且展開后的矩陣維度也未必對(duì)齊。提示做架構(gòu)評(píng)估時(shí)不要只看 NPU 的峰值算力一定要拿目標(biāo)模型的實(shí)際算子清單去跑一遍映射分析。很多廠商提供的模型支持列表只保證能跑通不保證跑得快。2.3 訪存帶寬被低估的真正瓶頸行業(yè)里有個(gè)說法NPU 的算力是買來的帶寬是求來的。意思是算力可以堆 MAC 陣列但帶寬受限于內(nèi)存工藝、封裝、功耗很難無限堆。算一筆賬一個(gè) INT8 的 MAC 操作需要讀取 2 個(gè) 8bit 操作數(shù)寫出 1 個(gè) 8bit 結(jié)果或者累加到 32bit。如果陣列是 4096 MAC跑 1GHz那每秒鐘需要的數(shù)據(jù)吞吐是 4096 × 1G × 2 × 1Byte 8 TB/s。這個(gè)數(shù)字遠(yuǎn)超當(dāng)前任何車載內(nèi)存方案的帶寬。所以 NPU 必須靠片上緩存和權(quán)重復(fù)用來降低對(duì)片外帶寬的需求。這就是為什么 NPU 架構(gòu)里片上 SRAM 的容量和層次結(jié)構(gòu)設(shè)計(jì)比 MAC 陣列數(shù)量更考驗(yàn)架構(gòu)師。SRAM 太小權(quán)重反復(fù)從 DRAM 搬帶寬爆炸SRAM 太大面積和功耗失控成本下不來。這個(gè)平衡點(diǎn)怎么找是 ADS-NPU 設(shè)計(jì)的核心難題之一。2.4 流水線氣泡切換任務(wù)的隱形代價(jià)前面說過 NPU 像流水線。流水線最怕的就是換工序。自動(dòng)駕駛感知任務(wù)里算子切換極其頻繁卷積 → BN → 激活 → 池化 → 卷積……每切換一次流水線就要排空再填充這期間 MAC 陣列是閑置的。更麻煩的是多任務(wù)場景。ADS 芯片通常要同時(shí)跑感知、預(yù)測、規(guī)劃多個(gè)網(wǎng)絡(luò)如果這些網(wǎng)絡(luò)共享 NPU 資源任務(wù)切換的開銷會(huì)成倍放大。我見過一個(gè)方案為了省面積只放了一個(gè)大 NPU 核結(jié)果多任務(wù)調(diào)度時(shí)利用率掉到 20% 以下最后不得不改成多個(gè)小核 硬件調(diào)度器。3. 功能安全與確定性的硬約束3.1 為什么 ADS-NPU 不能盡力而為消費(fèi)級(jí) NPU 的設(shè)計(jì)哲學(xué)是盡力而為這一幀慢一點(diǎn)沒關(guān)系下一幀補(bǔ)回來用戶感知不到。但自動(dòng)駕駛不行。感知延遲必須是確定的因?yàn)閯x車距離是按毫秒算的。如果 NPU 偶爾因?yàn)榫彺嫖疵谢蛘哒{(diào)度抖動(dòng)多花了 20ms這 20ms 在高速上就是好幾米的制動(dòng)距離差。這就引出了 ADS-NPU 和普通 NPU 最本質(zhì)的區(qū)別確定性優(yōu)先于平均性能。一顆平均延遲 10ms 但抖動(dòng) ±5ms 的 NPU在 ADS 場景里不如一顆平均延遲 15ms 但抖動(dòng) ±0.5ms 的 NPU。因?yàn)榍罢吣銢]法做安全論證后者可以。3.2 確定性延遲的架構(gòu)代價(jià)要做到確定性延遲架構(gòu)上要付出很多代價(jià)禁用或限制動(dòng)態(tài)緩存動(dòng)態(tài)緩存命中率不可預(yù)測延遲抖動(dòng)大。ADS-NPU 通常用 scratchpad memory軟件管理的片上內(nèi)存替代 cache由編譯器靜態(tài)分配地址延遲完全可預(yù)測。靜態(tài)調(diào)度任務(wù)在編譯期就排好執(zhí)行順序和資源分配運(yùn)行期不做動(dòng)態(tài)調(diào)度。這犧牲了靈活性換來了確定性。冗余與鎖步功能安全要求 ASIL-D 級(jí)別時(shí)關(guān)鍵計(jì)算路徑可能需要雙核鎖步lockstep兩個(gè)核跑同樣的指令比對(duì)結(jié)果。這直接讓面積翻倍。ECC 全覆蓋所有 SRAM 和關(guān)鍵寄存器都要帶 ECC防止宇宙射線等原因?qū)е碌奈环D(zhuǎn)。這會(huì)增加面積和訪問延遲。這些措施疊加起來ADS-NPU 的有效算力密度每平方毫米每瓦的可用算力通常只有消費(fèi)級(jí) NPU 的一半甚至更低。這是沒辦法的事安全是要花錢買的。3.3 安全機(jī)制本身的開銷怎么算我參與過一個(gè) ASIL-B 級(jí)別的域控項(xiàng)目做過詳細(xì)的對(duì)比測算。同一套感知模型在非安全 NPU 上跑需要 8ms在加了鎖步和 ECC 的安全 NPU 上跑需要 14ms性能損失 75%。這還沒算上安全監(jiān)控邏輯比如看門狗、超時(shí)檢測、結(jié)果校驗(yàn)的額外開銷。所以架構(gòu)定義階段安全等級(jí)和性能預(yù)算必須一起定。不能先定性能目標(biāo)再往上加安全機(jī)制那樣一定超標(biāo)。正確的做法是先明確 ASIL 等級(jí)確定必須的安全機(jī)制算出這些機(jī)制的固定開銷剩下的才是可用性能預(yù)算。注意功能安全認(rèn)證不是做完設(shè)計(jì)再補(bǔ)文檔而是從架構(gòu)定義階段就要介入。安全機(jī)制如果后期硬加往往要推翻整個(gè)數(shù)據(jù)通路設(shè)計(jì)。3.4 確定性對(duì)編譯器提出的苛刻要求靜態(tài)調(diào)度意味著編譯器要承擔(dān)巨大的責(zé)任。它需要在編譯期完成算子融合、內(nèi)存分配、流水線編排、多核任務(wù)劃分。這些在動(dòng)態(tài)調(diào)度系統(tǒng)里是運(yùn)行期做的編譯器可以偷懶但 ADS-NPU 的編譯器不行。我見過的最頭疼的問題之一是編譯器對(duì)某個(gè)算子的內(nèi)存分配估算偏小導(dǎo)致運(yùn)行期溢出。在動(dòng)態(tài)系統(tǒng)里這頂多是性能下降在靜態(tài)系統(tǒng)里直接是功能錯(cuò)誤。所以 ADS-NPU 的編譯器工具鏈成熟度往往比硬件本身更決定項(xiàng)目成敗。選型時(shí)一定要問清楚編譯器對(duì)目標(biāo)模型的支持是能跑通還是能跑好有沒有靜態(tài)內(nèi)存分析報(bào)告。4. 多傳感器融合帶來的數(shù)據(jù)流挑戰(zhàn)4.1 多路輸入的帶寬疊加效應(yīng)自動(dòng)駕駛不是只處理攝像頭。典型配置是多路攝像頭 激光雷達(dá) 毫米波雷達(dá) 超聲波。這些傳感器的數(shù)據(jù)都要進(jìn) NPU 做融合。攝像頭數(shù)據(jù)量大但結(jié)構(gòu)化激光雷達(dá)是稀疏點(diǎn)云毫米波雷達(dá)是極坐標(biāo)下的稀疏目標(biāo)列表。問題在于這些數(shù)據(jù)流的速率和時(shí)序特性完全不同。攝像頭是固定幀率激光雷達(dá)是旋轉(zhuǎn)掃描每圈內(nèi)不同角度的數(shù)據(jù)到達(dá)時(shí)間不同毫米波雷達(dá)是事件觸發(fā)。NPU 要同時(shí)處理這些異構(gòu)數(shù)據(jù)流對(duì)片上網(wǎng)絡(luò)的帶寬分配和仲裁提出了極高要求。我算過一筆賬8 路 800 萬像素?cái)z像頭每路 30fpsRAW 數(shù)據(jù)每幀約 12MB總帶寬需求是 8 × 12MB × 30 2.88 GB/s這還只是原始數(shù)據(jù)。經(jīng)過 ISP 處理后數(shù)據(jù)量更大。再加上激光雷達(dá)每秒幾十萬到上百萬個(gè)點(diǎn)每個(gè)點(diǎn)包含坐標(biāo)和反射率又是幾百 MB/s。這些數(shù)據(jù)如果都要經(jīng)過 NPU 的片上網(wǎng)絡(luò)帶寬壓力可想而知。4.2 時(shí)序?qū)R比算力更難的軟件問題多傳感器融合最難的其實(shí)不是算力是時(shí)序?qū)R。不同傳感器的采樣時(shí)刻不同數(shù)據(jù)到達(dá) NPU 的時(shí)刻也不同。要做融合必須先把它們對(duì)齊到同一個(gè)時(shí)間基準(zhǔn)上。這涉及到時(shí)間戳同步硬件同步信號(hào)還是軟件打時(shí)間戳、運(yùn)動(dòng)補(bǔ)償車輛在動(dòng)不同時(shí)刻的數(shù)據(jù)要補(bǔ)償?shù)酵蛔鴺?biāo)系、插值和外推。這些操作有的在 NPU 上做有的在 CPU 或?qū)S媚K上做。如果架構(gòu)劃分不合理數(shù)據(jù)在 NPU 和 CPU 之間來回搬帶寬和延遲都會(huì)爆炸。我的經(jīng)驗(yàn)是時(shí)序?qū)R盡量前置到數(shù)據(jù)進(jìn)入 NPU 之前用專用的預(yù)處理模塊或者 DMA 引擎做不要讓 NPU 去干這種不規(guī)則的計(jì)算。NPU 應(yīng)該專注于它擅長的規(guī)整矩陣運(yùn)算。4.3 片上網(wǎng)絡(luò)設(shè)計(jì)被忽視的關(guān)鍵環(huán)節(jié)片上網(wǎng)絡(luò)NoC是連接 NPU 各個(gè)模塊MAC 陣列、SRAM、DMA、外設(shè)接口的高速公路。ADS-NPU 的 NoC 設(shè)計(jì)難度遠(yuǎn)高于普通 SoC因?yàn)閿?shù)據(jù)流種類多QoS 要求不同攝像頭數(shù)據(jù)不能丟幀雷達(dá)數(shù)據(jù)可以容忍一定丟包帶寬需求高且動(dòng)態(tài)變化要支持功能安全的隔離要求不同安全等級(jí)的數(shù)據(jù)流要物理或邏輯隔離我見過一個(gè)失敗案例NoC 帶寬分配策略沒做好激光雷達(dá)的大突發(fā)數(shù)據(jù)把攝像頭數(shù)據(jù)流擠占了導(dǎo)致感知幀率抖動(dòng)。后來在 NoC 里加了基于優(yōu)先級(jí)的仲裁和帶寬預(yù)留才解決。這個(gè)教訓(xùn)說明NoC 不是連起來就行它需要和上層數(shù)據(jù)流特性一起設(shè)計(jì)。4.4 數(shù)據(jù)復(fù)用與局部性優(yōu)化多傳感器融合其實(shí)有個(gè)好處不同模態(tài)的數(shù)據(jù)可以互相補(bǔ)充某些中間結(jié)果可以復(fù)用。比如 BEV 特征圖攝像頭分支和激光雷達(dá)分支可能都要用。如果架構(gòu)支持在片上緩存這些共享特征就能省下大量片外帶寬。但這要求 NPU 的片上內(nèi)存管理足夠靈活能支持不同任務(wù)之間的數(shù)據(jù)共享。靜態(tài)分配的 scratchpad 在這方面反而不如動(dòng)態(tài)緩存靈活。所以這里又有一個(gè)權(quán)衡確定性和數(shù)據(jù)復(fù)用效率之間的權(quán)衡。我的建議是對(duì)時(shí)間關(guān)鍵路徑用靜態(tài)分配保確定性對(duì)非關(guān)鍵路徑用動(dòng)態(tài)分配提效率混合管理。5. 功耗、散熱與車規(guī)可靠性的三重?cái)D壓5.1 功耗預(yù)算從芯片到系統(tǒng)的傳導(dǎo)ADS-NPU 的功耗預(yù)算不是芯片自己說了算的是從整車倒推下來的。一輛電動(dòng)車的熱管理預(yù)算有限域控制器通常分到幾十瓦。這幾十瓦要分給 SoC、內(nèi)存、電源、接口留給 NPU 的可能就十幾瓦。十幾瓦能跑多少算力這取決于能效比。當(dāng)前先進(jìn)工藝下INT8 的能效比大概在 2-5 TOPS/W。也就是說15W 的 NPU 大概能提供 30-75 TOPS 的峰值算力。注意這是峰值實(shí)際有效算力按前面說的 30% 利用率算只有 10-22 TOPS 的有效算力。這個(gè)數(shù)字夠不夠跑 BEV Occupancy坦白說很緊張。所以 ADS-NPU 的架構(gòu)設(shè)計(jì)能效比是比峰值算力更重要的指標(biāo)。堆 MAC 陣列誰都會(huì)難的是在給定功耗下把有效算力做上去。5.2 散熱封裝和工藝的約束功耗最終要變成熱。車規(guī)芯片的結(jié)溫上限通常是 125°C 或 150°C環(huán)境溫度可能高達(dá) 85°C 甚至更高發(fā)動(dòng)機(jī)艙附近。這意味著芯片的散熱余量很小。散熱約束反過來限制架構(gòu)選擇高頻設(shè)計(jì)散熱難所以 ADS-NPU 通常走大面積、低頻率路線用更多并行單元換低頻率。但大面積又帶來成本問題而且大芯片的良率低。這是一個(gè)連環(huán)約束。我參與過一個(gè)項(xiàng)目最初架構(gòu)定義時(shí)按 1.5GHz 頻率做預(yù)算后來散熱仿真發(fā)現(xiàn)結(jié)溫超標(biāo)被迫降到 1.0GHz算力直接砍掉三分之一整個(gè)性能預(yù)算重做。教訓(xùn)是架構(gòu)定義階段就要做熱仿真不能等流片后才發(fā)現(xiàn)。5.3 車規(guī)可靠性AEC-Q100 與壽命要求車規(guī)芯片要過 AEC-Q100 認(rèn)證工作溫度范圍、壽命、失效率都有嚴(yán)格要求。ADS-NPU 作為高復(fù)雜度芯片過認(rèn)證的難度更大因?yàn)榫w管數(shù)量多任何一個(gè)薄弱環(huán)節(jié)都可能導(dǎo)致失效??煽啃栽O(shè)計(jì)包括老化補(bǔ)償芯片用久了性能會(huì)漂移要有補(bǔ)償機(jī)制、電壓頻率裕量不能工作在臨界點(diǎn)、ESD 防護(hù)、閂鎖防護(hù)等。這些都會(huì)占用面積和功耗預(yù)算。5.4 能效優(yōu)化的架構(gòu)手段在功耗約束下提升有效算力架構(gòu)上有幾個(gè)方向稀疏化支持神經(jīng)網(wǎng)絡(luò)剪枝后有很多零權(quán)重硬件如果能跳過零就能省算力和功耗。但稀疏化的硬件支持很復(fù)雜需要專門的索引和調(diào)度邏輯。低位寬量化INT8 比 FP16 省一半以上功耗INT4 更省。但低位寬對(duì)精度影響大需要量化感知訓(xùn)練配合。近存計(jì)算把計(jì)算單元放到內(nèi)存旁邊減少數(shù)據(jù)搬運(yùn)功耗。數(shù)據(jù)搬運(yùn)的功耗往往比計(jì)算本身還高。動(dòng)態(tài)電壓頻率調(diào)節(jié)DVFS根據(jù)負(fù)載調(diào)整電壓頻率但 ADS 場景下 DVFS 會(huì)影響確定性要謹(jǐn)慎使用。這些手段各有代價(jià)架構(gòu)師要根據(jù)目標(biāo)場景選擇組合。沒有銀彈。6. 軟硬件協(xié)同設(shè)計(jì)中的現(xiàn)實(shí)困境6.1 算法迭代速度 vs 芯片開發(fā)周期這是行業(yè)最根本的矛盾之一。AI 算法半年一代芯片開發(fā)周期兩到三年。芯片定義時(shí)瞄準(zhǔn)的算法流片時(shí)可能已經(jīng)過時(shí)了。應(yīng)對(duì)這個(gè)矛盾架構(gòu)上要留可編程性。純硬化的加速器性能好但靈活性差純可編程的處理器靈活但效率低。ADS-NPU 通常走中間路線核心算子硬化邊緣算子可編程。但哪些硬化、哪些可編程這個(gè)劃分本身就是賭博。我的經(jīng)驗(yàn)是硬化那些數(shù)學(xué)上穩(wěn)定、短期內(nèi)不會(huì)變的算子比如標(biāo)準(zhǔn)卷積、矩陣乘可編程留給那些快速演化的部分比如各種注意力機(jī)制變體、新的激活函數(shù)。同時(shí)可編程部分的效率不能太低否則會(huì)成為瓶頸。6.2 編譯器成熟度決定實(shí)際可用性前面提過編譯器的重要性這里再展開。一個(gè) NPU 的紙面算力再高如果編譯器不能高效地把模型映射上去實(shí)際性能就是廢的。評(píng)估編譯器成熟度我通??磶讉€(gè)指標(biāo)支持算子的覆蓋率、算子融合的激進(jìn)程度、內(nèi)存分配的合理性、生成代碼的質(zhì)量、調(diào)試工具的完善度。最直接的辦法是拿自己的模型去跑看實(shí)測性能和理論峰值的差距。提示選型時(shí)不要只看廠商的 benchmark那些都是精心調(diào)優(yōu)過的。一定要拿自己的模型、自己的數(shù)據(jù)去實(shí)測而且要在目標(biāo)硬件上測不能只看仿真結(jié)果。6.3 工具鏈碎片化與遷移成本不同 NPU 廠商的工具鏈互不兼容模型從一個(gè)平臺(tái)遷移到另一個(gè)平臺(tái)往往要重寫大量代碼。這導(dǎo)致車企被單一供應(yīng)商綁定議價(jià)能力弱。行業(yè)在推一些中間表示標(biāo)準(zhǔn)比如 ONNX但實(shí)際落地效果有限因?yàn)楦骷?NPU 的專有優(yōu)化太多標(biāo)準(zhǔn)表示無法覆蓋。這個(gè)問題的解決需要整個(gè)生態(tài)的努力短期內(nèi)難以根治。對(duì)架構(gòu)師來說能做的是盡量把模型開發(fā)和硬件部署解耦用統(tǒng)一的訓(xùn)練框架部署時(shí)再轉(zhuǎn)換。同時(shí)在架構(gòu)里預(yù)留一定的通用性不要過度依賴某個(gè)專有特性。6.4 從原型到量產(chǎn)的工程化落差實(shí)驗(yàn)室里跑通的方案到量產(chǎn)還有巨大落差。量產(chǎn)要考慮一致性每顆芯片性能有差異、可測試性產(chǎn)線怎么測、可維護(hù)性出問題怎么診斷、供應(yīng)鏈關(guān)鍵 IP 的供應(yīng)穩(wěn)定性。我見過太多實(shí)驗(yàn)室性能驚艷、量產(chǎn)一塌糊涂的案例。根源往往是原型階段只關(guān)注峰值性能忽略了工程化約束。架構(gòu)定義時(shí)就要把量產(chǎn)因素考慮進(jìn)去比如預(yù)留測試接口、設(shè)計(jì)診斷寄存器、保證性能的一致性范圍。7. 一些實(shí)操層面的經(jīng)驗(yàn)與建議7.1 架構(gòu)評(píng)估階段必須問的問題如果你正在做 ADS-NPU 的選型或架構(gòu)定義下面這些問題建議逐條確認(rèn)目標(biāo)模型的實(shí)際算子清單是什么NPU 對(duì)每個(gè)算子的支持效率如何有效算力利用率在目標(biāo)模型上實(shí)測是多少不是峰值是實(shí)測。延遲的確定性如何抖動(dòng)范圍多大有沒有靜態(tài)調(diào)度支持功能安全等級(jí)是什么安全機(jī)制的開銷有多大編譯器成熟度如何支持算子覆蓋率多少內(nèi)存分配是否可預(yù)測功耗和散熱預(yù)算是否經(jīng)過仿真驗(yàn)證多傳感器數(shù)據(jù)流的帶寬和 QoS 如何保證量產(chǎn)的一致性、可測試性、可維護(hù)性如何這些問題問下來基本能篩掉一批紙面參數(shù)好看、實(shí)際不能用的方案。7.2 常見的認(rèn)知誤區(qū)誤區(qū)一算力越大越好。前面反復(fù)說了有效算力才是關(guān)鍵。100 TOPS 用不起來不如 50 TOPS 用滿。誤區(qū)二功能安全就是加冗余。冗余只是手段之一更重要的是整個(gè)設(shè)計(jì)流程的安全文化從需求到驗(yàn)證的全鏈條。誤區(qū)三軟件可以彌補(bǔ)硬件缺陷。軟件能優(yōu)化但彌補(bǔ)不了架構(gòu)級(jí)的缺陷。如果數(shù)據(jù)通路設(shè)計(jì)不合理軟件再怎么調(diào)也救不回來。誤區(qū)四先做硬件再想軟件。軟硬件必須協(xié)同設(shè)計(jì)硬件定義階段軟件團(tuán)隊(duì)就要介入否則做出來的硬件軟件用不好。7.3 給不同角色的建議給架構(gòu)師多和算法團(tuán)隊(duì)、軟件團(tuán)隊(duì)泡在一起理解他們的真實(shí)需求不要閉門造車。架構(gòu)決策的影響是長期的一個(gè)錯(cuò)誤決策可能讓后面幾年都在填坑。給算法工程師了解硬件特性設(shè)計(jì)模型時(shí)考慮硬件友好性。同樣的精度硬件友好的模型能快好幾倍。給選型決策者不要被參數(shù)表迷惑一定要實(shí)測。多問幾個(gè)為什么多要幾個(gè)真實(shí)案例。給剛?cè)胄械呐笥堰@個(gè)領(lǐng)域知識(shí)密度高但不要怕。從理解一個(gè)具體算子怎么在硬件上執(zhí)行開始慢慢建立全局觀。芯片架構(gòu)沒有那么神秘本質(zhì)是在各種約束下做權(quán)衡。7.4 后續(xù)可以深入的方向這個(gè)話題往下還有很多可以展開的比如具體某類 NPU 架構(gòu)脈動(dòng)陣列、存內(nèi)計(jì)算的細(xì)節(jié)對(duì)比比如量化技術(shù)對(duì)精度和性能的影響比如多核 NPU 的任務(wù)調(diào)度算法。每一個(gè)都值得單獨(dú)寫一篇。我自己在實(shí)際項(xiàng)目里踩過的坑很多都源于對(duì)某個(gè)環(huán)節(jié)理解不夠深。比如曾經(jīng)低估了 NoC 仲裁對(duì)延遲抖動(dòng)的影響比如曾經(jīng)以為編譯器能自動(dòng)搞定內(nèi)存分配。這些教訓(xùn)讓我明白ADS-NPU 的架構(gòu)設(shè)計(jì)沒有捷徑每一個(gè)環(huán)節(jié)都要扎扎實(shí)實(shí)搞清楚。如果你也在做類似的事情歡迎交流。這個(gè)領(lǐng)域變化快但底層邏輯是相通的在約束下做權(quán)衡在權(quán)衡中找最優(yōu)解。想清楚約束是什么權(quán)衡的代價(jià)是什么很多問題就迎刃而解了。