同設(shè)計(jì):從架構(gòu)到落地的全鏈路實(shí)踐)
1. AI芯片軟硬件協(xié)同設(shè)計(jì)的整體思路拆解1.1 為什么軟硬件必須一起設(shè)計(jì)做AI芯片這行的人都有一個(gè)共識(shí)硬件性能再?gòu)?qiáng)如果軟件棧跟不上實(shí)際跑出來(lái)的吞吐量可能連理論峰值的30%都不到。我見(jiàn)過(guò)太多團(tuán)隊(duì)流片回來(lái)發(fā)現(xiàn)算子覆蓋率不夠、調(diào)度器效率低下、內(nèi)存帶寬利用率上不去最后只能靠降頻或者砍模型來(lái)湊合上線。這不是硬件設(shè)計(jì)的問(wèn)題也不是軟件偷懶而是兩者從一開(kāi)始就沒(méi)有放在同一張桌子上討論。軟硬件協(xié)同設(shè)計(jì)的核心邏輯其實(shí)很樸素AI負(fù)載的計(jì)算模式跟傳統(tǒng)通用計(jì)算完全不同。傳統(tǒng)CPU處理的是分支密集、訪存隨機(jī)的邏輯而AI推理和訓(xùn)練的核心是大規(guī)模矩陣乘加、卷積、歸一化這些規(guī)則但計(jì)算量爆炸的操作。這意味著硬件的數(shù)據(jù)通路、緩存層級(jí)、指令集設(shè)計(jì)都必須圍繞這些操作來(lái)定制而軟件則需要在編譯、調(diào)度、內(nèi)存分配層面主動(dòng)配合硬件的物理約束。我個(gè)人的經(jīng)驗(yàn)是一個(gè)AI芯片項(xiàng)目在架構(gòu)定義階段就應(yīng)該讓編譯器團(tuán)隊(duì)和runtime團(tuán)隊(duì)深度參與。比如如果硬件決定了PE陣列是128x128的脈動(dòng)結(jié)構(gòu)那編譯器就必須知道數(shù)據(jù)以什么粒度、什么順序流入才能打滿陣列。如果等到RTL凍結(jié)了再讓軟件團(tuán)隊(duì)去適配那基本就是拿著錘子找釘子怎么擰都別扭。1.2 從應(yīng)用場(chǎng)景反推硬件規(guī)格很多團(tuán)隊(duì)做芯片喜歡先定一個(gè)“大而全”的目標(biāo)比如支持所有主流算子、兼容所有框架。但實(shí)際落地時(shí)你會(huì)發(fā)現(xiàn)真正決定芯片競(jìng)爭(zhēng)力的往往是對(duì)兩三個(gè)核心場(chǎng)景的極致優(yōu)化。我參與過(guò)一個(gè)邊緣推理芯片的項(xiàng)目最初想同時(shí)覆蓋檢測(cè)、分割、分類三大類模型結(jié)果面積和功耗都爆了。后來(lái)砍掉分割專注優(yōu)化卷積和矩陣乘反而在目標(biāo)場(chǎng)景下做到了能效比領(lǐng)先。反推的邏輯鏈條是這樣的先確定目標(biāo)模型的計(jì)算圖特征統(tǒng)計(jì)各類算子的調(diào)用頻次和耗時(shí)占比然后針對(duì)Top 5算子設(shè)計(jì)專用加速單元剩下的用可編程核兜底。這個(gè)過(guò)程需要軟件團(tuán)隊(duì)提供真實(shí)的profiling數(shù)據(jù)而不是拍腦袋估計(jì)。我通常建議用三到五個(gè)代表性模型做端到端分析把每一層的延遲、帶寬需求、并行度都列出來(lái)形成一張“算子-硬件資源映射表”。1.3 軟硬件接口的抽象層級(jí)選擇接口抽象層級(jí)是個(gè)很容易踩坑的地方。抽象太高硬件細(xì)節(jié)被隱藏編譯器無(wú)法做精細(xì)優(yōu)化抽象太低軟件團(tuán)隊(duì)要直接面對(duì)寄存器操作開(kāi)發(fā)效率極低且容易出錯(cuò)。我的經(jīng)驗(yàn)是采用兩層抽象底層是硬件指令集和內(nèi)存模型供編譯器后端做指令選擇和寄存器分配上層是算子庫(kù)和運(yùn)行時(shí)API供框架集成和用戶調(diào)用。具體來(lái)說(shuō)硬件指令集需要暴露足夠的信息讓編譯器做調(diào)度決策比如DMA的通道數(shù)、PE陣列的配置模式、片上緩存的bank劃分。但不需要暴露具體的時(shí)序細(xì)節(jié)那些由硬件自動(dòng)處理。算子庫(kù)則封裝常用的卷積、矩陣乘、激活函數(shù)等提供與框架對(duì)接的標(biāo)準(zhǔn)接口。這樣既保證了優(yōu)化空間又控制了軟件復(fù)雜度。2. 核心模塊的硬件設(shè)計(jì)細(xì)節(jié)與實(shí)操要點(diǎn)2.1 計(jì)算陣列的微架構(gòu)選擇計(jì)算陣列是AI芯片的心臟常見(jiàn)的結(jié)構(gòu)有脈動(dòng)陣列、SIMD/SIMT、以及粗粒度可重構(gòu)陣列。脈動(dòng)陣列的優(yōu)勢(shì)是數(shù)據(jù)復(fù)用率高、控制邏輯簡(jiǎn)單適合規(guī)則的大矩陣運(yùn)算缺點(diǎn)是靈活性差遇到非規(guī)則計(jì)算容易閑置。SIMT則更通用但面積和功耗開(kāi)銷大。我在實(shí)際項(xiàng)目中傾向于混合方案主計(jì)算陣列用脈動(dòng)結(jié)構(gòu)處理卷積和全連接輔以一個(gè)小的向量單元處理激活、池化等逐元素操作。這樣既保證了主算力的效率又避免了為每個(gè)小算子單獨(dú)設(shè)計(jì)硬件的浪費(fèi)。關(guān)鍵參數(shù)包括陣列維度、數(shù)據(jù)位寬、累加器精度。以128x128的INT8陣列為例每個(gè)周期可以完成16384次乘加如果頻率跑到1GHz理論算力就是32TOPS。但實(shí)際有效算力取決于數(shù)據(jù)供給能否跟上所以片上緩存帶寬必須匹配。注意陣列維度不是越大越好。維度增大意味著布線延遲增加、時(shí)鐘樹(shù)更難平衡而且小模型可能根本填不滿陣列。我見(jiàn)過(guò)256x256的陣列在跑小模型時(shí)利用率不到20%純屬浪費(fèi)面積。2.2 片上內(nèi)存層級(jí)的設(shè)計(jì)取舍AI芯片的瓶頸往往不在算力而在內(nèi)存帶寬。片上內(nèi)存的設(shè)計(jì)需要在容量、帶寬、面積、功耗之間做權(quán)衡。常見(jiàn)的層級(jí)是寄存器文件、L1緩存/暫存器、L2緩存、以及外部DRAM接口。我的做法是把L1暫存器設(shè)計(jì)成可配置的bank結(jié)構(gòu)每個(gè)bank獨(dú)立尋址支持多端口并發(fā)訪問(wèn)。這樣編譯器可以根據(jù)算子的數(shù)據(jù)復(fù)用模式把輸入特征圖、權(quán)重、輸出分別放在不同的bank里避免訪問(wèn)沖突。L2緩存則采用統(tǒng)一編址負(fù)責(zé)在L1和DRAM之間做數(shù)據(jù)搬運(yùn)和復(fù)用。一個(gè)具體的參數(shù)計(jì)算例子假設(shè)目標(biāo)模型的最大單層卷積需要同時(shí)駐留64KB輸入、32KB權(quán)重、64KB輸出那么L1總?cè)萘恐辽?60KB??紤]到雙緩沖和預(yù)取實(shí)際設(shè)計(jì)成256KB比較穩(wěn)妥。帶寬方面如果計(jì)算陣列每周期需要256字節(jié)的輸入數(shù)據(jù)L1的讀帶寬就必須達(dá)到256字節(jié)/周期這通常需要4個(gè)64字節(jié)寬的bank并行工作。2.3 數(shù)據(jù)流控制與DMA設(shè)計(jì)數(shù)據(jù)搬運(yùn)的效率直接決定了計(jì)算單元的利用率。DMA的設(shè)計(jì)要點(diǎn)包括多通道支持、描述符鏈?zhǔn)秸{(diào)度、以及與計(jì)算單元的同步機(jī)制。我通常設(shè)計(jì)至少4個(gè)DMA通道分別負(fù)責(zé)輸入特征、權(quán)重、輸出結(jié)果、以及中間數(shù)據(jù)的搬運(yùn)。描述符鏈?zhǔn)秸{(diào)度是個(gè)很實(shí)用的技巧把一系列搬運(yùn)任務(wù)組織成鏈表DMA自動(dòng)按順序執(zhí)行完成一個(gè)后通過(guò)中斷或信號(hào)量通知計(jì)算單元。這樣CPU或調(diào)度器不需要頻繁干預(yù)減少了控制開(kāi)銷。同步機(jī)制方面我傾向于用硬件信號(hào)量而不是中斷因?yàn)橹袛嘌舆t大且會(huì)打斷流水線。實(shí)操心得DMA的burst長(zhǎng)度要跟DRAM的頁(yè)大小匹配。如果burst太短DRAM頻繁換頁(yè)有效帶寬會(huì)掉一半。一般設(shè)成64或128字節(jié)比較合適具體要看DRAM控制器的參數(shù)。2.4 指令集與編譯器后端協(xié)同指令集設(shè)計(jì)不是硬件團(tuán)隊(duì)閉門造車必須和編譯器團(tuán)隊(duì)一起定。我參與的項(xiàng)目里指令集通常包含以下幾類計(jì)算指令矩陣乘、卷積、向量運(yùn)算、數(shù)據(jù)搬運(yùn)指令DMA配置、緩存預(yù)取、控制指令循環(huán)、分支、同步、以及配置指令設(shè)置陣列模式、精度模式。編譯器后端需要做指令選擇、寄存器分配、指令調(diào)度。其中指令調(diào)度對(duì)性能影響最大因?yàn)锳I計(jì)算的數(shù)據(jù)依賴關(guān)系復(fù)雜調(diào)度不好就會(huì)產(chǎn)生流水線氣泡。我的經(jīng)驗(yàn)是讓編譯器支持軟件流水把循環(huán)展開(kāi)后重新排列指令順序讓DMA搬運(yùn)和計(jì)算重疊起來(lái)。這需要硬件提供足夠的寄存器資源和異步執(zhí)行單元。3. 軟件棧的實(shí)現(xiàn)與優(yōu)化實(shí)操3.1 編譯器前端的圖優(yōu)化編譯器前端負(fù)責(zé)把框架導(dǎo)出的計(jì)算圖轉(zhuǎn)換成中間表示然后做一系列圖級(jí)別的優(yōu)化。常見(jiàn)的優(yōu)化包括算子融合、常量折疊、死代碼消除、內(nèi)存布局轉(zhuǎn)換。其中算子融合對(duì)AI芯片特別重要因?yàn)榘丫矸e、BN、激活融合成一個(gè)算子可以減少中間結(jié)果的寫(xiě)回和讀取節(jié)省大量帶寬。我通常會(huì)在前端做三輪優(yōu)化第一輪是通用優(yōu)化跟硬件無(wú)關(guān)第二輪是硬件感知優(yōu)化比如根據(jù)陣列大小決定tile尺寸第三輪是內(nèi)存分配優(yōu)化把生命周期不重疊的張量分配到同一塊內(nèi)存。三輪下來(lái)一個(gè)典型的ResNet50可以縮減30%以上的內(nèi)存訪問(wèn)量。3.2 算子庫(kù)的手寫(xiě)優(yōu)化技巧雖然編譯器能自動(dòng)生成代碼但核心算子還是需要手寫(xiě)匯編或內(nèi)聯(lián)函數(shù)來(lái)榨取最后一點(diǎn)性能。手寫(xiě)算子的關(guān)鍵是理解硬件的微架構(gòu)細(xì)節(jié)PE陣列的流水線深度、寄存器的讀寫(xiě)端口沖突、DMA的啟動(dòng)延遲等。以卷積為例我通常采用im2col加矩陣乘的方式但會(huì)針對(duì)硬件做定制。比如如果陣列是脈動(dòng)結(jié)構(gòu)就把im2col的展開(kāi)順序調(diào)整成跟脈動(dòng)方向一致讓數(shù)據(jù)自然流動(dòng)。如果L1暫存器有bank沖突就調(diào)整數(shù)據(jù)布局把頻繁同時(shí)訪問(wèn)的數(shù)據(jù)放到不同bank。這些技巧編譯器很難自動(dòng)發(fā)現(xiàn)需要人工介入。注意手寫(xiě)算子雖然性能好但維護(hù)成本高。我的建議是只對(duì)Top 10熱點(diǎn)算子手寫(xiě)其余用編譯器生成。而且手寫(xiě)算子要有完整的測(cè)試用例確保數(shù)值正確性和邊界情況覆蓋。3.3 運(yùn)行時(shí)調(diào)度與內(nèi)存管理運(yùn)行時(shí)負(fù)責(zé)把編譯好的算子按依賴關(guān)系調(diào)度到硬件上執(zhí)行同時(shí)管理內(nèi)存分配和釋放。調(diào)度策略有靜態(tài)和動(dòng)態(tài)兩種靜態(tài)調(diào)度在編譯時(shí)確定執(zhí)行順序開(kāi)銷小但靈活性差動(dòng)態(tài)調(diào)度在運(yùn)行時(shí)根據(jù)資源狀態(tài)決定靈活但開(kāi)銷大。我傾向于混合策略主計(jì)算圖用靜態(tài)調(diào)度保證確定性動(dòng)態(tài)shape或條件分支用動(dòng)態(tài)調(diào)度兜底。內(nèi)存管理方面采用內(nèi)存池加引用計(jì)數(shù)的方式避免頻繁的malloc/free。內(nèi)存池按大小分級(jí)小對(duì)象從固定塊分配大對(duì)象單獨(dú)管理。3.4 框架對(duì)接與用戶接口用戶不會(huì)直接調(diào)用算子庫(kù)他們用的是PyTorch、TensorFlow這些框架。所以需要提供一個(gè)橋接層把框架的算子映射到自家芯片的算子庫(kù)。這個(gè)橋接層通常包括圖解析、算子映射、內(nèi)存拷貝、以及執(zhí)行引擎。圖解析負(fù)責(zé)把框架的IR轉(zhuǎn)換成自家IR算子映射負(fù)責(zé)找到對(duì)應(yīng)的硬件算子找不到的就用CPU fallback內(nèi)存拷貝負(fù)責(zé)在Host和Device之間搬數(shù)據(jù)執(zhí)行引擎負(fù)責(zé)按順序調(diào)用算子。這個(gè)橋接層的性能也很關(guān)鍵如果每次推理都要做大量Host-Device拷貝端到端延遲會(huì)很難看。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 性能不達(dá)預(yù)期的排查思路性能問(wèn)題是最常見(jiàn)的排查起來(lái)也最耗時(shí)。我的排查順序是先看計(jì)算單元利用率再看內(nèi)存帶寬利用率最后看DMA和同步開(kāi)銷。如果計(jì)算利用率低可能是數(shù)據(jù)供給不足或者陣列配置不對(duì)如果帶寬利用率高但計(jì)算利用率低可能是數(shù)據(jù)復(fù)用沒(méi)做好如果兩者都不高可能是同步或調(diào)度開(kāi)銷太大。具體工具方面我會(huì)在硬件里埋性能計(jì)數(shù)器統(tǒng)計(jì)每個(gè)模塊的活躍周期、 stall周期、以及各類事件的次數(shù)。軟件側(cè)則用profiling工具記錄每個(gè)算子的耗時(shí)和內(nèi)存訪問(wèn)量。兩邊數(shù)據(jù)一對(duì)基本就能定位瓶頸。4.2 數(shù)值精度問(wèn)題的定位與解決AI芯片通常支持INT8、FP16、甚至FP8不同精度下的數(shù)值行為差異很大。常見(jiàn)問(wèn)題包括溢出、舍入誤差累積、以及非對(duì)稱量化導(dǎo)致的偏差。我遇到過(guò)一次INT8推理精度掉點(diǎn)嚴(yán)重的情況最后發(fā)現(xiàn)是激活函數(shù)的量化參數(shù)在某個(gè)通道上估計(jì)不準(zhǔn)導(dǎo)致大量值被截?cái)唷=鉀Q思路是先做逐層對(duì)比找到誤差最大的層然后檢查該層的量化參數(shù)是否合理最后調(diào)整量化策略比如改用對(duì)稱量化或者增加校準(zhǔn)數(shù)據(jù)。硬件層面累加器位寬要足夠INT8乘加通常需要32位累加器否則多層累加后會(huì)溢出。4.3 軟硬件版本不匹配的坑這個(gè)坑很隱蔽但很致命。硬件流片后可能有ECO或者metal fix導(dǎo)致寄存器地址或行為跟設(shè)計(jì)文檔不一致。軟件如果按舊文檔寫(xiě)就會(huì)出現(xiàn)莫名其妙的錯(cuò)誤。我的做法是維護(hù)一個(gè)硬件版本寄存器軟件啟動(dòng)時(shí)讀取并校驗(yàn)不匹配就報(bào)錯(cuò)退出。同時(shí)硬件團(tuán)隊(duì)每次改版都要提供變更說(shuō)明軟件團(tuán)隊(duì)據(jù)此更新驅(qū)動(dòng)和算子庫(kù)。4.4 常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查方法解決措施計(jì)算利用率低于50%數(shù)據(jù)供給不足檢查DMA帶寬和L1命中率增大預(yù)取深度優(yōu)化數(shù)據(jù)布局推理結(jié)果偏差大量化參數(shù)不準(zhǔn)逐層對(duì)比浮點(diǎn)和定點(diǎn)輸出重新校準(zhǔn)調(diào)整量化策略運(yùn)行時(shí)報(bào)內(nèi)存錯(cuò)誤內(nèi)存池碎片或越界開(kāi)啟內(nèi)存檢查打印分配日志調(diào)整池大小修復(fù)越界訪問(wèn)端到端延遲高Host-Device拷貝多統(tǒng)計(jì)拷貝次數(shù)和數(shù)據(jù)量合并拷貝使用零拷貝接口多核并行效率低同步開(kāi)銷大測(cè)量同步等待時(shí)間改用無(wú)鎖隊(duì)列或硬件信號(hào)量實(shí)操心得每次流片回來(lái)我都會(huì)先跑一個(gè)“冒煙測(cè)試”套件覆蓋所有算子和典型模型。這個(gè)套件在仿真階段就要準(zhǔn)備好流片后直接跑能快速發(fā)現(xiàn)硬件bug。另外保留一份“黃金數(shù)據(jù)”即已知正確的輸入輸出對(duì)任何改動(dòng)后都跑一遍對(duì)比確保數(shù)值一致性。4.5 功耗與散熱的實(shí)測(cè)經(jīng)驗(yàn)功耗問(wèn)題在邊緣設(shè)備上尤其突出。我遇到過(guò)芯片跑滿時(shí)功耗超標(biāo)導(dǎo)致降頻甚至死機(jī)。排查后發(fā)現(xiàn)是時(shí)鐘樹(shù)功耗和漏電功耗占比過(guò)高。解決方法是在軟件層面做動(dòng)態(tài)電壓頻率調(diào)節(jié)根據(jù)負(fù)載調(diào)整頻率在硬件層面優(yōu)化時(shí)鐘門控空閑模塊及時(shí)關(guān)斷。散熱方面邊緣設(shè)備通常沒(méi)有風(fēng)扇全靠被動(dòng)散熱。所以芯片的布局要考慮熱源分散避免局部過(guò)熱。軟件上可以監(jiān)控溫度傳感器超過(guò)閾值就降頻。實(shí)測(cè)下來(lái)把峰值功耗控制在熱設(shè)計(jì)功耗的80%以內(nèi)基本能保證長(zhǎng)時(shí)間穩(wěn)定運(yùn)行。5. 從項(xiàng)目實(shí)踐中沉淀的經(jīng)驗(yàn)5.1 仿真驗(yàn)證的重要性流片一次成本極高所以仿真驗(yàn)證必須做充分。我通常分三個(gè)階段單元級(jí)驗(yàn)證、子系統(tǒng)級(jí)驗(yàn)證、以及全芯片級(jí)驗(yàn)證。單元級(jí)用定向測(cè)試和隨機(jī)測(cè)試覆蓋各種邊界情況子系統(tǒng)級(jí)跑真實(shí)算子對(duì)比參考模型全芯片級(jí)跑完整模型統(tǒng)計(jì)性能和精度。仿真平臺(tái)的選擇也很關(guān)鍵。RTL仿真慢但準(zhǔn)確適合最終驗(yàn)證FPGA原型快但可能有時(shí)序差異適合早期軟件開(kāi)發(fā)還有基于C模型的虛擬平臺(tái)速度最快但精度最低適合架構(gòu)探索。我的建議是三者結(jié)合早期用虛擬平臺(tái)快速迭代中期用FPGA跑軟件棧后期用RTL做最終確認(rèn)。5.2 軟件先行策略硬件還沒(méi)回來(lái)軟件團(tuán)隊(duì)不能干等。我的做法是先基于虛擬平臺(tái)或FPGA原型開(kāi)發(fā)軟件棧把編譯器、算子庫(kù)、運(yùn)行時(shí)都跑通。等硬件回來(lái)只需要做適配和調(diào)優(yōu)而不是從零開(kāi)始。這樣能節(jié)省至少三個(gè)月的時(shí)間。軟件先行還有個(gè)好處能提前發(fā)現(xiàn)硬件設(shè)計(jì)的缺陷。比如編譯器團(tuán)隊(duì)發(fā)現(xiàn)某個(gè)算子無(wú)法高效映射反饋給硬件團(tuán)隊(duì)可能只需要改一點(diǎn)微架構(gòu)就能解決。如果等流片后再發(fā)現(xiàn)那就只能軟件繞路性能損失很大。5.3 持續(xù)集成與回歸測(cè)試AI芯片的軟硬件都在快速迭代沒(méi)有持續(xù)集成很容易亂套。我建議搭建一套CI系統(tǒng)每次代碼提交都自動(dòng)編譯、跑測(cè)試、出報(bào)告。測(cè)試集要覆蓋算子正確性、模型精度、性能回歸、以及穩(wěn)定性。性能回歸特別重要因?yàn)閮?yōu)化一個(gè)算子可能拖慢另一個(gè)沒(méi)有回歸測(cè)試根本發(fā)現(xiàn)不了?;貧w測(cè)試的基線要定期更新但不能太頻繁否則噪音太大。我通常每周更新一次基線每次更新前人工確認(rèn)性能變化是預(yù)期的。另外測(cè)試環(huán)境要統(tǒng)一包括硬件版本、驅(qū)動(dòng)版本、編譯器版本否則結(jié)果不可比。5.4 與算法團(tuán)隊(duì)的協(xié)作模式算法團(tuán)隊(duì)和芯片團(tuán)隊(duì)的目標(biāo)不完全一致算法追求精度和創(chuàng)新芯片追求效率和通用性。協(xié)作的關(guān)鍵是找到平衡點(diǎn)。我的經(jīng)驗(yàn)是算法團(tuán)隊(duì)在模型設(shè)計(jì)階段就要考慮硬件約束比如避免使用硬件不支持的算子控制模型規(guī)模在芯片內(nèi)存范圍內(nèi)。芯片團(tuán)隊(duì)則要提供易用的工具鏈讓算法團(tuán)隊(duì)能快速評(píng)估模型在芯片上的性能。具體做法是建立一個(gè)聯(lián)合評(píng)審機(jī)制算法團(tuán)隊(duì)每提出一個(gè)新模型芯片團(tuán)隊(duì)就評(píng)估其硬件友好度給出優(yōu)化建議。反過(guò)來(lái)芯片團(tuán)隊(duì)每改一版架構(gòu)算法團(tuán)隊(duì)就評(píng)估對(duì)現(xiàn)有模型的影響。這樣雙方都能提前發(fā)現(xiàn)問(wèn)題避免后期返工。5.5 文檔與知識(shí)沉淀芯片項(xiàng)目的周期長(zhǎng)、參與人多文檔如果跟不上后面維護(hù)會(huì)非常痛苦。我要求團(tuán)隊(duì)做到每個(gè)模塊有設(shè)計(jì)文檔每個(gè)接口有規(guī)格說(shuō)明每個(gè)bug有分析報(bào)告。文檔不是寫(xiě)完就完了要隨著代碼更新而更新。我見(jiàn)過(guò)太多項(xiàng)目代碼改了文檔沒(méi)改后來(lái)的人照著舊文檔操作踩了一堆坑。知識(shí)沉淀方面我建議定期做技術(shù)分享讓不同模塊的同事了解彼此的工作。這樣遇到跨模塊問(wèn)題時(shí)能快速找到相關(guān)人。另外建立一個(gè)“坑庫(kù)”記錄項(xiàng)目中遇到的所有問(wèn)題和解決方法新人入職先讀這個(gè)能少走很多彎路。5.6 流片后的bring-up流程芯片回來(lái)后的bring-up是最緊張的階段。我的流程是先檢查電源和時(shí)鐘確保芯片能正常上電然后跑JTAG測(cè)試確認(rèn)掃描鏈正常接著加載簡(jiǎn)單的測(cè)試程序驗(yàn)證CPU核和內(nèi)存最后逐步加載復(fù)雜程序測(cè)試各個(gè)加速單元。Bring-up過(guò)程中最容易出問(wèn)題的是時(shí)鐘和復(fù)位。我遇到過(guò)復(fù)位信號(hào)毛刺導(dǎo)致芯片隨機(jī)死機(jī)的情況排查了很久才發(fā)現(xiàn)是復(fù)位樹(shù)的布線問(wèn)題。所以bring-up階段要準(zhǔn)備充分的調(diào)試手段比如片上邏輯分析儀、可配置的測(cè)試寄存器等。5.7 量產(chǎn)前的最終驗(yàn)證量產(chǎn)前的驗(yàn)證要覆蓋功能、性能、功耗、可靠性、以及兼容性。功能方面跑完整的模型庫(kù)和測(cè)試集性能方面統(tǒng)計(jì)不同負(fù)載下的吞吐量和延遲功耗方面測(cè)量典型場(chǎng)景和峰值場(chǎng)景的功耗可靠性方面做高低溫循環(huán)和長(zhǎng)時(shí)間老化測(cè)試兼容性方面驗(yàn)證與主流框架和操作系統(tǒng)的對(duì)接。這個(gè)階段發(fā)現(xiàn)的問(wèn)題修復(fù)成本極高所以前面的驗(yàn)證越充分越好。我的經(jīng)驗(yàn)是量產(chǎn)前至少留出兩個(gè)月做最終驗(yàn)證不要壓縮這個(gè)時(shí)間。一旦量產(chǎn)發(fā)現(xiàn)問(wèn)題召回的成本可能是驗(yàn)證成本的幾十倍。5.8 后續(xù)演進(jìn)的方向思考AI芯片的軟硬件設(shè)計(jì)不是一錘子買賣需要持續(xù)演進(jìn)。硬件方面可以通過(guò)增加陣列規(guī)模、提升內(nèi)存帶寬、支持新精度來(lái)提升性能軟件方面可以通過(guò)優(yōu)化編譯器、豐富算子庫(kù)、改進(jìn)調(diào)度策略來(lái)挖掘潛力。關(guān)鍵是保持軟硬件的同步迭代不要出現(xiàn)硬件等軟件或者軟件等硬件的情況。另外要關(guān)注算法的發(fā)展趨勢(shì)。比如Transformer架構(gòu)的普及對(duì)芯片提出了新的要求更大的片上內(nèi)存、更靈活的注意力計(jì)算、以及更好的稀疏支持。如果硬件設(shè)計(jì)不考慮這些趨勢(shì)可能兩年后就落后了。所以架構(gòu)設(shè)計(jì)要有一定的前瞻性預(yù)留擴(kuò)展空間。我個(gè)人在實(shí)際操作中的體會(huì)是AI芯片項(xiàng)目成功的關(guān)鍵不在于單點(diǎn)技術(shù)有多先進(jìn)而在于軟硬件團(tuán)隊(duì)能否緊密協(xié)作、快速迭代。我見(jiàn)過(guò)技術(shù)很牛的團(tuán)隊(duì)因?yàn)閰f(xié)作不暢而失敗也見(jiàn)過(guò)技術(shù)一般的團(tuán)隊(duì)因?yàn)榕浜夏醵龀隹捎玫漠a(chǎn)品。所以如果你正在做類似的項(xiàng)目建議把至少30%的精力放在團(tuán)隊(duì)協(xié)作和流程建設(shè)上這比單純優(yōu)化一個(gè)算子帶來(lái)的收益大得多。