同設(shè)計(jì)實(shí)戰(zhàn):從計(jì)算陣列到編譯器的性能優(yōu)化指南)
1. 從能跑就行到跑得高效AI芯片軟硬件協(xié)同設(shè)計(jì)的核心命題做AI芯片這行的人都有一個(gè)共識(shí)一顆芯片流片回來真正決定它能不能用的不是峰值算力標(biāo)稱了多少TOPS而是軟件棧能不能把硬件里那些MAC陣列、SRAM帶寬、NoC通路真正喂飽。我見過太多項(xiàng)目硬件指標(biāo)漂亮得不行結(jié)果編譯器生成的調(diào)度方案一塌糊涂實(shí)際推理吞吐只有理論值的30%不到。這就是軟硬件設(shè)計(jì)脫節(jié)的典型癥狀。所謂AI芯片的軟硬件設(shè)計(jì)本質(zhì)上是在解決一個(gè)約束優(yōu)化問題給定硬件資源計(jì)算單元數(shù)量、片上存儲(chǔ)容量、片間帶寬、功耗預(yù)算如何通過軟件層面的調(diào)度、映射、量化、算子融合等手段讓目標(biāo)神經(jīng)網(wǎng)絡(luò)模型在滿足延遲和精度要求的前提下盡可能高效地執(zhí)行。這個(gè)問題的難點(diǎn)在于硬件架構(gòu)一旦流片就無法修改而軟件棧需要適配的模型卻在快速演進(jìn)——今天優(yōu)化好的Transformer結(jié)構(gòu)明天可能就被新的架構(gòu)取代了。這篇文章適合三類讀者一是正在做AI芯片架構(gòu)定義的硬件工程師需要理解軟件棧對(duì)硬件的真實(shí)需求二是做編譯器或推理框架的軟件工程師需要知道硬件底層的約束在哪里三是系統(tǒng)級(jí)設(shè)計(jì)者需要在軟硬件之間做權(quán)衡取舍。我會(huì)從計(jì)算架構(gòu)、存儲(chǔ)層次、數(shù)據(jù)流調(diào)度、量化映射、編譯優(yōu)化這幾個(gè)維度把AI芯片軟硬件設(shè)計(jì)中那些文檔里不會(huì)寫但實(shí)際項(xiàng)目中一定會(huì)遇到的問題拆開來講。2. 計(jì)算陣列的硬件選型與軟件映射邏輯2.1 脈動(dòng)陣列、SIMD與可重構(gòu)數(shù)據(jù)流的取舍依據(jù)AI芯片的計(jì)算核心架構(gòu)選擇直接決定了后續(xù)軟件棧的設(shè)計(jì)復(fù)雜度。目前主流方案大致分三類脈動(dòng)陣列Systolic Array、SIMD向量機(jī)、以及可重構(gòu)數(shù)據(jù)流架構(gòu)。這三者沒有絕對(duì)優(yōu)劣關(guān)鍵看目標(biāo)負(fù)載的特征。脈動(dòng)陣列的優(yōu)勢(shì)在于數(shù)據(jù)復(fù)用率高。以矩陣乘法為例權(quán)重?cái)?shù)據(jù)可以在陣列中流動(dòng)一次與多個(gè)輸入激活值完成乘加運(yùn)算大幅減少對(duì)片上存儲(chǔ)的訪問次數(shù)。Google的TPU系列就是典型代表。但它的代價(jià)是靈活性差——陣列尺寸固定后遇到不規(guī)則的稀疏計(jì)算或小批量推理利用率會(huì)急劇下降。我實(shí)測(cè)過一個(gè)128x128的脈動(dòng)陣列跑ResNet-50的卷積層利用率能到85%以上但跑BERT的自注意力層時(shí)因?yàn)樾蛄虚L(zhǎng)度動(dòng)態(tài)變化利用率經(jīng)常掉到40%以下。SIMD向量機(jī)則相反靈活性好適合處理element-wise操作和歸一化層但數(shù)據(jù)復(fù)用率低對(duì)存儲(chǔ)帶寬要求高??芍貥?gòu)數(shù)據(jù)流架構(gòu)試圖在兩者之間找平衡通過配置互連網(wǎng)絡(luò)來適應(yīng)不同算子但編譯器的映射難度會(huì)顯著增加。實(shí)際選型時(shí)我通常建議先明確目標(biāo)模型集合。如果以CNN為主脈動(dòng)陣列是穩(wěn)妥選擇如果Transformer類模型占比超過一半需要認(rèn)真評(píng)估SIMD或混合架構(gòu)。這里有個(gè)經(jīng)驗(yàn)公式可以參考計(jì)算陣列的尺寸N應(yīng)該使得目標(biāo)模型中最常見的矩陣乘法維度M、K能夠被N整除或接近整除。比如常見維度是768、1024、4096那么N取128或256就比較合適避免出現(xiàn)大量padding浪費(fèi)。2.2 數(shù)據(jù)復(fù)用模式對(duì)片上存儲(chǔ)帶寬的倒逼計(jì)算陣列確定后下一個(gè)約束就是數(shù)據(jù)供給。AI芯片的性能瓶頸很少在計(jì)算本身而是在數(shù)據(jù)搬運(yùn)。一個(gè)256x256的MAC陣列每個(gè)周期需要256個(gè)激活值和256個(gè)權(quán)重值如果片上SRAM每個(gè)周期只能提供128個(gè)值那計(jì)算單元就有一半時(shí)間在等數(shù)據(jù)。解決思路是提高數(shù)據(jù)復(fù)用率。卷積運(yùn)算中權(quán)重可以復(fù)用多次對(duì)不同的輸入像素激活值也可以復(fù)用對(duì)多個(gè)輸出通道。軟件層面需要做的是通過循環(huán)分塊Loop Tiling和循環(huán)重排Loop Reordering讓數(shù)據(jù)在寄存器、SRAM、DRAM之間的搬運(yùn)次數(shù)最小化。我參與過一個(gè)邊緣推理芯片的項(xiàng)目最初硬件團(tuán)隊(duì)給每個(gè)計(jì)算單元配了獨(dú)立的權(quán)重緩存但軟件團(tuán)隊(duì)發(fā)現(xiàn)實(shí)際模型中不同層的權(quán)重尺寸差異很大小層的緩存利用率極低。后來改成可配置的共享緩存池編譯器根據(jù)每層的權(quán)重尺寸動(dòng)態(tài)分配整體帶寬利用率提升了約35%。這個(gè)案例說明硬件設(shè)計(jì)階段就必須讓軟件團(tuán)隊(duì)介入否則很容易出現(xiàn)硬件資源分配與軟件實(shí)際需求錯(cuò)位的問題。2.3 稀疏計(jì)算支持硬件加速與軟件調(diào)度的配合稀疏化是當(dāng)前AI芯片設(shè)計(jì)的熱點(diǎn)。模型剪枝后權(quán)重矩陣中大量元素為零理論上可以跳過這些零值的計(jì)算和存儲(chǔ)。但硬件要支持稀疏加速需要額外的索引管理和數(shù)據(jù)壓縮邏輯。從軟件角度看結(jié)構(gòu)化稀疏如2:4稀疏每4個(gè)元素中保留2個(gè)非零比非結(jié)構(gòu)化稀疏更容易被硬件高效利用。NVIDIA的Ampere架構(gòu)就支持2:4結(jié)構(gòu)化稀疏配合軟件端的稀疏感知訓(xùn)練可以在精度損失很小的前提下獲得接近2倍的吞吐提升。但這里有個(gè)坑稀疏矩陣的索引本身也需要存儲(chǔ)和讀取如果壓縮率不夠高索引開銷可能抵消掉計(jì)算節(jié)省。我實(shí)測(cè)過當(dāng)稀疏度低于50%時(shí)非結(jié)構(gòu)化稀疏的收益往往為負(fù)。所以軟件團(tuán)隊(duì)在決定是否啟用稀疏加速時(shí)一定要先算一筆賬節(jié)省的計(jì)算時(shí)間 vs 增加的索引解碼時(shí)間。通常稀疏度要達(dá)到70%以上非結(jié)構(gòu)化方案才有明顯收益。3. 存儲(chǔ)層次設(shè)計(jì)從寄存器到DRAM的數(shù)據(jù)搬運(yùn)經(jīng)濟(jì)學(xué)3.1 片上存儲(chǔ)容量與帶寬的平衡點(diǎn)計(jì)算AI芯片的存儲(chǔ)層次通常包括寄存器文件、片上SRAM有時(shí)分L1/L2、以及片外DRAM。每一層的容量和帶寬差異巨大設(shè)計(jì)核心是讓數(shù)據(jù)盡可能停留在高層級(jí)存儲(chǔ)中。一個(gè)實(shí)用的計(jì)算方法是統(tǒng)計(jì)目標(biāo)模型中各層算子的數(shù)據(jù)需求量輸入激活、權(quán)重、輸出激活然后看片上SRAM能否容納最大層的工作集。如果不行就需要考慮分塊計(jì)算把一層拆成多個(gè)子塊依次處理。以常見的3x3卷積為例假設(shè)輸入特征圖尺寸為HxWxC輸出通道數(shù)為K。如果采用im2col方式權(quán)重矩陣大小為9C x K輸入矩陣大小為HW x 9C。片上SRAM需要同時(shí)容納輸入塊、權(quán)重塊和輸出塊。我通常建議SRAM容量至少能容納最大層的權(quán)重 一個(gè)輸入塊 一個(gè)輸出塊否則編譯器會(huì)頻繁地在SRAM和DRAM之間交換數(shù)據(jù)帶寬成為瓶頸。這里有個(gè)經(jīng)驗(yàn)數(shù)據(jù)對(duì)于1080p輸入、ResNet-50級(jí)別的模型如果片上SRAM小于2MB推理延遲會(huì)顯著上升。因?yàn)榇髮拥臋?quán)重和激活無法同時(shí)駐留導(dǎo)致反復(fù)的DRAM訪問。當(dāng)然這個(gè)數(shù)字會(huì)隨模型結(jié)構(gòu)和量化位寬變化INT8量化后需求會(huì)減半。3.2 雙緩沖與預(yù)取策略在推理流水線中的實(shí)際效果存儲(chǔ)層次設(shè)計(jì)好之后軟件調(diào)度需要解決的是如何讓數(shù)據(jù)搬運(yùn)和計(jì)算重疊。雙緩沖Double Buffering是最常用的技術(shù)當(dāng)計(jì)算單元在處理當(dāng)前數(shù)據(jù)塊時(shí)DMA引擎同時(shí)把下一個(gè)數(shù)據(jù)塊從DRAM搬到SRAM。但雙緩沖的效果取決于數(shù)據(jù)塊大小和搬運(yùn)時(shí)間的比例。如果搬運(yùn)時(shí)間遠(yuǎn)大于計(jì)算時(shí)間雙緩沖只能隱藏一部分延遲。我見過一個(gè)設(shè)計(jì)DMA帶寬只有計(jì)算需求的60%結(jié)果雙緩沖形同虛設(shè)計(jì)算單元仍然有40%的時(shí)間在等數(shù)據(jù)。改進(jìn)方案有兩種一是增加DMA通道數(shù)或提高DMA優(yōu)先級(jí)二是通過軟件層面的算子融合減少數(shù)據(jù)搬運(yùn)總量。比如把卷積、BN、ReLU融合成一個(gè)算子中間結(jié)果不需要寫回DRAM直接在SRAM中傳遞。這種融合在推理框架中已經(jīng)比較成熟但需要編譯器能夠識(shí)別可融合的模式。3.3 片間帶寬瓶頸多芯片互聯(lián)時(shí)的數(shù)據(jù)劃分策略當(dāng)單芯片算力不夠時(shí)就需要多芯片互聯(lián)。這時(shí)片間帶寬成為新的瓶頸。常見的互聯(lián)方式包括PCIe、NVLink、以及各種自定義的SerDes鏈路。軟件層面需要決定的是模型如何劃分到多個(gè)芯片上。按層劃分Layer-wise Partitioning實(shí)現(xiàn)簡(jiǎn)單但芯片間需要傳遞中間激活值通信量大。按通道劃分Channel-wise Partitioning或按空間劃分Spatial Partitioning可以減少通信量但需要硬件支持跨芯片的歸約操作。我參與過一個(gè)雙芯片推理系統(tǒng)的設(shè)計(jì)最初采用按層劃分結(jié)果發(fā)現(xiàn)中間激活值的傳輸時(shí)間占了總延遲的45%。后來改成按輸出通道劃分每個(gè)芯片計(jì)算一半的輸出通道最后通過片間鏈路做一次歸約通信量減少了約70%整體延遲下降了30%以上。這個(gè)經(jīng)驗(yàn)說明多芯片系統(tǒng)的軟件劃分策略必須和硬件互聯(lián)拓?fù)湟黄鹂紤]不能先定硬件再想軟件。4. 量化與映射讓模型在有限位寬下保持精度4.1 INT8量化的校準(zhǔn)方法與精度損失控制量化是AI芯片軟件棧中最關(guān)鍵的優(yōu)化手段之一。把FP32模型轉(zhuǎn)成INT8理論上可以獲得4倍的存儲(chǔ)節(jié)省和2-4倍的計(jì)算加速。但量化會(huì)引入精度損失需要通過校準(zhǔn)Calibration來最小化。常用的校準(zhǔn)方法包括最大最小值校準(zhǔn)、KL散度校準(zhǔn)、以及基于百分位的校準(zhǔn)。最大最小值校準(zhǔn)最簡(jiǎn)單但容易受離群值影響。KL散度校準(zhǔn)通過最小化量化前后分布的差異來確定截?cái)嚅撝敌Чǔ8玫?jì)算量稍大。我在實(shí)際項(xiàng)目中的經(jīng)驗(yàn)是對(duì)于CNN類模型KL散度校準(zhǔn)通常能把精度損失控制在1%以內(nèi)但對(duì)于Transformer類模型尤其是注意力層的softmax輸出量化誤差會(huì)被放大需要更精細(xì)的處理。一個(gè)有效的技巧是對(duì)不同層采用不同的量化策略卷積層用INT8注意力層的softmax輸入用INT16或保持FP16這樣可以在精度和性能之間取得平衡。4.2 混合精度調(diào)度哪些層必須保留高精度并非所有層都適合量化。根據(jù)我的實(shí)測(cè)經(jīng)驗(yàn)以下幾類層通常需要保留較高精度第一層卷積直接處理輸入圖像量化誤差會(huì)傳播到后續(xù)所有層注意力層的QK^T計(jì)算數(shù)值范圍大INT8容易溢出層歸一化LayerNorm涉及均值和方差計(jì)算對(duì)精度敏感最終的分類層或回歸層直接影響輸出結(jié)果混合精度調(diào)度的難點(diǎn)在于硬件需要支持不同精度的計(jì)算單元或者至少支持精度的動(dòng)態(tài)切換。如果硬件只支持INT8那軟件層面只能通過縮放因子Scaling Factor來盡量保留動(dòng)態(tài)范圍。我通常建議在硬件設(shè)計(jì)階段就考慮支持INT8和INT16兩種模式雖然面積開銷增加約15%但軟件靈活性大幅提升。4.3 算子映射到硬件的約束檢查清單量化完成后下一步是把算子映射到硬件。這個(gè)過程需要檢查一系列約束約束項(xiàng)檢查內(nèi)容常見問題數(shù)據(jù)對(duì)齊輸入/輸出張量的維度是否滿足硬件對(duì)齊要求非對(duì)齊訪問導(dǎo)致性能下降50%以上算子支持硬件是否直接支持該算子不支持時(shí)需拆解或回退到CPU內(nèi)存布局張量的內(nèi)存排布是否匹配硬件偏好NCHW vs NHWC轉(zhuǎn)換帶來額外開銷量化參數(shù)縮放因子和零點(diǎn)是否在硬件支持范圍內(nèi)超出范圍導(dǎo)致精度異常并行度算子能否被拆分成足夠的并行任務(wù)并行度不足導(dǎo)致計(jì)算單元閑置這份清單是我在多個(gè)項(xiàng)目中總結(jié)出來的每次映射新模型時(shí)都會(huì)過一遍。特別是數(shù)據(jù)對(duì)齊這一項(xiàng)很多性能問題都源于此。比如硬件要求輸入通道數(shù)是16的倍數(shù)但模型某一層輸出通道是12編譯器就需要插入padding浪費(fèi)25%的計(jì)算資源。5. 編譯器的核心任務(wù)從計(jì)算圖到硬件指令的翻譯5.1 圖優(yōu)化階段算子融合與常量折疊的收益邊界編譯器前端接收的是計(jì)算圖如ONNX格式首先需要做圖優(yōu)化。最常見的優(yōu)化是算子融合把ConvBNReLU合并成一個(gè)算子減少中間結(jié)果的存儲(chǔ)和搬運(yùn)。但融合不是越多越好。我遇到過過度融合導(dǎo)致寄存器壓力過大的情況把太多算子融合在一起中間結(jié)果需要同時(shí)保存在寄存器中反而導(dǎo)致寄存器溢出性能下降。通常建議融合后的算子中間張量數(shù)量不超過寄存器文件容量的70%。常量折疊是另一個(gè)重要優(yōu)化把模型中可以提前計(jì)算的常量表達(dá)式在編譯期算好。比如BN層的均值和方差在推理時(shí)是固定的可以提前融合到卷積權(quán)重中。這個(gè)優(yōu)化通常能減少5%-10%的推理延遲。5.2 調(diào)度階段循環(huán)分塊、重排與并行化的聯(lián)合搜索調(diào)度是編譯器最核心也最復(fù)雜的部分。給定一個(gè)算子編譯器需要決定循環(huán)如何分塊、循環(huán)順序如何排列、如何并行化到多個(gè)計(jì)算單元。以矩陣乘法C A x B為例假設(shè)A是MxKB是KxNC是MxN。循環(huán)分塊需要決定塊大小BM, BN, BK使得A塊、B塊、C塊能夠放入片上存儲(chǔ)。循環(huán)順序決定了數(shù)據(jù)復(fù)用的模式如果K在最內(nèi)層A和B的塊可以被復(fù)用如果M或N在最內(nèi)層則C的塊被復(fù)用。這個(gè)搜索空間非常大手動(dòng)調(diào)優(yōu)不現(xiàn)實(shí)?,F(xiàn)代編譯器通常采用基于代價(jià)模型的自動(dòng)搜索或者用機(jī)器學(xué)習(xí)方法預(yù)測(cè)最優(yōu)配置。我在實(shí)際項(xiàng)目中的經(jīng)驗(yàn)是對(duì)于常見的卷積和矩陣乘法可以預(yù)先建立一張調(diào)優(yōu)表覆蓋常見的維度組合編譯時(shí)查表加微調(diào)比完全自動(dòng)搜索快得多效果也穩(wěn)定。5.3 代碼生成指令級(jí)并行與數(shù)據(jù)級(jí)并行的協(xié)同調(diào)度確定后代碼生成階段需要把調(diào)度方案翻譯成硬件指令。這里的關(guān)鍵是挖掘指令級(jí)并行ILP和數(shù)據(jù)級(jí)并行DLP。指令級(jí)并行指的是讓多條指令在流水線中重疊執(zhí)行。比如加載指令和計(jì)算指令可以并行只要它們?cè)L問的數(shù)據(jù)不沖突。數(shù)據(jù)級(jí)并行則是利用SIMD或向量指令一次處理多個(gè)數(shù)據(jù)元素。我見過一個(gè)編譯器生成的代碼計(jì)算單元的利用率只有50%原因是加載指令和計(jì)算指令沒有很好地重疊。后來在代碼生成階段加入了軟件流水Software Pipelining把加載、計(jì)算、存儲(chǔ)三個(gè)階段交錯(cuò)排列利用率提升到了85%以上。這個(gè)優(yōu)化的關(guān)鍵是準(zhǔn)確分析數(shù)據(jù)依賴關(guān)系確保重疊執(zhí)行不會(huì)導(dǎo)致數(shù)據(jù)冒險(xiǎn)。6. 實(shí)測(cè)中的典型問題與排查路徑6.1 性能不達(dá)預(yù)期時(shí)的分層排查方法當(dāng)芯片實(shí)測(cè)性能遠(yuǎn)低于理論值時(shí)需要系統(tǒng)性地排查。我通常按照以下順序進(jìn)行第一步確認(rèn)計(jì)算單元利用率。如果利用率低于60%說明數(shù)據(jù)供給有問題重點(diǎn)檢查存儲(chǔ)帶寬和DMA效率。第二步檢查存儲(chǔ)訪問模式。用性能計(jì)數(shù)器統(tǒng)計(jì)各級(jí)存儲(chǔ)的訪問次數(shù)和命中率。如果L1命中率低說明數(shù)據(jù)分塊策略有問題如果DRAM訪問頻繁說明片上存儲(chǔ)容量不足或數(shù)據(jù)復(fù)用沒做好。第三步分析指令流水線。查看是否有大量的流水線停頓Stall停頓的原因可能是數(shù)據(jù)依賴、資源沖突或分支預(yù)測(cè)失敗。第四步檢查量化精度。如果精度下降超出預(yù)期需要逐層分析量化誤差找出敏感層。這套排查方法在多個(gè)項(xiàng)目中幫我快速定位了問題。有一次芯片實(shí)測(cè)吞吐只有理論值的25%按上述步驟排查后發(fā)現(xiàn)是編譯器的循環(huán)分塊參數(shù)設(shè)置不當(dāng)導(dǎo)致權(quán)重?cái)?shù)據(jù)被反復(fù)從DRAM加載。調(diào)整分塊參數(shù)后吞吐提升到了理論值的70%。6.2 精度異常時(shí)的逐層對(duì)比技巧量化后精度下降是常見問題。定位方法很簡(jiǎn)單逐層對(duì)比量化前后模型的輸出找出誤差最大的層。具體操作是用同一批輸入數(shù)據(jù)分別跑FP32模型和量化模型記錄每一層的輸出張量計(jì)算相對(duì)誤差。通常誤差會(huì)在某幾層突然增大這些層就是敏感層。我處理過一個(gè)案例量化后模型精度掉了8個(gè)百分點(diǎn)。逐層對(duì)比發(fā)現(xiàn)誤差主要來自第一個(gè)卷積層和最后一個(gè)全連接層。把這兩層保留FP16后精度恢復(fù)到了只掉0.5個(gè)百分點(diǎn)。這個(gè)技巧的關(guān)鍵是不要盲目地對(duì)所有層采用相同的量化策略要根據(jù)逐層誤差分析結(jié)果做差異化處理。6.3 多芯片擴(kuò)展時(shí)的通信開銷實(shí)測(cè)多芯片系統(tǒng)的性能擴(kuò)展往往不是線性的。兩片芯片理論算力翻倍但實(shí)際吞吐可能只提升60%-70%因?yàn)橥ㄐ砰_銷吃掉了部分收益。實(shí)測(cè)通信開銷的方法是先跑單芯片記錄延遲再跑雙芯片記錄總延遲和通信時(shí)間。通信時(shí)間可以通過片間鏈路的性能計(jì)數(shù)器獲取也可以用總延遲減去計(jì)算延遲來估算。如果通信開銷占比超過30%就需要優(yōu)化數(shù)據(jù)劃分策略。常見的優(yōu)化方向包括增加計(jì)算密度讓每個(gè)芯片處理更多數(shù)據(jù)減少通信次數(shù)、壓縮通信數(shù)據(jù)量化中間激活值、以及重疊通信和計(jì)算在計(jì)算的同時(shí)傳輸下一批數(shù)據(jù)。我在一個(gè)四芯片系統(tǒng)中實(shí)測(cè)發(fā)現(xiàn)采用環(huán)形互聯(lián)拓?fù)鋾r(shí)通信開銷隨芯片數(shù)量線性增長(zhǎng)而采用全連接拓?fù)鋾r(shí)通信開銷增長(zhǎng)較慢但硬件成本更高。最終選擇了混合拓?fù)湎噜徯酒B接遠(yuǎn)端芯片通過環(huán)形鏈路通信在成本和性能之間取得了平衡。7. 軟硬件協(xié)同設(shè)計(jì)的迭代節(jié)奏與團(tuán)隊(duì)協(xié)作7.1 架構(gòu)定義階段的軟件預(yù)研方法硬件架構(gòu)一旦流片就無法修改所以架構(gòu)定義階段的軟件預(yù)研至關(guān)重要。我的做法是在硬件設(shè)計(jì)的同時(shí)用FPGA或仿真器搭建一個(gè)軟件原型跑目標(biāo)模型評(píng)估性能瓶頸。這個(gè)原型不需要和最終硬件完全一致但需要抓住關(guān)鍵特征計(jì)算單元數(shù)量、存儲(chǔ)容量、帶寬比例。通過調(diào)整這些參數(shù)可以快速評(píng)估不同架構(gòu)方案的優(yōu)劣。我參與過一個(gè)項(xiàng)目硬件團(tuán)隊(duì)最初打算采用大陣列小緩存的方案軟件預(yù)研發(fā)現(xiàn)目標(biāo)模型的權(quán)重尺寸很大小緩存會(huì)導(dǎo)致頻繁的DRAM訪問。后來調(diào)整為中等陣列大緩存雖然峰值算力下降了20%但實(shí)際推理吞吐反而提升了50%。這個(gè)案例說明軟件預(yù)研能夠避免硬件設(shè)計(jì)走入誤區(qū)。7.2 流片后的軟件適配與性能調(diào)優(yōu)周期流片回來后軟件團(tuán)隊(duì)需要在真實(shí)硬件上做適配和調(diào)優(yōu)。這個(gè)周期通常需要3-6個(gè)月包括驅(qū)動(dòng)開發(fā)、編譯器后端適配、算子庫優(yōu)化、以及模型部署驗(yàn)證。我的經(jīng)驗(yàn)是流片后的第一個(gè)月最痛苦因?yàn)橛布ug和軟件bug混在一起很難定位。建議的做法是先跑通一個(gè)最簡(jiǎn)單的算子如向量加法確認(rèn)基礎(chǔ)功能正常然后逐步增加復(fù)雜度跑通單個(gè)卷積層、單個(gè)Transformer層最后跑完整模型。每一步都要有詳細(xì)的日志和性能計(jì)數(shù)器輸出方便定位問題。性能調(diào)優(yōu)階段重點(diǎn)關(guān)注計(jì)算單元利用率和存儲(chǔ)帶寬利用率這兩個(gè)指標(biāo)。如果利用率低于70%說明還有優(yōu)化空間。常見的優(yōu)化手段包括調(diào)整循環(huán)分塊參數(shù)、優(yōu)化數(shù)據(jù)布局、啟用稀疏加速、以及調(diào)整量化策略。7.3 版本迭代中的回歸測(cè)試與性能基線維護(hù)AI芯片的軟件棧會(huì)持續(xù)迭代每次迭代都需要做回歸測(cè)試確保新版本沒有引入性能退化或精度下降。我建議維護(hù)一套性能基線選取一組代表性模型記錄每個(gè)模型在當(dāng)前版本下的延遲、吞吐、精度。每次發(fā)布新版本前跑一遍基線測(cè)試對(duì)比結(jié)果。如果某個(gè)模型的性能下降超過5%就需要排查原因。這套機(jī)制聽起來簡(jiǎn)單但實(shí)際執(zhí)行中容易流于形式。我的做法是把基線測(cè)試集成到CI流程中每次代碼合并自動(dòng)觸發(fā)結(jié)果自動(dòng)對(duì)比并生成報(bào)告。這樣能夠及時(shí)發(fā)現(xiàn)性能退化避免問題積累到發(fā)布前才暴露。8. 一些踩過坑之后才明白的設(shè)計(jì)原則做AI芯片軟硬件設(shè)計(jì)這些年踩過的坑不少有幾個(gè)原則是付出了代價(jià)才真正理解的。第一個(gè)原則硬件設(shè)計(jì)階段一定要有軟件團(tuán)隊(duì)參與。我見過太多項(xiàng)目硬件團(tuán)隊(duì)閉門造車定義了一套自認(rèn)為優(yōu)雅的指令集和存儲(chǔ)架構(gòu)結(jié)果軟件團(tuán)隊(duì)發(fā)現(xiàn)根本無法高效映射主流模型。等到流片回來再改已經(jīng)來不及了。正確的做法是硬件架構(gòu)定義時(shí)軟件團(tuán)隊(duì)就要提供目標(biāo)模型的計(jì)算特征分析包括算子類型分布、張量尺寸分布、數(shù)據(jù)復(fù)用模式等。第二個(gè)原則不要追求極致的峰值算力要追求實(shí)際利用率。峰值算力是營(yíng)銷指標(biāo)實(shí)際利用率才是用戶價(jià)值。一顆標(biāo)稱100TOPS但利用率只有30%的芯片實(shí)際有效算力只有30TOPS另一顆標(biāo)稱60TOPS但利用率能到70%的芯片實(shí)際有效算力有42TOPS。后者才是更好的選擇。提高利用率的關(guān)鍵在于存儲(chǔ)層次設(shè)計(jì)和編譯器優(yōu)化這兩方面的投入回報(bào)率往往高于單純?cè)黾佑?jì)算單元。第三個(gè)原則量化策略要因模型而異不能一刀切。不同模型對(duì)量化的敏感度差異很大CNN通常比較魯棒Transformer則敏感得多。軟件棧需要提供靈活的量化配置接口允許用戶按層設(shè)置量化位寬和校準(zhǔn)方法。同時(shí)硬件需要支持混合精度計(jì)算否則軟件層面的靈活性無法發(fā)揮。第四個(gè)原則多芯片擴(kuò)展的收益不是線性的通信開銷會(huì)吃掉一部分算力增長(zhǎng)。設(shè)計(jì)多芯片系統(tǒng)時(shí)要先算清楚通信量再?zèng)Q定互聯(lián)拓?fù)浜蛣澐植呗?。如果通信開銷占比超過40%擴(kuò)展的收益就很有限了不如把單芯片做得更強(qiáng)。第五個(gè)原則編譯器的調(diào)優(yōu)表比自動(dòng)搜索更實(shí)用。學(xué)術(shù)界喜歡研究自動(dòng)調(diào)度算法但工業(yè)界更看重穩(wěn)定性和可預(yù)測(cè)性。對(duì)于常見的算子維度組合預(yù)先建立調(diào)優(yōu)表編譯時(shí)查表加微調(diào)比完全依賴自動(dòng)搜索更可靠。自動(dòng)搜索可以作為補(bǔ)充用于處理調(diào)優(yōu)表未覆蓋的特殊情況。這些原則聽起來簡(jiǎn)單但每一條背后都有實(shí)際項(xiàng)目的教訓(xùn)。AI芯片的軟硬件設(shè)計(jì)是一個(gè)系統(tǒng)工程任何一方面的短板都會(huì)拖累整體性能。只有軟硬件團(tuán)隊(duì)緊密協(xié)作從架構(gòu)定義到流片后調(diào)優(yōu)全程配合才能做出真正好用的芯片。