隨著越來(lái)越多不同類型的處理元件包含在同一架構(gòu)中,對(duì)處理器進(jìn)行編程變得越來(lái)越復(fù)雜。
雖然系統(tǒng)架構(gòu)師可能會(huì)陶醉于可用于提高功率、性能和面積的選項(xiàng)數(shù)量,但編程功能并使其協(xié)同工作的挑戰(zhàn)將成為一項(xiàng)重大挑戰(zhàn)。它涉及來(lái)自不同IP提供商的多種編程工具、模型和方法。
“在任何一種邊緣推理產(chǎn)品中,無(wú)論是Nest相機(jī)、汽車應(yīng)用中的相機(jī),還是筆記本電腦,基本上都有三種類型的功能軟件,主要來(lái)自三種不同類型的開(kāi)發(fā)人員——數(shù)據(jù)科學(xué)家、嵌入式CPU開(kāi)發(fā)人員和DSP開(kāi)發(fā)人員,”的首席營(yíng)銷官史蒂夫·羅迪說(shuō)二次曲面。
根據(jù)他們?cè)陂_(kāi)發(fā)過(guò)程中所處的位置,他們的方法可能看起來(lái)非常不同?!皵?shù)據(jù)科學(xué)家花時(shí)間在Python、框架培訓(xùn)和數(shù)學(xué)抽象層面上做事情,”羅迪說(shuō)。“PyTorch是非常高級(jí)的、抽象的、解釋的,不太關(guān)心實(shí)現(xiàn)的效率,因?yàn)樗麄冴P(guān)心的只是數(shù)學(xué)中的增益函數(shù)和模型的準(zhǔn)確性等。從那里出來(lái)的是PyTorch模型,ONNX代碼,以及嵌入PyTorch模型的Python代碼。嵌入式開(kāi)發(fā)者是完全不同的性格類型。他們使用更傳統(tǒng)的工具集,這些工具集可能是CPU供應(yīng)商的工具,或者Arm工具包,或者像Microsoft Visual Studio for C/C++開(kāi)發(fā)這樣的通用工具。無(wú)論是哪種CPU,您都將獲得該特定芯片的供應(yīng)商版本的開(kāi)發(fā)工作室,它將帶有預(yù)構(gòu)建的東西,如RTOS代碼和驅(qū)動(dòng)程序代碼。如果你從某個(gè)特定的供應(yīng)商那里購(gòu)買芯片級(jí)的解決方案,它會(huì)有DDR和PCI接口的驅(qū)動(dòng)程序,等等?!?/p>
例如,考慮iPhone的應(yīng)用程序編程,它是高度抽象的?!癷Phone開(kāi)發(fā)者有一個(gè)開(kāi)發(fā)工具包,上面有很多其他軟件,”他說(shuō)?!暗诤艽蟪潭壬?,這是一個(gè)嵌入式的東西。有人在編寫(xiě)C代碼,有人在開(kāi)發(fā)操作系統(tǒng),不管是澤法還是微軟的操作系統(tǒng),或者類似的東西。他們生產(chǎn)什么?他們產(chǎn)生C代碼,有時(shí)是匯編代碼,這取決于編譯器的質(zhì)量。DSP開(kāi)發(fā)人員也是算法開(kāi)發(fā)人員,通常面向數(shù)學(xué)家,使用MATLAB或Visual Studio等工具。這里創(chuàng)建了三個(gè)級(jí)別的代碼。類似Python的數(shù)據(jù)科學(xué)代碼,DSP,C++,還有嵌入式代碼。”
從一個(gè)Android開(kāi)發(fā)者的角度來(lái)看,Ronan Naughton是手臂說(shuō):“一個(gè)典型的軟件工程師可能正在開(kāi)發(fā)一個(gè)移動(dòng)應(yīng)用程序,用于部署到多個(gè)平臺(tái)。在這種情況下,他們將尋求最低的維護(hù)開(kāi)銷、無(wú)縫的可移植性和高性能,這些都可以通過(guò)無(wú)處不在的Arm CPU和支持工具鏈來(lái)提供?!?/p>
在Android環(huán)境中,針對(duì)CPU的編程提供了盡可能多的工具選擇。
“例如,”諾頓指出,“一個(gè)好的矢量化編譯器,如LLVM或GCC,可以針對(duì)多個(gè)CPU和操作系統(tǒng)目標(biāo)。有一個(gè)豐富的面向特定功能任務(wù)的函數(shù)庫(kù)生態(tài)系統(tǒng),例如面向ML的Arm計(jì)算庫(kù)?;蛘?,開(kāi)發(fā)人員可以使用Arm C語(yǔ)言擴(kuò)展等內(nèi)部函數(shù)來(lái)針對(duì)指令集架構(gòu)本身?!?/p>
在所有這些之下是一個(gè)傳統(tǒng)的架構(gòu),由一個(gè)NPU、DSP和CPU組成,需要所有的步驟才能到達(dá)目標(biāo)主機(jī)CPU。所有或大部分都使用某種形式的運(yùn)行時(shí)應(yīng)用程序。
“如果你正在運(yùn)行你的機(jī)器學(xué)習(xí)代碼,CPU會(huì)積極參與每一次推理,每一次迭代,每一次通過(guò)機(jī)器學(xué)習(xí)圖編排整個(gè)事情,”羅迪指出。
圖1:傳統(tǒng)NPU+DSP+CPU的工具/代碼流程。來(lái)源:Quadric.io
DSP、CPU和npu的編程方式因應(yīng)用、用例、系統(tǒng)架構(gòu)和環(huán)境而異。這將決定如何優(yōu)化代碼,以實(shí)現(xiàn)特定應(yīng)用程序或使用模型的最佳性能。
“在CPU上,大多數(shù)編譯器可以非常好地優(yōu)化代碼,但當(dāng)編程DSP或npu時(shí),特別是并行化代碼時(shí),大量工作必須由軟件工程師完成,因?yàn)樗芯幾g器都失敗了,”Andy Heinig說(shuō),他是弗勞恩霍夫協(xié)會(huì)適應(yīng)性系統(tǒng)工程分部。這意味著硬件上的并行工作越多,軟件工程師手動(dòng)完成的工作就越多。而且大部分工作都是低級(jí)編程需要的?!?/p>
雖然有一些重疊,但這些不同的處理元素之間也有一些基本差異?!癈PU是一種通用架構(gòu),因此支持廣泛的用途、操作系統(tǒng)、開(kāi)發(fā)工具、庫(kù)和許多編程語(yǔ)言,從傳統(tǒng)的低級(jí)C到高級(jí)C++、Python、Web應(yīng)用程序和Java,”的產(chǎn)品經(jīng)理蓋伊·本哈姆說(shuō)新思科技。“DSP應(yīng)用通常運(yùn)行在優(yōu)化的實(shí)時(shí)系統(tǒng)上,因此對(duì)DSP處理器進(jìn)行編程需要使用低級(jí)語(yǔ)言(如匯編語(yǔ)言、C語(yǔ)言)、DSP庫(kù)和特定的編譯器/分析器,以實(shí)現(xiàn)數(shù)據(jù)并行、性能調(diào)整和代碼大小優(yōu)化。與通用CPU不同,但與DSP類似,NPU架構(gòu)也致力于加速特定任務(wù),在這種情況下是為了加速AI/ML應(yīng)用?!?/p>
DSP架構(gòu)可以并行處理來(lái)自多個(gè)傳感器的數(shù)據(jù)。傳統(tǒng)的CPU或DSP編程依賴于一個(gè)程序或一套規(guī)則的算法來(lái)處理數(shù)據(jù),而人工智能則從數(shù)據(jù)中學(xué)習(xí),并隨著時(shí)間的推移提高其性能。
“人工智能使用PyTorch和TensorFlow等高級(jí)框架來(lái)創(chuàng)建、訓(xùn)練和部署模型,”本哈姆解釋道?!?a href="http://www.1cnz.cn/tags/神經(jīng)網(wǎng)絡(luò)/" target="_blank">神經(jīng)網(wǎng)絡(luò)模型的靈感來(lái)自人腦中神經(jīng)元的結(jié)構(gòu),由一個(gè)系統(tǒng)的數(shù)學(xué)表示組成,該系統(tǒng)可以根據(jù)輸入數(shù)據(jù)進(jìn)行預(yù)測(cè)或決策。”
還有其他不同之處。Tensilica Vision和AI DSPs的產(chǎn)品營(yíng)銷和管理小組主任Pulin Desai說(shuō),除了用C和C++等高級(jí)語(yǔ)言編程之外節(jié)奏,“DSP和CPU還利用各種庫(kù),如math lib、fp lib。DSP也有一個(gè)特定的庫(kù),用于特定的垂直領(lǐng)域,以執(zhí)行特殊用途的應(yīng)用。DSP和CPU還可以與OpenCL和Halide等高級(jí)語(yǔ)言一起工作,客戶可以使用這些語(yǔ)言來(lái)開(kāi)發(fā)他們的應(yīng)用?!?/p>
NPU編程是在完全不同的環(huán)境中使用AI訓(xùn)練框架完成的。反過(guò)來(lái),它們?cè)赥ensorFlow和PyTorch中生成神經(jīng)網(wǎng)絡(luò)代碼,并使用神經(jīng)網(wǎng)絡(luò)編譯器為特定硬件進(jìn)一步編譯網(wǎng)絡(luò)?!?/p>
“神經(jīng)網(wǎng)絡(luò)不是‘程序化的’“他們受過(guò)訓(xùn)練,”新思科技的產(chǎn)品經(jīng)理戈?duì)柕恰?kù)勃說(shuō)DSP和CPU以更傳統(tǒng)的方式編程。代碼是用C/C++寫(xiě)的。然后,您需要一個(gè)IDE和調(diào)試器來(lái)測(cè)試和編輯代碼。“
編程模型如何工作
所以對(duì)于CPU和DSP,設(shè)計(jì)師會(huì)用C或C++編程,但可能會(huì)調(diào)用特定的lib api?!袄纾瑢?duì)于vision,代碼可能會(huì)調(diào)用OpenCV API調(diào)用,”Desai說(shuō)。
圖2:DSP/CPU與npu上嵌入式軟件開(kāi)發(fā)的比較。來(lái)源:Cadence
Fraunhofer的Heinig說(shuō),大多數(shù)時(shí)候,優(yōu)化代碼的工作是手工完成的?!爱?dāng)涉及到并行使用硬件時(shí),高級(jí)編程模型通常會(huì)失敗。但是,當(dāng)然,使用具有基本高度優(yōu)化功能的庫(kù)是可能的?!?/p>
開(kāi)發(fā)一個(gè)人工智能模型是非常不同的。需要幾個(gè)步驟?!笆紫仁亲R(shí)別和準(zhǔn)備,”新思科技的本哈姆說(shuō)。“在確定適合由人工智能解決的問(wèn)題后,選擇正確的模型并收集將在該過(guò)程中使用的數(shù)據(jù)非常重要。其次是模特培訓(xùn)。訓(xùn)練模型意味著使用大量的訓(xùn)練數(shù)據(jù)來(lái)優(yōu)化模型,提高性能并確保準(zhǔn)確性。第三是推理。人工智能模型部署在生產(chǎn)環(huán)境中,用于根據(jù)可用數(shù)據(jù)快速做出結(jié)論、預(yù)測(cè)和推斷?!?/p>
還有其他不同之處。大多數(shù)DSP都是矢量處理器,其架構(gòu)針對(duì)高效并行處理數(shù)據(jù)陣列進(jìn)行了調(diào)整?!盀榱擞行У厥褂糜布?,數(shù)據(jù)需要矢量化,”新思科技高級(jí)產(chǎn)品經(jīng)理Markus Willems說(shuō)?!爱?dāng)從標(biāo)量代碼開(kāi)始時(shí),優(yōu)化編譯器可以應(yīng)用某種程度的自動(dòng)向量化。然而,對(duì)于絕大多數(shù)用例來(lái)說(shuō),獲得最佳結(jié)果需要程序員使用專用的矢量數(shù)據(jù)類型,以矢量化的方式編寫(xiě)代碼?!?/p>
Willems建議,為了充分利用指令集的全部功能,通常使用內(nèi)部函數(shù)。與普通的匯編編碼不同,內(nèi)建函數(shù)將寄存器分配留給編譯器,這允許代碼重用和移植
此外,對(duì)于大多數(shù)DSP算法,設(shè)計(jì)從MATLAB開(kāi)始分析功能性能(即檢查算法是否解決了問(wèn)題)。對(duì)于越來(lái)越多的DSP,有一種直接的方法可以將MATLAB算法映射到矢量化DSP代碼,即使用MATLAB嵌入式編碼器和處理器專用DSP庫(kù)。
但為了充分利用處理器,海尼格說(shuō),有必要共同優(yōu)化硬件和軟件。否則,你的解決方案將會(huì)失敗,因?yàn)槟阋庾R(shí)到設(shè)計(jì)的硬件并不完全符合問(wèn)題規(guī)范時(shí)已經(jīng)太晚了。如果要并行執(zhí)行越來(lái)越多的操作,尤其如此。”
對(duì)于一個(gè)SoC架構(gòu)師來(lái)說(shuō),它從什么是目標(biāo)市場(chǎng)和目標(biāo)應(yīng)用開(kāi)始,因?yàn)檫@將驅(qū)動(dòng)硬件和軟件架構(gòu)。
“在可編程性和固定硬件之間做出選擇總是一個(gè)挑戰(zhàn),”Desai解釋道。“決策是由成本(SoC面積)、功耗、性能、上市時(shí)間和未來(lái)需求驅(qū)動(dòng)的。如果您了解您的目標(biāo)應(yīng)用,并希望優(yōu)化功耗和面積,固定硬件是最佳選擇。一個(gè)例子是H.264解碼器。]神經(jīng)網(wǎng)絡(luò)是不斷變化的,因此可編程性是必須的,但一種架構(gòu),其中一些功能在固定功能(硬件加速器,如NPU)中,一些在可編程CPU或DSP中,是人工智能的最佳選擇?!?/p>
劃分處理
所有這些都變得更加復(fù)雜,因?yàn)椴煌脑O(shè)計(jì)者/程序員可能負(fù)責(zé)不同的代碼。
“我們?cè)谡務(wù)撏评響?yīng)用,但我們也在談?wù)撘粋€(gè)系統(tǒng)公司制造一個(gè)系統(tǒng),”德賽說(shuō)?!坝捎赟oC是通用的,可能會(huì)有人工智能開(kāi)發(fā)人員開(kāi)發(fā)特定的神經(jīng)網(wǎng)絡(luò)來(lái)解決特定的問(wèn)題,例如,為麥克風(fēng)降低噪聲的降噪網(wǎng)絡(luò),為安全攝像頭提供人員檢測(cè)網(wǎng)絡(luò)等。這個(gè)網(wǎng)絡(luò)需要轉(zhuǎn)換為可以在SoC上運(yùn)行的代碼,因此您將擁有知道如何使用工具將神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)換為可以在具有CPU/DSP/NPU的SoC上啟動(dòng)的代碼的程序員。但是,如果是實(shí)時(shí)應(yīng)用程序,您還需要知道如何使用實(shí)時(shí)操作系統(tǒng)、處理器級(jí)系統(tǒng)軟件等的系統(tǒng)軟件工程師。此外,如果這是消費(fèi)類設(shè)備,可能會(huì)有高級(jí)軟件開(kāi)發(fā)人員開(kāi)發(fā)GUI或用戶界面。”
對(duì)于NPU,有幾個(gè)注意事項(xiàng)?!笆紫龋琋PU必須設(shè)計(jì)為加速人工智能工作負(fù)載,”本哈姆說(shuō)?!叭斯ぶ悄?神經(jīng)網(wǎng)絡(luò)工作負(fù)載由深度學(xué)習(xí)算法組成,這些算法在許多層中需要大量的數(shù)學(xué)和多重矩陣乘法,因此需要并行架構(gòu)。”
他解釋說(shuō),一個(gè)好的NPU的關(guān)鍵特征之一是處理數(shù)據(jù)和快速完成操作的能力,性能以TOPS/MAC衡量?!肮β?性能/面積(成本)之間的典型半導(dǎo)體權(quán)衡也與NPU設(shè)計(jì)密切相關(guān)。對(duì)于自動(dòng)駕駛汽車的使用,NPU的延遲是至關(guān)重要的,特別是當(dāng)決定何時(shí)踩下汽車剎車是生死攸關(guān)的事情時(shí)。這也與功能安全設(shè)計(jì)考慮有關(guān)。設(shè)計(jì)團(tuán)隊(duì)還必須考慮NPU設(shè)計(jì)是否符合安全要求。”
程序員需要考慮的另一個(gè)關(guān)鍵問(wèn)題是開(kāi)發(fā)和編程工具。
“如果沒(méi)有合適的軟件開(kāi)發(fā)工具,能夠輕松地從流行的人工智能框架中導(dǎo)入NN/AI模型,編譯,優(yōu)化它,并自動(dòng)利用包括內(nèi)存設(shè)計(jì)考慮在內(nèi)的NPU架構(gòu),那么構(gòu)建一個(gè)偉大的NPU是不夠的,”他說(shuō)?!疤峁┮环N檢查模型準(zhǔn)確性的方法以及模擬工具也很重要,這樣程序員可以在硬件存在之前就開(kāi)始軟件開(kāi)發(fā)和驗(yàn)證。這是上市時(shí)間的一個(gè)重要考慮因素?!?/p>
庫(kù)珀同意了?!皀pu比DSP更接近于定制加速器,尤其是GPU或CPU,它們完全靈活。您可能不會(huì)選擇添加NPU,除非您在相當(dāng)長(zhǎng)的時(shí)間內(nèi)強(qiáng)烈需要NN性能。我們的客戶只需要一點(diǎn)點(diǎn)人工智能,他們使用矢量DSP來(lái)實(shí)現(xiàn)DSP性能,并在需要時(shí)對(duì)其進(jìn)行重新配置以處理人工智能,從而確保其芯片面積的最大靈活性。這很好,但不會(huì)像專用NPU那樣節(jié)能或節(jié)省面積。”
最后,當(dāng)試圖確定圖的哪些子集適合NPU,哪些不適合時(shí),編程挑戰(zhàn)就來(lái)了。[參見(jiàn)上面圖1的左側(cè)]
Quadric公司的羅迪說(shuō):“如果它不運(yùn)行,它就必須在別的地方運(yùn)行,所以代碼必須被拆分?!迸c此同時(shí),還有一個(gè)存儲(chǔ)在內(nèi)存中的輔助命令流生成器或鏈表生成器,NPU知道足夠多的信息來(lái)獲取它的命令。雖然這一部分非常簡(jiǎn)單,但是所有不在系統(tǒng)上運(yùn)行的部分呢?那些運(yùn)營(yíng)商該往哪里跑?有沒(méi)有已經(jīng)存在的機(jī)器學(xué)習(xí)操作符的高效實(shí)現(xiàn)?如果是,它是在DSP上,還是在CPU上,如果它不存在?必須有人去創(chuàng)造一個(gè)新的版本。你在DSP上這樣做是因?yàn)槟阆M哂懈咝阅堋,F(xiàn)在你必須在DSP上編碼,很多DSP缺乏好的工具,尤其是那些專門為機(jī)器學(xué)習(xí)而構(gòu)建的工具。通用版本的DSP——音頻DSP或基本通用DSP——可能有兩個(gè)MAC或四個(gè)MAC類型的東西。為機(jī)器學(xué)習(xí)而構(gòu)建的DSP將是非常廣泛的DSP。超寬DSP可以成為非常廣泛的激活和標(biāo)準(zhǔn)化以及數(shù)據(jù)科學(xué)中發(fā)生的事情的良好目標(biāo),但它們是新的,因此可能沒(méi)有可靠的編譯器?!?/p>
結(jié)論
在過(guò)去,這些編程世界是獨(dú)立的學(xué)科。但隨著人工智能計(jì)算越來(lái)越多地包含在設(shè)備中,以及隨著系統(tǒng)變得越來(lái)越異構(gòu),軟件開(kāi)發(fā)人員至少需要更多地了解其他領(lǐng)域正在發(fā)生的事情。
最終,這可能成為單一硬件/軟件架構(gòu)的驅(qū)動(dòng)因素,允許工程團(tuán)隊(duì)編寫(xiě)和運(yùn)行復(fù)雜的C++代碼,而不必在兩三種類型的處理器之間進(jìn)行劃分。但是,如果要做到這一點(diǎn),從現(xiàn)在到那時(shí)還有許多工作要做。鑒于人工智能和硬件架構(gòu)的發(fā)展速度,尚不完全清楚該架構(gòu)在準(zhǔn)備就緒時(shí)是否仍然相關(guān)。
? ? ? 審核編輯:黃飛
評(píng)論
查看更多