神經(jīng)網(wǎng)絡(luò)的交換格式(3) http://www.reibang.com/p/62d2b32223d6
1.引言
1.1什么是NNEF
1.1.1輸出者對NNEF的看法
對于NNEF的輸出者婆廊,比如深度學(xué)習(xí)框架,NNEF是一種可以轉(zhuǎn)換內(nèi)部網(wǎng)絡(luò)表示的格式,之后所有能夠使用NNEF的加速器庫將能夠執(zhí)行訓(xùn)練好的網(wǎng)絡(luò)(如果網(wǎng)絡(luò) 匹配其功能)漠烧。 輸出者的任務(wù)是將其操作和數(shù)據(jù)表示映射到NNEF的操作和數(shù)據(jù)表示,假定這種映射是可能的。
NNEF還旨在成為深度學(xué)習(xí)操作的精選集颤介,這些操作在成功的神經(jīng)架構(gòu)中廣為流傳。 它是研究Caffe,Torch滚朵,Theano冤灾,TensorFlow骆姐,CNTK兵拢,Chainer等開源深度學(xué)習(xí)框架的結(jié)果,并且抽象出它們共同的計算和數(shù)據(jù)結(jié)構(gòu)讽营。 它主要集中在可能高效地在各種目標(biāo)硬件上執(zhí)行的操作移宅,例如大規(guī)模并行操作归粉,尤其是需要本地集中的輸入數(shù)據(jù)子集來計算輸出的“本地”操作。
1.1.2輸入者對NNEF的看法
神經(jīng)網(wǎng)絡(luò)加速器庫(及其底層硬件)等NNEF的導(dǎo)入程序能夠?qū)胍粋€NNEF文件漏峰,并將其編譯為內(nèi)部表示以準(zhǔn)備執(zhí)行糠悼。 此編譯可能會在離線或在線進(jìn)行。 在離線編譯期間浅乔,可以將NNEF轉(zhuǎn)換為優(yōu)化的倔喂,特定于硬件的表示格式,可以保存并稍后快速加載執(zhí)行童擎。 在線編譯期間滴劲,可能會發(fā)生轉(zhuǎn)換和優(yōu)化攻晒,而不會將其保存為硬件特定格式顾复,而是立即執(zhí)行轉(zhuǎn)換后的網(wǎng)絡(luò)。
NNEF將操作收集到組中以指示操作的相關(guān)性鲁捏。這可以作為硬件實(shí)現(xiàn)的提示或指導(dǎo)芯砸,因?yàn)橄嚓P(guān)的操作可能需要類似的硬件能力。
1.1.3應(yīng)用程序員對NNEF的看法
對于應(yīng)用程序員來說给梅,NNEF是存儲和傳輸神經(jīng)網(wǎng)絡(luò)的標(biāo)準(zhǔn)方法假丧。 給定NNEF格式的神經(jīng)網(wǎng)絡(luò),以及能夠?qū)胨尿?qū)動程序或庫动羽,應(yīng)用程序員不需要擔(dān)心網(wǎng)絡(luò)來自何處包帚,或者底層硬件會執(zhí)行它,只要它能夠 這樣做运吓。 應(yīng)用程序員可以查詢底層硬件的驅(qū)動程序是否能夠執(zhí)行給定的網(wǎng)絡(luò)渴邦。
1.1.4 NNEF不是什么
NNEF不是一個API(應(yīng)用程序編程接口)。 它沒有定義神經(jīng)網(wǎng)絡(luò)的執(zhí)行模型拘哨,因此它沒有定義正確執(zhí)行NNEF中描述的神經(jīng)網(wǎng)絡(luò)的意義谋梭。 雖然它確實(shí)定義了操作的語義,假設(shè)無限的算術(shù)倦青,定義正確執(zhí)行的實(shí)際實(shí)現(xiàn)將需要有限的算術(shù)和基本的表示瓮床,這是超出了NNEF的范圍。
生產(chǎn)或消費(fèi)NNEF的庫可能有各種API。 然而隘庄,對于應(yīng)用程序員來說踢步,重要的是有意執(zhí)行神經(jīng)網(wǎng)絡(luò)的NNEF消費(fèi)者很可能具有導(dǎo)入和編譯NNEF中描述的網(wǎng)絡(luò)的功能,并且隨后向該網(wǎng)絡(luò)提供數(shù)據(jù)丑掺。 但是贾虽,這個API的確切性質(zhì)超出了NNEF的范圍。 OpenVX Khronos標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò)擴(kuò)展以及神經(jīng)網(wǎng)絡(luò)的執(zhí)行模型描述了一個這樣的API吼鱼。
1.2規(guī)范術(shù)語
在本文檔中必須蓬豁,必須,應(yīng)該推薦菇肃,可以和可選擇的關(guān)鍵詞按照RFC 2119中的描述進(jìn)行解釋:[http://www.ietf.org/rfc/rfc2119.txt]
must
當(dāng)單獨(dú)使用時地粪,這個詞或所需的術(shù)語意味著定義是規(guī)范的絕對要求。如果后面跟著not(“must not”)琐谤,那么這個短語就意味著這個定義絕對禁止了這個規(guī)范蟆技。
should
當(dāng)單獨(dú)使用時,這個詞意味著在特殊情況下可能存在一些無效的理由來忽略某個特定的項(xiàng)目斗忌,但是在選擇不同的課程之前质礼,必須理解并仔細(xì)權(quán)衡全部含義。 如果后面跟著not(“should not”)织阳,那么這個短語就意味著在某些特定的行為是可以接受的甚至是有用的情況下眶蕉,可能存在一些合理的理由,但是在實(shí)現(xiàn)任何描述的行為之前唧躲,應(yīng)該理解全部含義并仔細(xì)權(quán)衡 與這個標(biāo)簽造挽。 在語法上合適的情況下,可以使用術(shù)語推薦或推薦來代替應(yīng)用弄痹。
may
這個詞饭入,或可選的形容詞,意味著一個東西是真正的可選項(xiàng)肛真。 一個供應(yīng)商可能會選擇包含該項(xiàng)目谐丢,因?yàn)樘囟ǖ氖袌鲂枰蛘咭驗(yàn)楣?yīng)商認(rèn)為它增強(qiáng)了產(chǎn)品蚓让,而另一個供應(yīng)商可能省略相同的項(xiàng)目乾忱。 不包含特定選項(xiàng)的實(shí)現(xiàn)必須準(zhǔn)備好與另一個包含該選項(xiàng)的實(shí)現(xiàn)進(jìn)行交互操作,但可能會降低功能凭疮。 同樣饭耳,包含特定選項(xiàng)的實(shí)現(xiàn)必須準(zhǔn)備好與另一個不包含選項(xiàng)的實(shí)現(xiàn)(當(dāng)然,該選項(xiàng)提供的特性除外)進(jìn)行交互操作执解。
此外can 和 cannot被解釋如下:
can
這個詞意味著所描述的特定行為是應(yīng)用程序的有效選擇寞肖,并且從未被用于指代實(shí)現(xiàn)行為纲酗。
cannot
這個詞意味著某個特定的行為描述是無法通過一個應(yīng)用來實(shí)現(xiàn)的。
本規(guī)范中使用的“cannot”與“must not”之間有一個重要的區(qū)別新蟆。 cannot意味著字面意義上無法表達(dá)的東西觅赊,而must not意味著字面意義能夠表達(dá)的東西,但是這樣做的后果是未定義的琼稻,并且可能造成不可預(yù)計的后果吮螺。
2.基礎(chǔ)
本章介紹基本概念,包括計算圖帕翻,運(yùn)算和張量鸠补,NNEF語法和數(shù)據(jù)描述。 它提供了一個框架來解釋本規(guī)范其余部分中有關(guān)操作和網(wǎng)絡(luò)體系結(jié)構(gòu)的更具體的描述嘀掸。
2.1計算圖
神經(jīng)網(wǎng)絡(luò)可以用計算圖來描述紫岩。 計算圖是有向圖,有兩類節(jié)點(diǎn):數(shù)據(jù)節(jié)點(diǎn)和操作節(jié)點(diǎn)睬塌。 從數(shù)據(jù)節(jié)點(diǎn)到操作節(jié)點(diǎn)的有向邊意味著操作將數(shù)據(jù)作為其輸入泉蝌,而從操作節(jié)點(diǎn)到數(shù)據(jù)節(jié)點(diǎn)的有向邊意味著操作產(chǎn)生數(shù)據(jù)作為其輸出。 不允許從數(shù)據(jù)節(jié)點(diǎn)到數(shù)據(jù)節(jié)點(diǎn)或從操作節(jié)點(diǎn)到操作節(jié)點(diǎn)的邊緣揩晴。
作為一個例子勋陪,一個簡單的多層前饋網(wǎng)絡(luò)可以用一個線性圖來描述,從一個輸入數(shù)據(jù)節(jié)點(diǎn)開始硫兰,每個層對應(yīng)一個操作節(jié)點(diǎn)诅愚,產(chǎn)生一個新的中間數(shù)據(jù)節(jié)點(diǎn),同時把之前的(中間)數(shù)據(jù)作為 輸入瞄崇,最后產(chǎn)生一些輸出數(shù)據(jù)呻粹。
數(shù)據(jù)節(jié)點(diǎn)代表稱為張量的多維數(shù)組(例如向量壕曼,矩陣或高維數(shù)組)苏研。 計算從不是任何操作結(jié)果的數(shù)據(jù)節(jié)點(diǎn)(如輸入和張量常量)開始。 為了使描述一致腮郊,這些數(shù)據(jù)節(jié)點(diǎn)是特殊張量聲明操作的結(jié)果摹蘑。 因此,整個計算圖由一組操作來描述轧飞,由數(shù)據(jù)節(jié)點(diǎn)互連衅鹿。
圖1.示例計算圖:正方形表示張量數(shù)據(jù)(E:外部,C:常數(shù)过咬,V:變量大渤,T:常規(guī)張量),橢圓表示操作
計算圖描述了神經(jīng)網(wǎng)絡(luò)計算的單個步驟掸绞,也就是說泵三,對單個輸入(或單批輸入)執(zhí)行的計算被饋送到該圖。 這簡單地描述了前饋網(wǎng)絡(luò),但并不是所有的網(wǎng)絡(luò)都那么簡單烫幕。 循環(huán)網(wǎng)絡(luò)通過允許在一個步驟中計算的一些張量值在下一步中被使用來引入步驟之間的依賴關(guān)系俺抽,因此總體計算的結(jié)果依賴于一系列輸入。 為了保持清晰和容易驗(yàn)證的描述较曼,每個步驟的計算由非循環(huán)圖來描述磷斧,循環(huán)網(wǎng)絡(luò)所需的循環(huán)依賴的數(shù)量通過變量張量來實(shí)現(xiàn),變量張量可以在每個步驟中被更新并保留 他們之間的值連續(xù)的步驟捷犹。 為了達(dá)到這個目的弛饭,引入了一個特殊的操作來更新變量張量(見變量更新)。
2.2數(shù)據(jù)描述
多維數(shù)組可以通過其維數(shù)及其在每個維度(其形狀)的范圍來描述萍歉。 從概念上講孩哑,多維數(shù)組是無限維度的,不相關(guān)的(尾隨)維度是范圍1(以下稱為單一維度)翠桦。 在這個描述中横蜒,我們沒有限制維度的數(shù)量,并且將未明確描述的維度視為單例销凑。 當(dāng)然丛晌,實(shí)際上,一個實(shí)現(xiàn)限制了支持維度的數(shù)量斗幼。 支持的最小維數(shù)為2.維度從0開始索引澎蛛。所有范圍的乘積稱為張量的體積(請注意,尾隨單體維度不影響體積)蜕窿。
在計算圖中谋逻,每個張量必須有一個明確的形狀。 外部操作桐经,常量操作和變量操作明確地定義了結(jié)果的形狀毁兆,從而為那些構(gòu)成計算輸入的張量提供了形狀。 所有其他操作將其結(jié)果張量的形狀定義為其輸入張量形狀的函數(shù)阴挣,這樣通過計算圖形來傳播形狀信息气堕。
為了描述計算圖的結(jié)構(gòu),不需要實(shí)際的數(shù)據(jù)畔咧。 但是茎芭,當(dāng)要執(zhí)行圖形時,那些用作計算參數(shù)的張量需要實(shí)際數(shù)據(jù)誓沸,例如具有先前計算的值的變量梅桩。 因此,除了數(shù)據(jù)節(jié)點(diǎn)的結(jié)構(gòu)方面拜隧,它們的實(shí)際數(shù)據(jù)也需要在某個地方定義宿百。 規(guī)范引入了描述個體張量內(nèi)容的二進(jìn)制格式煮寡。
2.3操作描述
除了數(shù)據(jù)節(jié)點(diǎn)之外,計算節(jié)點(diǎn)可以具有詳細(xì)描述所執(zhí)行的精確計算的元參數(shù)犀呼。 計算節(jié)點(diǎn)具有定義明確的語義幸撕,它根據(jù)輸入張量的輸入張量指定輸入到輸出的映射,包括輸出張量的形狀和內(nèi)容外臂。
計算圖可以以平面或組合的方式描述坐儿。 在構(gòu)圖描述中,操作可以用其他更簡單的操作來表示宋光。 因此貌矿,計算圖的描述可以被組織成層次結(jié)構(gòu)。 平面描述不會將操作分組為較大的單位罪佳。
NNEF圖形描述語法可以分為兩部分:平面描述所需的核心部分和描述復(fù)合操作的擴(kuò)展部分逛漫。 在構(gòu)成描述的情況下,操作分為兩大類:
- 原語(primitive):無法用其他操作表達(dá)的操作
- 復(fù)合(compound):可以從其他操作構(gòu)建的操作
復(fù)合操作仍然可以被認(rèn)為是有效的平面描述赘艳,但是酌毡,它們也被視為原子基元。
下面是一個關(guān)于如何建立更大和更大的子圖的圖解說明蕾管,直到整個圖被定義為止:
圖2.復(fù)合片段和圖形的分層構(gòu)建
組合描述是有用的枷踏,因?yàn)樗鼈鬟_(dá)了圖中的高階結(jié)構(gòu),將頻繁出現(xiàn)的子圖分組掰曾。 這有利于簡潔描述旭蠕,傳達(dá)比平面描述更多的信息,并且執(zhí)行引擎可以利用這樣的結(jié)構(gòu)信息旷坦。 但是掏熬,構(gòu)圖描述更為復(fù)雜,難以編譯秒梅。 因此旗芬,在平面描述足夠的情況下,可以僅使用適當(dāng)?shù)腘NEF語法子集番电。
在描述操作時岗屏,基元需要指定它們的輸入 - 輸出映射,包括它們執(zhí)行的計算以及結(jié)果的形狀和數(shù)據(jù)類型作為其輸入的函數(shù)漱办。 這些基本操作的語義由數(shù)學(xué)公式表示。 另一方面婉烟,復(fù)合操作是從原語構(gòu)建的娩井,它們的構(gòu)建方式為它們提供了可以從原語派生的語義。 這樣似袁,整個計算圖將具有明確定義的語義洞辣。
為了能夠用其他操作(原語或復(fù)合詞)來描述復(fù)合操作咐刨,使用程序符號。 流行的深度學(xué)習(xí)框架通常使用通用的腳本語言(如Python)扬霜。 圖形結(jié)構(gòu)的當(dāng)前描述模仿這種腳本語言的簡單子集定鸟,圍繞圖形片段構(gòu)建建立,該圖形片段構(gòu)造允許根據(jù)其他較低級別的操作來指定參數(shù)化操作著瓶。 這種方法可以用來以緊湊的方式描述整個神經(jīng)網(wǎng)絡(luò)的圖形联予。
2.4圖描述和用法概述
這種格式的目的是描述一個可以最終執(zhí)行的計算圖,但是格式本身并沒有定義執(zhí)行模型材原,只是定義了圖的結(jié)構(gòu)和數(shù)據(jù)參數(shù)沸久。 為了這樣做,一個簡單的文本格式描述了計算圖的結(jié)構(gòu)方面余蟹。 伴隨該文本格式是描述計算圖的外部張量參數(shù)的數(shù)據(jù)存儲格式卷胯。
本文件結(jié)構(gòu)如下。 Chapter Formal Description詳細(xì)說明了文本格式的語法和語義威酒。 章節(jié)操作描述了一系列可以構(gòu)建計算圖形的基元和復(fù)合操作窑睁,以及它們的參數(shù)化和語義。 存儲網(wǎng)絡(luò)數(shù)據(jù)的章節(jié)描述了存儲網(wǎng)絡(luò)權(quán)重的二進(jìn)制格式葵孤。
為了更清楚地了解如何使用這種格式卵慰,我們描述了如何將這些部分組合在一起來編譯和執(zhí)行計算圖。
2.4.1圖編譯和執(zhí)行
- 一個字節(jié)流(文本)將計算圖形描述為一系列操作佛呻。
計算圖的編譯從下面開始: - 包含序列化外部張量參數(shù)數(shù)據(jù)的可選字節(jié)流(二進(jìn)制)到圖中裳朋。 在概念層面上,編譯過程可能有以下幾個步驟:
- 解析結(jié)構(gòu)描述吓著,按照形式描述中的規(guī)則檢查其有效性鲤嫡。
- 如果描述是合成的,則通過評估元參數(shù)的編譯時表達(dá)式來將操作的層次結(jié)構(gòu)擴(kuò)展為基元绑莺,從而產(chǎn)生扁平的結(jié)構(gòu)暖眼。
- 傳播張量形狀和數(shù)據(jù)類型,按操作中所述執(zhí)行操作參數(shù)檢查纺裁。
一個實(shí)現(xiàn)并不局限于編譯一個在操作中列出的原始操作圖诫肠,而是可以實(shí)現(xiàn)像復(fù)合操作那樣的操作作為原子操作來提高效率。 在構(gòu)建可執(zhí)行圖之后欺缘,實(shí)現(xiàn)可以優(yōu)化它栋豫,例如通過移除中間緩沖區(qū)和不必要的操作或合并操作序列。
編譯過程之后谚殊,圖形執(zhí)行可能有以下步驟:
- 加載以前的序列化數(shù)據(jù)或?qū)⒊跏贾祩鬟f給聲明為變量的張量丧鸯。
- 在每個循環(huán)中,張量的饋送值被聲明為外部輸入嫩絮,執(zhí)行所需的操作丛肢,讀出輸出围肥。
- 如有必要保存更新的變量。
再次注意蜂怎,交換格式?jīng)]有定義正在描述的計算圖的執(zhí)行模型穆刻。以上只是如何使用它的一個例子。
2.5專業(yè)術(shù)語
以下術(shù)語在規(guī)范中經(jīng)常使用杠步,并在此處明確列出:
復(fù)合操作(compound operation)
根據(jù)其他操作定義的操作氢伟。它的語義是通過它定義的操作的組合來定義的。
計算圖
節(jié)點(diǎn)是操作或張量的圖形篮愉。操作節(jié)點(diǎn)僅連接到張量節(jié)點(diǎn)腐芍,反之亦然。
圖分段(graph fragment)
整個圖(網(wǎng)絡(luò))中的一個子圖试躏。一個片段可以用一系列由張量互連的操作來描述猪勇。
圖編譯時間(graph compilation-time)
在執(zhí)行之前構(gòu)建圖形的時間。類似于編程語言的編譯時間颠蕴。
圖執(zhí)行時間(graph execution-time)
建立后圖形運(yùn)行的時間(可能多次)泣刹。類似于編程語言的運(yùn)行時間。
元參數(shù)(meta-parameter)
定義操作的更多細(xì)節(jié)的操作的非張量參數(shù)犀被。元編譯時可以使用元參數(shù)椅您,因此可以在圖編譯時評估元參數(shù)表達(dá)式。
操作()
輸入張量到輸出張量的映射寡键。
原語操作(primitive operation)
其他操作沒有定義的操作掀泳。它的語義是通過數(shù)學(xué)公式定義的。
(張量的)等級
之后只有尾隨奇異維度的維數(shù)西轩。請注意员舵,領(lǐng)先或中間奇異維度也計入等級,所以形狀(1,5)具有等級2藕畔,而形狀(5,1)僅具有等級1马僻。
行主序
將矩陣的行 - 主數(shù)據(jù)布局推廣到多維數(shù)組。 數(shù)據(jù)的排列順序是:多維索引沿著最后維度變化最快注服,沿維度0變化最慢韭邓。請注意,該定義對于概念無限維數(shù)據(jù)也是有效的溶弟,因?yàn)槲搽S單獨(dú)維度只在 概念上是無限的多指標(biāo)女淑。
(張量)的形狀
定義張量在相關(guān)(非單一)維度上的范圍的一列整數(shù).
張量
代表圖中數(shù)據(jù)流的多維標(biāo)量數(shù)組。 維度的數(shù)量在概念上是無限的; 無足輕重的拖尾維度是1(單一維度)可很。 一個實(shí)現(xiàn)實(shí)際支持的最小維數(shù)是2诗力。
張量變量(variable tensor)
張量的值可以通過指定的操作來更新。所有其他的張量在概念上是不可改變的;每個操作產(chǎn)生一個新的張量我抠。
(張量的)體積
一個整數(shù)值苇本,它是形狀的乘積。