高端MCU、系統(tǒng)級(jí)SoC和AI加速器以及GPU都需要工具鏈。芯片工具鏈,簡(jiǎn)言之,是用于設(shè)計(jì)、開發(fā)和測(cè)試芯片的一系列軟件和硬件工具,涵蓋了編程語(yǔ)言、編譯器、調(diào)試器、性能分析工具、仿真器等多個(gè)方面,旨在提高芯片的性能、能效和可靠性。
首先是編程語(yǔ)言與編譯器:編程語(yǔ)言是開發(fā)者與硬件之間的橋梁,例如CUDA,而編譯器則負(fù)責(zé)將高級(jí)語(yǔ)言程序如Python轉(zhuǎn)換為機(jī)器碼。高效的編程語(yǔ)言和編譯器能夠顯著提升芯片的開發(fā)效率和程序性能。
其次是調(diào)試器與性能分析工具:調(diào)試器幫助開發(fā)者定位并修復(fù)程序中的錯(cuò)誤,而性能分析工具則能實(shí)時(shí)監(jiān)測(cè)芯片的運(yùn)行狀態(tài),為開發(fā)者提供性能優(yōu)化的建議。
最后是仿真器:仿真器能夠在沒有實(shí)際硬件的情況下,模擬芯片的運(yùn)行情況,從而加快開發(fā)周期。
對(duì)AI類端側(cè)芯片來(lái)說還會(huì)添加一個(gè)模型量化與轉(zhuǎn)換的環(huán)節(jié),這個(gè)環(huán)節(jié)包括經(jīng)過Parser(轉(zhuǎn)換為ONNX模型)- Optimizer(圖優(yōu)化)- Calibrator(模型量化校準(zhǔn)和量化參數(shù)選擇)- Quantizer(轉(zhuǎn)換為全整形模型) - Compiler(模型編譯) 幾個(gè)步驟,最后轉(zhuǎn)換成一個(gè)可部署的Hybrid model。圖優(yōu)化部分比較復(fù)雜,主要是算子的轉(zhuǎn)換、融合和拆分。
工具鏈決定了芯片的易用程度、性能利用率和準(zhǔn)確度,做工具鏈的員工數(shù)量往往比做硬件的員工還多。汽車領(lǐng)域,工具鏈更為重要,因?yàn)槠囶I(lǐng)域算力和存儲(chǔ)資源有限,因此都默認(rèn)使用整數(shù)8位精度,而AI端側(cè)領(lǐng)域則是浮點(diǎn)8位或16位精度,這是一個(gè)比較窄的領(lǐng)域。地平線的工具鏈?zhǔn)翘旃ら_物OpenExplorer,簡(jiǎn)稱OE。華為MDC工具鏈比較復(fù)雜,主要有Mind Studio、MDS以及MMC,英偉達(dá)則有TensorRT,高通則有Snapdragon Ride SDK??梢哉f要做大汽車AI芯片,工具鏈至少要占到近50%的權(quán)重。由于CUDA深入AI骨髓,不得不說,英偉達(dá)的工具鏈還是目前最強(qiáng)的。地平線和華為能夠從一眾AI芯片中脫穎而出,工具鏈居功甚偉。
一個(gè)AI模型的上車流程,首先是用各種AI訓(xùn)練框架來(lái)訓(xùn)練大模型,這些框架包括Meta的PyTorch、谷歌的TensorFlow、Meta的Caffe、由公共云提供商亞馬遜云計(jì)算服務(wù)(AWS)和Microsoft Azure聯(lián)合支持的開源MXNET,百度的飛槳以及MathWorks。然后轉(zhuǎn)換為微軟提出的ONXX中間態(tài),再通過推理引擎,在AI芯片上推理運(yùn)算。算法工程師定義神經(jīng)網(wǎng)絡(luò),然后使用 AI 框架(如 PyTorch、MindSpore、PaddlePaddle 等框架)編寫對(duì)應(yīng)的程序;通常使用Python語(yǔ)言,AI 框架將Python語(yǔ)言自動(dòng)構(gòu)建正向計(jì)算圖,又稱圖編譯器即GraphIR,根據(jù)自動(dòng)微分機(jī)制構(gòu)建反向計(jì)算圖;然后將計(jì)算圖轉(zhuǎn)變成算子的執(zhí)行序列,再轉(zhuǎn)換為L(zhǎng)LVM IR(Intermediate Representation),然后才在AI芯片上運(yùn)行。
在ONNX(Open Neural Network Exchange)模型中,除了輸入和輸出,其他都是算子(Operations)。算子是表示神經(jīng)網(wǎng)絡(luò)模型中的不同操作或?qū)拥脑?。一個(gè)ONNX模型由一系列算子組成,通過連接這些算子來(lái)定義模型的計(jì)算流程。常見的算子包括卷積Convolution、全連接Fully-connected、池化、激活函數(shù)(如ReLU、Sigmoid)、批歸一化(如Batch Normalization)、Dropout等。每個(gè)算子都有自己的輸入和輸出張量,并且可能有一些可調(diào)參數(shù)用于控制其行為。
算子之間的連接關(guān)系形成了一個(gè)有向圖,反映了模型中不同操作的計(jì)算順序。輸入張量通過算子進(jìn)行計(jì)算,然后產(chǎn)生輸出張量,這些輸出張量又可以作為其他算子的輸入。最后一個(gè)算子的輸出張量即為模型的輸出。ONNX提供了一種通用的中間表示形式,使得各種深度學(xué)習(xí)框架之間可以相互轉(zhuǎn)換模型。通過使用ONNX,可以將模型從一個(gè)框架導(dǎo)出為ONNX格式,然后將其導(dǎo)入到另一個(gè)框架中進(jìn)行訓(xùn)練或推理。這種靈活性使得研究人員和開發(fā)人員能夠更方便地在不同框架之間共享和使用模型。
對(duì)每一個(gè)獨(dú)立的算子,用戶需要編寫算子描述文件,描述算子的整體邏輯、計(jì)算步驟以及相關(guān)硬件平臺(tái)信息等。然后用深度學(xué)習(xí)編譯器對(duì)算子描述文件進(jìn)行編譯,生成可在特定硬件平臺(tái)上運(yùn)行的二進(jìn)制文件后,將待處理數(shù)據(jù)作為輸入,運(yùn)行算子即可得到期望輸出。將神經(jīng)網(wǎng)絡(luò)所有被拆分后的算子都按照上述過程處理后,再按照輸入輸出關(guān)系串聯(lián)起來(lái)即可得到整網(wǎng)運(yùn)行結(jié)果。
某些模型如LSTM長(zhǎng)短期記憶,沒有現(xiàn)成的算子對(duì)應(yīng)到LSTM,導(dǎo)致LSTM這個(gè)模型是不能部署的。LSTM就是由Conv+Sigmoid+Tanh+Mul這些基本算子組成的,就把LSTM拆分為這4個(gè)算子。Softmax也是如此,包含了6個(gè)算子,還有transformer包含比較多的非線性函數(shù),如ReLU、Sigmoid、Tanh、Exp,transformer還有獨(dú)特的Self-Attention Operators。高級(jí)用戶還能自創(chuàng)算子,當(dāng)然這需要工具鏈配合,否則無(wú)法部署。算子講起來(lái)非常復(fù)雜,想要詳細(xì)了解可以看這篇論文《A Mathematical Guide to Operator Learning》。
每家都有自己專用的量化工具,量化工具自然與推理引擎乃至硬件芯片是捆綁的,不可能通用,芯原、寒武紀(jì)、地平線這些廠家都有自己的量化工具。
計(jì)算圖優(yōu)化后是模型量化,根據(jù)谷歌量化白皮書中定義,分為PTQ和QAT兩種,而PTQ又包括三種量化方式:QAT, PTQ Dynamic, PTQ Static。
1、量化感知訓(xùn)練 (Quant Aware Training, QAT):
量化訓(xùn)練讓模型感知量化運(yùn)算對(duì)模型精度帶來(lái)的影響,通過 finetune微調(diào)訓(xùn)練降低量化誤差。這種方法會(huì)降低訓(xùn)練速度,但能夠獲得更高的精度。QAT 是將訓(xùn)練過的模型量化后又再進(jìn)行重訓(xùn)練。由于定點(diǎn)數(shù)值無(wú)法用于反向梯度計(jì)算,實(shí)際操作過程是在某些op前插入偽量化節(jié)點(diǎn)(fake quantization nodes), 用于在訓(xùn)練時(shí)獲取流經(jīng)該op的數(shù)據(jù)的截?cái)嘀?,便于在部署量化模型時(shí)對(duì)節(jié)點(diǎn)進(jìn)行量化時(shí)使用。需要在訓(xùn)練中通過不斷優(yōu)化精度來(lái)獲取最佳的量化參數(shù)。由于它需要對(duì)模型進(jìn)行訓(xùn)練,對(duì)操作人員技術(shù)要求較高。
2、動(dòng)態(tài)離線量化 (Post Training Quantization Dynamic, PTQ Dynamic):
動(dòng)態(tài)離線量化僅將模型中特定算子的權(quán)重從FP32類型映射成 INT8/16 類型,bias和激活函數(shù) 在推理過程中動(dòng)態(tài)量化。但對(duì)于不同的輸入值來(lái)說,其縮放因子是動(dòng)態(tài)計(jì)算的(“動(dòng)態(tài)”的由來(lái))。動(dòng)態(tài)量化是幾種量化方法中性能最差的,但PTQ無(wú)需對(duì)原始模型進(jìn)行任何訓(xùn)練,只對(duì)幾個(gè)超參數(shù)調(diào)整就可完成量化過程,過程簡(jiǎn)單快速,對(duì)于汽車行業(yè)來(lái)說,從業(yè)人員大多對(duì)大模型訓(xùn)練完全不熟悉,汽車行業(yè)又特別注重效率,因此行業(yè)大部分都用PTQ。動(dòng)態(tài)PTQ也有叫1級(jí)PTQ。
3、靜態(tài)離線量化 (Post Training Quantization Static, PTQ Static):
靜態(tài)離線量化使用少量無(wú)標(biāo)簽校準(zhǔn)數(shù)據(jù),采用 KL 散度等方法計(jì)算量化比例因子。也有稱這種為2級(jí)PTQ或先進(jìn)PTQ。
對(duì)AI芯片用戶來(lái)說,基本上只考慮用Python定義神經(jīng)網(wǎng)絡(luò),其余的環(huán)節(jié)均由工具鏈完成,完全透明。
工具鏈的另一個(gè)作用是監(jiān)控運(yùn)行資源消耗,評(píng)估性能。地平線征程 6 工具鏈目前提供了兩種方式生成性能評(píng)估報(bào)告:使用hb_compile工具編譯模型時(shí)會(huì)自動(dòng)生成性能評(píng)估報(bào)告;編譯出 hbm 模型后,使用編譯器提供的 python API hbm_perf生成性能評(píng)估報(bào)告。這里需要注意,調(diào)用 compile 接口編譯模型時(shí)需要開啟 debug 后才能生成 layerdetails。
性能主要是幀率、一次推理所需時(shí)間、每幀算子計(jì)算量。上面就是一個(gè)例子,單核情況每秒幀率34.12Hz,每次推理延遲29.31毫秒,運(yùn)算量273Gops。一般來(lái)說,高速NOA幀率至少要到30Hz以上,如果你發(fā)現(xiàn)幀率很低,要么是模型太大,無(wú)法運(yùn)行在這個(gè)芯片上;要么就是模型缺乏優(yōu)化,優(yōu)化后或許能流暢運(yùn)行。
芯片資源使用率和存儲(chǔ)動(dòng)作量
圖片來(lái)源:地平線
上圖是芯片資源使用率和存儲(chǔ)動(dòng)作量,關(guān)鍵計(jì)算單元利用率,要是利用率太低,大概率是因?yàn)榇鎯?chǔ)瓶頸導(dǎo)致的,計(jì)算單元在等待數(shù)據(jù)搬運(yùn)到位,也有可能是缺乏優(yōu)化,算子支持度不夠。目前大模型Transformer架構(gòu),非線性計(jì)算多,矩陣向量乘法運(yùn)算多,存儲(chǔ)帶寬遠(yuǎn)比算力重要,大約80%的時(shí)間計(jì)算單元都在等待數(shù)據(jù)搬運(yùn),利用率低于20%,而CNN架構(gòu),計(jì)算單元利用率最高可到95%。
地平線工具鏈流程
圖片來(lái)源:地平線
經(jīng)過量化訓(xùn)練工具鏈生成的模型還僅僅是量化模型,比如TensorFlow量化訓(xùn)練工具訓(xùn)練后生成的是 PB格式量化模型,在部署到地平線芯片之前,需要使用 HBDK芯片編譯器工具鏈對(duì)模型進(jìn)行編譯,將PB格式模型轉(zhuǎn)換為指令集模型(文件后綴名為.hbm)。
浮點(diǎn)轉(zhuǎn)定點(diǎn)工具鏈生成物是異構(gòu)混合模型bin文件,與量化訓(xùn)練方案中最后的定點(diǎn)模型hbm文件有概念上的差異,HBM文件內(nèi)部指令為在地平線BPU AI加速器進(jìn)行計(jì)算,而BIN文件內(nèi)部除了可以包含多個(gè)HBM段以外,還有一些會(huì)在CPU上執(zhí)行的模型算子 比如Abs,Clip,Div,Elu,Exp等算子,它們會(huì)在CPU上按照FP32方式進(jìn)行計(jì)算,當(dāng)然CPU的FP32運(yùn)算能力非常低,如果有GPU的話,自然會(huì)交給GPU執(zhí)行,CPU是可以處理任何形態(tài)數(shù)據(jù),只是效率高低問題。
地平線天工開物
圖片來(lái)源:地平線
華為的工具鏈包括:
Mind Studio:支持AI算子開發(fā)、調(diào)試調(diào)優(yōu),仿真及運(yùn)行,提供離線模型轉(zhuǎn)化與自定義算子開發(fā)功能。
MDC Manifest Configurator:基于AUTOSAR規(guī)范的ARXML配置工具,提供模塊化配置、模型關(guān)系圖形化,拖拽式配置、配置項(xiàng)校驗(yàn)等功能。
MDC Development Studio:集成開發(fā)環(huán)境,提供工程管理、代碼自動(dòng)生成、編輯編譯、調(diào)試運(yùn)行,遠(yuǎn)程部署,UT管理,性能分析、平臺(tái)軟件管理等功能。
Measure Calibration Diagnosis Tool:基于AUTOSAR的診斷調(diào)測(cè)工具,提供視頻回放、故障診斷、關(guān)鍵指標(biāo)測(cè)量、軟硬件拓?fù)湔故?,License管理、版本升級(jí)等功能。
MDC Application Visualizer:基于AUTOSAR的可視化調(diào)測(cè)工具,提供智能駕駛應(yīng)用常用數(shù)據(jù)和用戶自定義數(shù)據(jù)的2D/3D可視化顯示功能。
Mind Studio主要是負(fù)責(zé)AI模型的生成,之后作為庫(kù)文件導(dǎo)入到MDS中進(jìn)行整合。這里有點(diǎn)像一個(gè)單獨(dú)編寫庫(kù)文件的軟件,編寫好的庫(kù)作為資源導(dǎo)入,可以直接使用。
盡管MDC很少有外部用戶,但開放性仍然挺強(qiáng)的,支持CPU。
MMC負(fù)責(zé)AUTOSAR的具體實(shí)施。
最后我們來(lái)說說CUDA,訓(xùn)練階段,幾乎清一色是英偉達(dá)的顯卡,想繞開CUDA幾乎不可能。AI芯片加速的關(guān)鍵就是并行,并行有幾種,按照數(shù)據(jù)與指令之間的關(guān)系,關(guān)于并行處理的硬件架構(gòu)主要有 SISD(單指令流單數(shù)據(jù)流)、SIMD(單指令流多數(shù)據(jù)流)、MSID(多指令流單數(shù)據(jù)流)和 MIMD(多指令流多數(shù)據(jù)流)四種。還有三種硬件架構(gòu),分別是SIMD、SIMT和DSA,其中DSA基本可以對(duì)應(yīng)AI加速器或AI芯片,SIMD則主要是用在DSP和CPU領(lǐng)域,SIMT則是GPU。
MIMD延伸一步就是SPMD(Single Program, Multiple Data),多線程 SPMD 指的是在 SPMD 模型中使用多個(gè)線程來(lái)執(zhí)行并行計(jì)算任務(wù)。在多線程 SPMD 中,每個(gè)線程(Thread i)都執(zhí)行相同的程序,但處理不同的數(shù)據(jù),通過并發(fā)執(zhí)行來(lái)加速計(jì)算過程。
SPMD 通過循環(huán)中的每個(gè)迭代獨(dú)立實(shí)現(xiàn),在程序上,程序員或編譯器生成線程來(lái)執(zhí)行每次迭代,使得每個(gè)線程在不同的數(shù)據(jù)上執(zhí)行相同的計(jì)算,SIMT 獨(dú)立的線程管理硬件來(lái)使能硬件處理方式。GPU 的 SIMT 實(shí)際上是具體硬件執(zhí)行 SIMD 指令,采用并行編程模式使用 SPMD 來(lái)控制線程的方式。每個(gè)線程對(duì)不同的數(shù)據(jù)執(zhí)行相同的指令代碼,同時(shí)每個(gè)線程都有獨(dú)立的上下文。執(zhí)行相同指令時(shí)一組線程由硬件動(dòng)態(tài)分為一組 Wrap,硬件 Warp 實(shí)際上是由 SIMD 操作形成的,由 SIMT 構(gòu)成前端并在 SIMD 后端中執(zhí)行。在英偉達(dá) GPU 中,Warp 是執(zhí)行相同指令的線程集合,作為 GPU 的硬件 SM 調(diào)度單位,Warp 里的線程執(zhí)行 SIMD,因此每個(gè) Warp 中就能實(shí)現(xiàn)單指令多數(shù)據(jù)。這個(gè)編程模式就是CUDA。
很不幸,推理框架與CUDA是深度綁定的,95%的模型都使用TensorFlow或PyTorch框架,它們與英偉達(dá)的CUDA是深入骨髓的綁定,例如PyTorch的版本必須與CUDA版本一一對(duì)應(yīng)。
例如:你需要 1.7.0 的 PyTorch,那么CUDA只能 11.0 及以下。否則會(huì)頻頻閃爍的警報(bào)「CUDA版本必須與安裝的PyTorch匹配!?。 ?/p>
云端或者說數(shù)據(jù)中心是離不開GPU的,自然也離不開CUDA,所以不管做什么推理芯片,都必須兼容CUDA,英偉達(dá)CUDA的底層自然是不開放的,但是有個(gè)中間狀態(tài),即PTX。
DeepSeek采用了NVIDIA PTX指令集(Parallel Thread Execution ISA)來(lái)提升執(zhí)行效能。然而有人聲稱PTX將取代CUDA,甚至可以用aPTX來(lái)繞過CUDA。實(shí)際上,PTX是NVIDIA GPU最底層的控制語(yǔ)言,正因?yàn)樗浅=咏布?,?duì)于大部分開發(fā)者來(lái)說學(xué)習(xí)門檻較高,所以才有了CUDA來(lái)簡(jiǎn)化開發(fā)過程,PTX是一個(gè)簡(jiǎn)化版的硬核CUDA,是CUDA匯編語(yǔ)言,可以看作是一個(gè)虛擬指令集。PTX為通用并行編程提供了一個(gè)穩(wěn)定的編程模型和指令集。PTX旨在在支持NVIDIA Tesla架構(gòu)計(jì)算功能的GPU上高效運(yùn)行。高級(jí)語(yǔ)言編譯器(如CUDA和C/C++)生成PTX指令,這些指令經(jīng)過優(yōu)化并翻譯成目標(biāo)架構(gòu)的本機(jī)指令。PTX定義了一個(gè)虛擬機(jī)和指令集架構(gòu),用于通用目的的并行線程執(zhí)行。這個(gè)虛擬機(jī)和指令集架構(gòu)為開發(fā)者提供了一個(gè)抽象的編程接口,使得他們能夠編寫高效的并行程序。由于PTX指令集與特定的GPU硬件架構(gòu)解耦,跨平臺(tái)性不強(qiáng),可能更換一個(gè)GPU型號(hào)就需要重新編寫PTX,這也是很少人用PTX的原因之一。PTX 的開發(fā)效率特別低,PTX 現(xiàn)在只被用來(lái)優(yōu)化某些關(guān)鍵部分,是以鑲嵌在 CUDA 里的形式存在的。
要怎么繞開CUDA,實(shí)際PyTorch本來(lái)就有一個(gè)使用 AMD ROCm 的 PyTorch 版本,它是一個(gè)用于 AMD GPU 編程的開源軟件堆棧,當(dāng)然繞開了CUDA。
CUDA提供了一套基于C、C++和Fortran的編程接口,使得開發(fā)者能夠使用熟悉的高級(jí)語(yǔ)言編寫GPU代碼。CUDA擴(kuò)展了這些語(yǔ)言,引入了特殊的語(yǔ)法和函數(shù)庫(kù),以便于表達(dá)并行計(jì)算任務(wù)、管理內(nèi)存、同步線程等操作。CUDA開發(fā)工具鏈,包括編譯器(nvcc)、調(diào)試器(Nsight Systems/Nsight Compute)、性能剖析器(Visual Profiler)、數(shù)學(xué)算子庫(kù)(cuBLAS、cuFFT、cuDNN等)以及各種示例代碼和教程,幫助開發(fā)者便捷地編寫、調(diào)試、優(yōu)化CUDA應(yīng)用程序。
在 CUDA 編程中,開發(fā)者通常需要編寫兩部分代碼:主機(jī)代碼(Host Code)和設(shè)備代碼(Device Code)。主機(jī)代碼在CPU上運(yùn)行,負(fù)責(zé)與GPU進(jìn)行交互,包括數(shù)據(jù)傳輸和資源管理;而設(shè)備代碼則在GPU上執(zhí)行,承擔(dān)主要計(jì)算任務(wù)。二者相互配合,充分利用 CPU 和 GPU 的協(xié)同處理能力,以達(dá)到高效并行計(jì)算的目的。主機(jī)代碼運(yùn)行在 CPU 上,負(fù)責(zé)控制整個(gè)程序的邏輯流程。它管理CPU和GPU之間的數(shù)據(jù)傳輸,分配和釋放 GPU 資源,并配置 GPU 內(nèi)核參數(shù)。這部分代碼不僅定義了如何組織數(shù)據(jù)并將其發(fā)送到GPU,還包含了啟動(dòng)設(shè)備代碼的指令,從而讓GPU接管計(jì)算密集的任務(wù)。主機(jī)代碼起到管理和協(xié)調(diào)的作用,確保 CPU與GPU之間的高效協(xié)作。所以CPU的重要性似乎不低于GPU,這也是幾乎所有AI芯片廠家都要自己搞CPU的原因。
免責(zé)說明:本文觀點(diǎn)和數(shù)據(jù)僅供參考,和實(shí)際情況可能存在偏差。本文不構(gòu)成投資建議,文中所有觀點(diǎn)、數(shù)據(jù)僅代表筆者立場(chǎng),不具有任何指導(dǎo)、投資和決策意見。