国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

TensorFlow Lite:端側(cè)機(jī)器學(xué)習(xí)框架

2020-09-24 08:40李雙峰
計算機(jī)研究與發(fā)展 2020年9期

李雙峰

(Google TensorFlow團(tuán)隊 北京 100190)shuangfeng@google.com)

TensorFlow Lite[1](TFLite)是一個輕量、快速、跨平臺的專門針對移動和IoT應(yīng)用場景的機(jī)器學(xué)習(xí)框架,是開源機(jī)器學(xué)習(xí)平臺TensorFlow[2-4](TF)的重要組成部分.它致力于“一次轉(zhuǎn)換,隨處部署”,支持安卓、iOS、嵌入式Linux以及MCU等多種平臺,降低開發(fā)者使用門檻,加速端側(cè)機(jī)器學(xué)習(xí)(on-device machine learning, ODML)的發(fā)展,推動機(jī)器學(xué)習(xí)無處不在.本文介紹了工業(yè)界端側(cè)機(jī)器學(xué)習(xí)的最新趨勢以及TFLite如何加速其發(fā)展,包括:

1) 端側(cè)機(jī)器學(xué)習(xí)的趨勢、挑戰(zhàn)和典型應(yīng)用,以及TFLite的起源;

2) TFLite的系統(tǒng)架構(gòu);

3) TFLite的最佳實踐以及適合初學(xué)者的工具鏈;

4) 未來的發(fā)展方向.

1 TensorFlow Lite推動端側(cè)機(jī)器學(xué)習(xí)的發(fā)展

1.1 機(jī)器學(xué)習(xí)的普及以及TensorFlow的發(fā)展

機(jī)器學(xué)習(xí)的發(fā)展改變著語音交流、機(jī)器翻譯、健康醫(yī)療和城市交通等我們生活中的諸多領(lǐng)域,越來越多的企業(yè)、組織和個人嘗試用機(jī)器學(xué)習(xí)解決業(yè)務(wù)或者生活中遇到的難題.開發(fā)者數(shù)量的大量增加也意味著需要降低技術(shù)門檻,讓更多人參與進(jìn)來.

在2015年底,Google開源了端到端的機(jī)器學(xué)習(xí)開源框架TensorFlow[2-4]:它既用于研究,也用于大規(guī)模生產(chǎn)領(lǐng)域;既支持大規(guī)模的模型訓(xùn)練,也支持各種環(huán)境的部署,包括服務(wù)器和移動端的部署;支持多種語言比如Python,C++,Java,Swift甚至JavaScript.TensorFlow提供了全面靈活的工具生態(tài),幫助解決各種挑戰(zhàn)性的問題.而近年來移動化浪潮和交互方式的改變,使得機(jī)器學(xué)習(xí)技術(shù)開發(fā)也在朝著輕量化的端側(cè)發(fā)展,于是TensorFlow團(tuán)隊在2017年底開源了TFLite[5],一個輕量、快速、兼容度高的專門針對移動應(yīng)用場景的深度學(xué)習(xí)工具,降低了端側(cè)深度學(xué)習(xí)技術(shù)的門檻.

1.2 端側(cè)機(jī)器學(xué)習(xí)的機(jī)遇和挑戰(zhàn)

伴隨移動和IoT設(shè)備的普及,世界以超乎想象的方式連接在一起.如今已有超過30億的智能手機(jī)用戶[6],以及超過70億的聯(lián)網(wǎng)IoT設(shè)備[7](不包括手機(jī)、電腦等).手機(jī)成本不斷降低,并且隨著微控制器(mircrocontrollers, MCU)和微機(jī)電系統(tǒng)(micro-electro-mechanical systems, MEMS)的發(fā)展,高性能低功耗的芯片使得“萬物”智能具有了可能性.從智能穿戴、智能家居到共享單車,從工業(yè)控制到車載設(shè)備,這些設(shè)備都有了智能化的基礎(chǔ).我們有時把這些設(shè)備統(tǒng)稱為邊緣設(shè)備(edge device).

將邊緣設(shè)備的數(shù)據(jù)傳輸?shù)皆贫颂幚砗芏鄷r候不是最經(jīng)濟(jì)有效的方式,它帶來了延遲,降低了復(fù)雜網(wǎng)絡(luò)條件下的可靠性,也引起了更多的隱私顧慮,從而影響用戶體驗.用戶對交互的需求越來越高,快速、及時的智能反應(yīng)是消費者的普遍期待,以智能音箱為例,喚醒的響應(yīng)速度是良好體驗的基礎(chǔ).

我們把在邊緣設(shè)備上的運行機(jī)器學(xué)習(xí)統(tǒng)稱為端側(cè)機(jī)器學(xué)習(xí)(ODML),它為萬物智能互聯(lián)帶來了新的機(jī)遇:

1) 更快、更緊密的交互方式,因為模型在本地執(zhí)行的延遲小.比如及時的語音喚醒、直播視頻的實時圖像分割或者輔助駕駛的目標(biāo)檢測,都需要在本地執(zhí)行.

2) 在復(fù)雜網(wǎng)絡(luò)環(huán)境下仍可提供可靠服務(wù),比如在網(wǎng)絡(luò)基礎(chǔ)設(shè)施相對落后的國家或偏遠(yuǎn)地區(qū),在復(fù)雜環(huán)境下(比如隧道中),帶寬可能有限或無法聯(lián)網(wǎng).

3) 更好的保護(hù)隱私,因為在本地進(jìn)行數(shù)據(jù)收集和處理,減少了數(shù)據(jù)上傳.

然而實現(xiàn)端側(cè)機(jī)器學(xué)習(xí)有很多挑戰(zhàn),因為邊緣設(shè)備:

1) 算力有限,限制了模型的復(fù)雜度.

2) 內(nèi)存有限,限制了模型的大小.

3) 電池有限,需要模型運算效率更好.比如對智能手表而言,省電非常關(guān)鍵.

通常,移動設(shè)備上耗電最多的是無線電,如果在本地執(zhí)行,尤其是有DSP或NPU等硬件加速器的情況下,電池續(xù)航時間就更長.

4) 計算硬件生態(tài)碎片化嚴(yán)重,比如CPU,GPU,DSP,NPU等,如何將這些異構(gòu)硬件真正利用起來是一大難題.這與云端不同,在云端,硬件加速器供應(yīng)商通常非常集中,如NVIDIA GPU或TPU.

1.3 TensorFlow Lite的起源和相關(guān)工作

TFLite是在邊緣設(shè)備上運行TensorFlow模型推理的官方框架,它跨平臺運行,包括Android,iOS以及基于Linux的IoT設(shè)備和微控制器.

TensorFlow適用于云端的大型、大功率設(shè)備,以及本地的工作站設(shè)備.當(dāng)邊緣設(shè)備的需求增加時,我們嘗試簡化TensorFlow并在移動設(shè)備上運行,這就是TF Mobile項目:它是一個縮減版的TensorFlow變體,簡化了算子集,也縮小了運行庫(runtime).然而,我們始終難以大大縮小運行庫;同時運行庫的擴(kuò)展性方面也存在問題,如何將其映射到移動環(huán)境中所用的各種異構(gòu)加速器上困難重重.

TFMini是Google內(nèi)部用于計算機(jī)視覺場景的解決方案,它提供了一些工具(比如TOCO轉(zhuǎn)換工具),壓縮模型(比如刪掉訓(xùn)練相關(guān)的不必要節(jié)點),進(jìn)行算子融合并生成代碼.它將模型嵌入到二進(jìn)制文件中,這樣我們就可以在設(shè)備上運行和部署模型.TFMini針對移動設(shè)備做了很多優(yōu)化,性能優(yōu)秀,但在把模型嵌入到實際的二進(jìn)制文件中時兼容性存在較大挑戰(zhàn),因此TFMini并沒有成為通用的解決方案.

基于TF Mobile的經(jīng)驗,也繼承了TFMini和內(nèi)部其他類似項目的很多優(yōu)秀工作,我們設(shè)計了TFLite:

1) 更輕量.在32 b安卓平臺下,核心運行時的庫大小只有100 KB左右,加上支持基本的視覺模型(比如InceptionV3和MobileNet)所需算子時,總共300 KB左右,而使用全套算子庫時,只有1 MB左右.

2) 特別為各種端側(cè)設(shè)備優(yōu)化的算子庫.

3) 能夠利用各種硬件加速,比如GPU,DSP等.

TFLite兼具性能和通用性,已經(jīng)完全取代了TF Mobile和TFMini,成為TensorFlow針對移動和IoT設(shè)備的官方框架,被廣泛使用.

其他相關(guān)工作包括:CoreML[8]是iOS平臺的解決方案,而TFLite強(qiáng)調(diào)其優(yōu)秀的跨平臺能力.中國的開源端側(cè)機(jī)器學(xué)習(xí)框架代表包括騰訊NCNN[9]、小米MACE[10]和阿里巴巴MNN[11]等,它們專注于移動推理平臺,而TFLite是TensorFlow生態(tài)的一部分,支持從訓(xùn)練到多種平臺部署[3](比如TFX,TF.js,TFLite),并提供完整的工具鏈(比如TensorBoard).

1.4 端側(cè)機(jī)器學(xué)習(xí)應(yīng)用的蓬勃發(fā)展

端側(cè)機(jī)器學(xué)習(xí)在圖像、文本和語音等方面都有非常廣泛的想象空間.全球有超過40億[12]的設(shè)備上部署著TFLite,這個數(shù)字還在不斷增加當(dāng)中.Google的大量產(chǎn)品部署著TFLite,比如Google Assistant,Google Photos等;國際巨頭比如Uber,Airbnb等[12],以及國內(nèi)的許多大公司,比如網(wǎng)易、愛奇藝和WPS等,都在使用TFLite.

一方面,端側(cè)機(jī)器學(xué)習(xí)能解決的問題越來越多元化,這帶來了應(yīng)用的大量繁榮.前期在圖像和視頻方面廣泛應(yīng)用,比如Google Lens[13],Google Photos,Google Arts & Culture[14].最近,離線語音識別方面有很多突破,比如Google Assistant宣布了完全基于神經(jīng)網(wǎng)絡(luò)的移動端語音識別[15],效果和服務(wù)器端十分接近,服務(wù)器模型需要2 GB大小,而手機(jī)端只需要80 MB.端側(cè)語音識別非常有挑戰(zhàn),它的進(jìn)展代表著端側(cè)機(jī)器學(xué)習(xí)時代的逐步到來.一方面依賴于算法的提高,另外一方面TFLite框架的高性能和模型優(yōu)化工具也起到了很重要的作用.離線語音可以帶來很好的用戶體驗,比如無需網(wǎng)絡(luò)環(huán)境即可使用,無隱私顧慮.Google Pixel 4手機(jī)上發(fā)布了Live Caption[16],自動把視頻和對話中的語言轉(zhuǎn)化為文字,大大提高了有聽力障礙人群的體驗(accessibility).更進(jìn)一步,端側(cè)自然語言處理將會有巨大的前景.我們發(fā)布了基于MobileBERT模型的問題回答系統(tǒng)[17-18],速度非???,在普通CPU上可實時響應(yīng),創(chuàng)造了無縫的用戶體驗.

另外一方面,模型越來越小,無處不再.Google Assistant的語音功能部署在非常多元的設(shè)備上,比如手機(jī)端、手表、車載和智能音箱上,全球超過10億設(shè)備.更激動人心的前景發(fā)生在IoT領(lǐng)域,TFLite可以支持微控制器(microcontrollers, MCU)[19],而MCU是單一芯片的小型計算機(jī),沒有操作系統(tǒng),只有內(nèi)存,也許內(nèi)存只有幾十KB.很多設(shè)備上都有MCU,全球有超過一千五百億的MCU.MCU低功耗、便宜、無處不在.TFLite發(fā)布了若干MCU上可運行的模型,比如識別若干關(guān)鍵詞的語音識別模型和簡單的姿態(tài)檢測模型,模型大小都只有20 KB左右,我們基于此可構(gòu)建很有意思的應(yīng)用,比如更智能的小玩具:它在MCU上運行上述模型,呼叫設(shè)定的特定呢稱時就會發(fā)出某個聲音,而當(dāng)拿起玩具做一些設(shè)定的動作時就會響應(yīng).當(dāng)隨處可見的物品都在MCU上部署機(jī)器學(xué)習(xí)的模型時,智能開始無處不在.

在中國,在移動應(yīng)用方面,網(wǎng)易使用TFLite做OCR處理[20];愛奇藝使用TFLite來進(jìn)行視頻中的AR效果[21],而WPS用它來做一系列文字處理[22].在IoT方面,出門問問智能音箱使用TFLite來做熱詞喚醒[23](對于智能音箱而言,準(zhǔn)確、實時、輕量化低功耗的喚醒非常關(guān)鍵),科沃斯掃地機(jī)器人使用TFLite在室內(nèi)避開障礙物[24].另外,TFLite也非常適合工業(yè)物聯(lián)智能設(shè)備的開發(fā),因為它很好地支持如樹莓派及其他基于Linux SoC的工業(yè)自動化系統(tǒng).創(chuàng)新奇智應(yīng)用TFLite開發(fā)智能質(zhì)檢一體機(jī)、智能讀碼機(jī)等產(chǎn)品,應(yīng)用到服裝廠質(zhì)檢等場景[25].

2 TensorFlow Lite系統(tǒng)架構(gòu)

我們設(shè)計TFLite,目標(biāo)是:

1) 輕量.縮小運行庫和模型大小,減少內(nèi)存消耗,適用于更多設(shè)備.

2) 高性能.針對移動和IoT設(shè)備深度優(yōu)化,利用多種硬件加速機(jī)器學(xué)習(xí),比如利用ARM CPU最新指令、GPU、DSP和NPU.

3) 跨平臺、兼容度高.支持安卓、iOS、嵌入式Linux以及MCU等多種平臺,支持多種“一次轉(zhuǎn)換,隨處部署”.

4) 易用.與TensorFlow緊密集成,實現(xiàn)從訓(xùn)練到部署過程流暢,提供豐富的平臺相關(guān)API,提供豐富的模型庫、完整的實例和文檔,以及豐富的工具鏈,降低開發(fā)者使用門檻.

5) 可擴(kuò)展性.模塊化,易定制,容易擴(kuò)展到更多硬件支持,定制更多算子.

Fig.1 Main components of TFLite圖1 TFLite的主要組成部分

圖1展示了TFLite的主要組成部分:

1) TFLite模型轉(zhuǎn)換器[26](converter).TFLite自帶一個轉(zhuǎn)換器,它可以把TensorFlow計算圖,比如SavedModel或GraphDef格式的TensorFlow模型,轉(zhuǎn)換成TFLite專用的模型文件格式,在此過程中會進(jìn)行算子融合和模型優(yōu)化,以壓縮模型,提高性能.

2) TFLite解釋執(zhí)行器(interpreter).進(jìn)行模型推理的解釋執(zhí)行器,它可以在多種硬件平臺上運行優(yōu)化后的TFLite模型,同時提供了多語言的API,方便使用.

3) 算子庫(op kernels).TFLite算子庫目前有130個左右,它與TensorFlow的核心算子庫略有不同,并做了移動設(shè)備相關(guān)的優(yōu)化.

4) 硬件加速代理(hardware accelerator delegate).我們將TFLite硬件加速接口稱delegate(代理),它可以把模型的部分或全部委托給另一個硬件后臺執(zhí)行,比如GPU和NPU.

圖2展示了在TensorFlow 2.0中TFLite模型轉(zhuǎn)換過程,用戶在自己的工作臺中使用TensorFlow API構(gòu)造TensorFlow模型,然后使用TFLite模型轉(zhuǎn)換器轉(zhuǎn)換成TFLite文件格式(FlatBuffers格式).在設(shè)備端,TFLite解釋器接受TFLite模型,調(diào)用不同的硬件加速器比如GPU進(jìn)行執(zhí)行.

Fig. 2 TFLite model conversion圖2 TFLite模型轉(zhuǎn)換過程

2.1 TensorFlow Lite模型轉(zhuǎn)換器

圖2中描述了模型轉(zhuǎn)換過程,轉(zhuǎn)換器可以接受不同形式的模型,包括Keras Model和SavedModel(TF 2.0中推薦的格式),開發(fā)者可以用tf.Keras或者低層級的TensorFlow API來構(gòu)造TensorFlow模型,然后使用Python API或者命令行的方式調(diào)用轉(zhuǎn)換器(推薦使用Python API,更靈活).比如:

1) Python API.調(diào)用tf.lite.TFLiteConverter,可用TFLiteConverter.from_saved_model(),或TFLiteConverter.from_keras_model();

2) 命令行:tflite_convert--saved_model_dir=tmpmobilenet_saved_model--output_file=tmpmobilenet.tflite

在TF 1.x版本中,還支持GraphDef格式,如果需要,請使用:tf.compat.v1.lite.TFLiteConverter.

轉(zhuǎn)換器做了2類優(yōu)化工作:

1) 算子優(yōu)化和常見的編譯優(yōu)化,比如算子融合、常數(shù)折疊(constant folding)或無用代碼刪除等.TFLite實現(xiàn)了一組優(yōu)化的算子內(nèi)核,轉(zhuǎn)化成這些算子能在移動設(shè)備上實現(xiàn)性能大幅度提升.比如讓我們將Relu融合到卷積等高級算子中,或優(yōu)化LSTM算子.

2) 量化的原生支持.在模型轉(zhuǎn)換過程中使用訓(xùn)練后量化(post-training quantization)非常簡單,不需要改變模型,最少情況只需多加一行代碼,設(shè)置converter.optimizations=[tf.lite.Optimize.DEFAULT].

2.2 TensorFlow Lite FlatBuffers格式

TFLite模型文件格式采用FlatBuffers[27].與Protocol Buffers[28]類似,F(xiàn)latBuffers是Google的一個開源的跨平臺序列化格式,最初為視頻游戲而設(shè)計.它在開發(fā)過程中更注重考慮實時性,內(nèi)存高效,這在內(nèi)存有限的移動環(huán)境中是極為關(guān)鍵的.它支持將文件映射到內(nèi)存中(mmap),然后直接進(jìn)行讀取和解釋,不需要額外解析.我們將其映射到干凈的內(nèi)存頁上,減少了內(nèi)存碎片化.另外,相對于Protocol Buffers,它有更小的依賴,因此也會減小二進(jìn)制文件大小.

TFLite代碼中schema.fbs[29]文件使用FlatBuffers定義了TFLite模型文件格式,我們摘取了其中一些關(guān)鍵樣例代碼,以幫助理解模型所包含的信息,如圖3所示.TFLite模型文件是一個層次的結(jié)構(gòu):

1) TFLite模型(model)由子圖(subgraph)構(gòu)成,同時包括用到的算子庫和共享的內(nèi)存緩沖區(qū).

2) 張量(Tensor,多維數(shù)組)用于存儲模型權(quán)重,或者計算節(jié)點的輸入和輸出,它引用Model的內(nèi)存緩沖區(qū)的一片區(qū)域,提高內(nèi)存效率.

3) 每個算子實現(xiàn)有一個OperatorCode,它可以是內(nèi)置的算子,也可以是自定制算子,有一個名字.

4) 每個模型的計算節(jié)點(operator)包含用到的算子索引,以及輸入輸出用到的Tensor索引.

5) 每個子圖包含一系列的計算節(jié)點、多個張量,以及子圖本身的輸入和輸出.

Fig. 3 TFLite schema.fbs samples[29]圖3 TFLite schema.fbs樣例代碼[29]

模型轉(zhuǎn)換器最早來源于TFMini項目,稱為TOCO轉(zhuǎn)換器.最近我們基于Google最新的機(jī)器學(xué)習(xí)編譯技術(shù)MLIR[30]重寫了轉(zhuǎn)換器,將算子的TensorFlow dialect映射到算子的TFLite dialect.它提供了更好的轉(zhuǎn)換錯誤追蹤和調(diào)試功能,也支持了更多的新模型(比如Mask R-CNN,Mobile BERT),特別是對控制流(control flow)有更好的支持.另外,也讓TFLite轉(zhuǎn)換器具有更好的可擴(kuò)展性,同時可以利用機(jī)器學(xué)習(xí)編譯技術(shù)的最新成果.

2.3 TensorFlow Lite解釋執(zhí)行器

TFLite解釋執(zhí)行器[31]針對移動設(shè)備從頭開始構(gòu)建,具有3個特點:

1) 輕量級.在32 b安卓平臺下,編譯核心運行時得到的庫大小只有100 KB左右,如果加上所有TFLite的標(biāo)準(zhǔn)算子,編譯后得到的庫大小是1 MB左右.它依賴的組件較少,力求實現(xiàn)不依賴任何其他組件.

2) 快速啟動.既能夠?qū)⒛P椭苯佑成涞絻?nèi)存中,同時又有一個靜態(tài)執(zhí)行計劃,在轉(zhuǎn)換過程中,我們基本上可以提前直接映射出將要執(zhí)行的節(jié)點序列.采取了簡單的調(diào)度方式,算子之間沒有并行執(zhí)行,而算子內(nèi)部可以多線程執(zhí)行以提高效率.

3) 內(nèi)存高效.在內(nèi)存規(guī)劃方面,采取了靜態(tài)內(nèi)存分配.當(dāng)運行模型時,每個算子會執(zhí)行prepare函數(shù),它們做必要的內(nèi)存分配.我們會分配一個單一的內(nèi)存塊,而這些張量會被整合到這個大的連續(xù)內(nèi)存塊中.不同張量之間甚至可以復(fù)用內(nèi)存以減少內(nèi)存分配.

參照圖3中TFLite模型格式,我們會執(zhí)行模型的子圖,而根據(jù)數(shù)據(jù)依賴關(guān)系,子圖中的計算節(jié)點已經(jīng)被提前靜態(tài)規(guī)劃好,保證每個計算節(jié)點在執(zhí)行前它所需要的張量已經(jīng)被之前的計算準(zhǔn)備好.所以,總體上依次執(zhí)行即可.

使用解釋執(zhí)行器通常需要包含4步:

1) 加載模型.將TFLite模型加載到內(nèi)存中,該內(nèi)存包含模型的執(zhí)行圖.

2) 轉(zhuǎn)換數(shù)據(jù).模型的原始輸入數(shù)據(jù)通常與所期望的輸入數(shù)據(jù)格式不匹配.例如,可能需要調(diào)整圖像大小,或更改圖像格式,以兼容模型.

3) 運行模型推理.使用TFLite API執(zhí)行模型推理.

4) 解釋輸出.解釋輸出模型推理結(jié)果.比如,模型可能只返回概率列表,而我們需要將概率映射到相關(guān)類別,并將其呈現(xiàn)給最終用戶.

TFLite提供了多種語言的API,正式支持的有Java,C++和Python,實驗性的包括C,Object C,C#和Swift.大家可以從頭自己編譯TFLite,也可以利用已編譯好的庫,Android開發(fā)者可以使用JCenter Bintray的TFLite AAR,而iOS開發(fā)者可通過CocoaPods在iOS系統(tǒng)上獲取.

Fig. 4 TFLite Java API code samples圖4 TFLite Java API代碼樣例

圖4是使用Java API的一個示例:創(chuàng)建輸入緩沖區(qū)和輸出緩沖區(qū),填充輸入,并定制推理選項(比如是否使用GPU).之后創(chuàng)建TFLite執(zhí)行器,輸入TFLite模型并執(zhí)行.

2.4 高性能算子庫和可擴(kuò)展性

目前TFLite約有130個算子(op kernels),大多同時支持浮點和量化類型,可以在這里找到所有支持的算子[32].很多算子專門針對ARM CPU進(jìn)行了優(yōu)化,包括基于匯編和intrinsics級別的NEON指令集的多種優(yōu)化.針對矩陣相乘,算子之前浮點運算使用Eigen,量化運算使用gemmlowp[33],最近我們重新設(shè)計了一個叫Ruy[34]的高性能矩陣相乘庫,統(tǒng)一了浮點運算和量化運算,并且性能有較大提升.特別針對一些重度使用的算子做了深度優(yōu)化,比如涉及到卷積或者LSTM的算子.另外,不少算子支持多線程執(zhí)行.

算子的定義基于C語言接口TfLiteRegistration,包括4個函數(shù)(init,free,prepare,invoke),開發(fā)者可方便自定義算子.

在創(chuàng)建解釋器時,用戶可以提供自定義的算子解析器(OpResolver),從而控制模型執(zhí)行所用到的算子實現(xiàn),如圖5所示.使用內(nèi)置算子解析器(BuiltinOpResolver)時使用默認(rèn)的算子.每個算子都有自己的版本控制.我們還提供機(jī)制,把不用的算子自動刪掉.

Fig. 5 TFLite customized op圖5 TFLite自定義算子

當(dāng)遇到不能支持的算子時,可以自定義算子,另外一種選擇是,復(fù)用TensorFlow算子,稱為Select TF Ops,只需要多加一行轉(zhuǎn)換器參數(shù)就可以開啟:

converter.target_spec.supported_ops=[tf.lite.OpsSet.TFLITE_BUILTINS,tf.lite.OpsSet.SELECT_TF_OPS]

它可能帶來的問題是所依賴的運行庫更大,同時TensorFlow算子在移動設(shè)備中未必足夠優(yōu)化.

2.5 CPU性能

CPU最具普適性,其性能最為關(guān)鍵,因此我們持續(xù)不斷提升CPU性能.矩陣運算(GEMM[35])效率對于深度學(xué)習(xí)非常關(guān)鍵,過去我們使用gemmlowp[33]庫進(jìn)行量化矩陣乘法,使用Eigen庫進(jìn)行浮點乘法.最近,我們從頭開發(fā)了一個針對移動環(huán)境CPU特別優(yōu)化的矩陣乘法庫Ruy[34],統(tǒng)一了浮點運算和量化運算.之前面向桌面和云端的矩陣乘法庫則更加專注于大矩陣乘法的峰值性能,而Ruy對各種矩陣大小的乘法都表現(xiàn)優(yōu)異:不僅適合大矩陣,也適合當(dāng)前TFLite應(yīng)用中最常見的矩陣運算(往往是小矩陣或者多種多樣的矩陣形狀).Ruy目前支持浮點數(shù)和8 b整型,主要針對ARM CPU(64 b和32 b),而我們也在針對英特爾x86架構(gòu)進(jìn)行優(yōu)化.

自TensorFlow 1.15版本開始,Ruy在所有ARM設(shè)備上默認(rèn)啟用,大范圍地加速了模型,特別是那些卷積比較多的視覺模型,將延遲降低了1.2~5倍,尤其在具有NEON點積內(nèi)置函數(shù)的硬件上.圖6以最常見的MobileNet V1為例,浮點模型和量化模型都有明顯提高.

Fig. 6 Single thread CPU on Pixel4 圖6 Pixel 4上單線程CPU性能

性能提升工作需要持續(xù)不斷的努力,另一個即將到來的新突破,是全新的高度優(yōu)化后的浮點卷積核庫XNNPACK[36].在TFLite支持的所有關(guān)鍵浮點卷積模型上的測試結(jié)果表明,XNNPACK可以進(jìn)一步提高執(zhí)行速度.

Fig. 7 Single thread CPU performance improvement with XNNPACK (Jun 2020)圖7 使用XNNPACK后單線程CPU性能提升比例(2020年6月)

以MobileNet V1浮點模型為例,如圖7所示,在多種硬件平臺上,使用XNNPACK后,單線程CPU性能提升達(dá)20%~200%.比如在X86 Windows平臺上,有了2倍的提升.我們將在TensorFlow 2.3版本中集成XNNPACK,并計劃在2.4版本中對于浮點模型,在所有平臺中默認(rèn)使用XNNPACK.

2.6 硬件加速器代理

我們將TFLite硬件加速接口稱delegate[37](代理),它可以把模型計算圖的部分或全部代理給另一個執(zhí)行器,讓它們在硬件加速器中執(zhí)行.在圖8示例中,整個計算圖一部分在CPU中執(zhí)行,另一部分子圖被代理給硬件加速器執(zhí)行.

Fig. 8 TFLite hardware delegate example圖8 TFLite硬件加速器代理示意

我們不是把算子逐一放到加速器上執(zhí)行,而是將計算圖的整個子圖在加速器上運行,這對于GPU或NPU(神經(jīng)網(wǎng)絡(luò)加速器)等需要在設(shè)備上盡可能多地進(jìn)行計算,且中間沒有CPU互操作的設(shè)備而言,是一個巨大的優(yōu)勢.

TFLite有著非常豐富的硬件加速器支持:在Android系統(tǒng)中,支持NNAPI,GPU,EdgeTPU和Hexagon DSP delegates;在iOS系統(tǒng)中,有Metal和CoreML delegates.

1) GPU delegate[38].適用于跨平臺.GPU delegate可在Android和iOS上使用,支持32 b和16 b浮點的模型,對許多浮點卷積模型實現(xiàn)了大幅度速度提升,尤其是較大的模型.不過,運行庫大小會有小幅度的增加.GPU的驅(qū)動可以有不同的后端,Android系統(tǒng)有OpenGL,OpenCL和VulKan后端,以及iOS上基于Metal的后端.我們最近增加了對OpenCL的支持,在多個視覺模型上進(jìn)行的測試表明,基于OpenCL的GPU delegate的性能提升為CPU上的4~6倍和OpenGL的2倍.圖9是三者在Pixel 4上測試后端性能的對照結(jié)果.

Fig. 9 TFLite GPU performance圖9 TFLite GPU性能

2) Android NNAPI delegate[39].適用于較新的Android設(shè)備.NNAPI delegate可用于在具有GPU,DSP和NPU的Android設(shè)備上加速模型.它在Android 8.1(API 27+)或更高版本中可用.NNAPI[40]是Android系統(tǒng)中用于加速機(jī)器學(xué)習(xí)的抽象層.在NNAPI和TFLite中,我們會發(fā)現(xiàn)高級算子的定義有很多相似之處,因為二者是緊密聯(lián)系在一起進(jìn)行開發(fā)的.NNAPI是Android平臺級的硬件加速器抽象層,我們可以通過TFLite調(diào)用它,而供應(yīng)商比如高通則為NNAPI提供DSP或GPU的驅(qū)動程序.在Android Q上,NNAPI真正進(jìn)入了一個良好的穩(wěn)定狀態(tài),功能和算子方面都正在接近TFLite的同等水平.有越來越多的用戶和硬件供應(yīng)商予以采用,這促進(jìn)了這些驅(qū)動程序的發(fā)展.

3) Hexagon delegate[41](DSP).適用于較舊的Android設(shè)備.Hexagon DSP是一種微處理器,常見于大量使用高通驍龍SoC的安卓手機(jī).與CPU相比,新的TFLite Hexagon delegate利用DSP實現(xiàn)了MobileNet和InceptionV3等模型,性能大幅提升,提升幅度可達(dá)3~25倍,同時CPU和GPU的能效也得到了提升[42].它可以在不完全支持NNAPI的舊版Android設(shè)備上使用.

4) Core ML delegate[43].適用于較新的iPhone和iPad.CoreML是在蘋果設(shè)備上使用的機(jī)器學(xué)習(xí)框架,它還提供了在Neural Engine上運行機(jī)器學(xué)習(xí)模型的API.CoreML delegate允許在CoreML和Neural Engine(如果設(shè)備有相關(guān)芯片)上運行TFLite模型,以更低的功耗實現(xiàn)更快的推理速度.在含有Neural Engine的iPhone XS以及后續(xù)發(fā)布的設(shè)備上,測試表明各種計算機(jī)視覺模型的性能提高了1.3~11倍[44].

圖10給出了使用TFLite GPU delegate的Java示例,只需要多加幾行代碼,非常簡單,而其他delegate也類似.值得注意的是,圖中的delegate.bindGlBufferToTensor可以使用OpenGL紋理作為計算圖輸入,這樣數(shù)據(jù)就不用復(fù)制,減少在CPU和GPU之間來回傳送數(shù)據(jù).

Fig. 10 Use TFLite GPU delegate in Java圖10 使用TFLite GPU delegate的Java示例

可擴(kuò)展性是TFLite很重要的設(shè)計目標(biāo),如果一些硬件后端默認(rèn)還不支持,完全可以自己定制delegate,只需要:

1) 定義一個新的delegate算子,它負(fù)責(zé)計算被代理的子圖.

2) 創(chuàng)建一個TfLiteDelegate實例,它負(fù)責(zé)注冊新定義的delegate算子,并可以把計算圖中的一些子圖替換為新的delegate算子.

這樣,應(yīng)用開發(fā)者可以利用新的加速器,同時硬件廠商也可以擴(kuò)展對TFLite的支持,從而觸及更多的用戶.

我們正在持續(xù)改進(jìn)如何更方便地實現(xiàn)一個新TFLite delegate,以及提供可擴(kuò)展的工具鏈來驗證測試這一新delegate.目前推薦擴(kuò)展SimpleDelegate相關(guān)APIs[45]來實現(xiàn),具體可以參考我們提供的簡單案例[46]來進(jìn)一步了解,包括如何集成到我們的測試和驗證工具鏈當(dāng)中.更多請參考delegate使用開發(fā)指南[37].

2.7 TensorFlow Lite微控制器版

1.4節(jié)提到,MCU沒有操作系統(tǒng),只有極小內(nèi)存,低功耗、便宜、無處不在.真正在MCU上部署機(jī)器學(xué)習(xí)模型變得很普及時,智能開始無處不在.TFLite可以支持微控制器MCU,為IoT領(lǐng)域的智能化帶來很多想象空間.

TFLite微控制器版(TFLite for Microcontrollers)[47]接受和TFLite同樣的FlatBuffers模型格式,讓同樣的模型可運行在手機(jī)和MCU上,減輕了開發(fā)者負(fù)擔(dān).它的核心運行庫在Arm Cortex M3上小于16 KB,加上一些關(guān)鍵詞檢測的算子,總共只需要22 KB.

它支持ARM Cortex-M系列芯片以及其他架構(gòu)比如ESP32.也可以作為Arduino庫,對MBed開發(fā)環(huán)境也有很好的支持.最近,Cadence宣布旗下的Tensilica HiFi DSP系列也支持TFLite微控制器版[48].

MCU上的模型都非常小,低功耗,只能完成簡單的功能,不過可以常駐內(nèi)存,一直處于等待觸發(fā)狀態(tài).一般常見的用法是級聯(lián)觸發(fā):比如先用MCU的一個模型檢測是否有聲音,如果是,另一個MCU模型判斷這是不是人的聲音(排除外界噪音),更進(jìn)一步才開啟設(shè)備CPU上更強(qiáng)大的語音識別功能.如果設(shè)備需要開啟CPU持續(xù)監(jiān)聽外界的聲音,功耗會很大.

我們開源了很多有意思的樣例,比如:

1) 識別若干關(guān)鍵詞的語音識別模型,只有20 KB左右.

2) 魔法棒.只需要20 KB左右的模型就可以做姿態(tài)檢測,這很適合一些使用加速計數(shù)據(jù)的應(yīng)用.

3) 人物識別.250 KB的視覺模型識別攝像頭是否有人出現(xiàn).

3 使用TensorFlow Lite的最佳實踐

3.1 解決模型轉(zhuǎn)換挑戰(zhàn)

目前TFLite約有130個算子,大多同時支持浮點和量化類型,可以在這里找到所有支持的算子[32].TensorFlow有一些語義在TFLite中尚未得到很好的原生支持,同時在模型轉(zhuǎn)換過程中算子進(jìn)行了優(yōu)化和融合.總結(jié)一下TensorFlow算子和TFLite算子的兼容性:

1) 大多TFLite算子支持float32和量化(int8,uint8),不過很多算子尚不支持bfloat16或string.

2) TFLite目前只支持TensorFlow的某些固定格式,而廣播只支持有限的一些ops(比如tf.add,tf.mul,tf.sub,andtf.div,tf.min,tf.max).

3) 一些TensorFlow算子有嚴(yán)格對應(yīng)的TFLite算子,比如tf.nn.avg_pool,tf.nn.conv2d,tf.nn.depthwise_conv2d,tf.nn.l2_normalize,tf.nn.max_pool,tf.nn.softmax,tf.nn.top_k等,以及tf.matmul,tf.one_hot,tf.reduce_mean,tf.reshape,tf.sigmoid,tf.squeeze,tf.strided_slice,tf.transpose等.詳細(xì)清單請參考文獻(xiàn)[32].

4) 另外很多TensorFlow算子,沒有一一對應(yīng)的TFLite算子,不過TFLite仍可以支持,在模型轉(zhuǎn)換過程得到優(yōu)化.這些TensorFlow算子可能被刪除(比如tf.identity),替換(比如tf.placeholder被換成張量),或者融合為更復(fù)雜的操作(比如tf.nn.bias_add).詳細(xì)清單請參考文獻(xiàn)[32].

如遇到模型轉(zhuǎn)換問題,請嘗試如下解決方法:

1) 自定義算子.可以自定義新的算子,或者提供定制的更優(yōu)化的算子.這種方式對于開發(fā)者而言最靈活,可控性高.

2) 使用其他等價算子.可以替換為其他TFLite能支持的算子,假設(shè)模型更改后精度和速度等方面沒有明顯損失.

3) Select TF Ops.可以重用TensorFlow算子,缺點是二進(jìn)制文件大小會有所增加,速度也可能會慢些.

5) 控制流(control flow)支持.最新的基于MLIR的模型轉(zhuǎn)換器已經(jīng)對此有不錯的支持.

6) 動態(tài)張量形狀(dynamic tensor shape)的支持.目前對動態(tài)張量形狀支持有限,需要在轉(zhuǎn)化時將輸入設(shè)置成固定大小,隨后在運行時調(diào)用ResizeInput.設(shè)置輸入為固定大小的技巧包括調(diào)整圖片大小,或者為文字加填充.

一方面,算子在不斷增加中,我們也在為TFLite增加動態(tài)張量形狀等更多新功能的支持.持續(xù)關(guān)注社區(qū)和github更新,可嘗試每日更新的代碼是否已支持;還可以向社區(qū)發(fā)issue或者直接貢獻(xiàn)代碼.

3.2 進(jìn)行模型優(yōu)化

壓縮模型可以加速模型執(zhí)行,更好地利用硬件加速器,特別是當(dāng)一些加速器只能接受全整型的模型時.模型壓縮領(lǐng)域是很熱的研究話題,而我們則更關(guān)注足夠簡單的開發(fā)體驗,希望用戶只需要幾行代碼就可以實現(xiàn).TensorFlow提供了一個模型優(yōu)化工具包(TensorFlow model optimization toolkit, MOT)[52],簡化模型優(yōu)化過程.MOT被很好地集成到了TFLite工具鏈中,可在TFLite模型轉(zhuǎn)換時輕松啟用.

MOT目前主要支持2類優(yōu)化:

1) 量化(quantization).降低模型參數(shù)精度,比如將浮點轉(zhuǎn)換成整型.

2) 剪枝(pruning).減少模型參數(shù),比如去掉那些不重要的權(quán)重(比如為0的權(quán)重).

從開發(fā)者使用體驗來看,又可以分為:

1) 訓(xùn)練后(post-training).比如訓(xùn)練后量化(post-training quantization),不需要改變模型,非常簡單.

2) 訓(xùn)練中(training-aware).需要改動模型,在訓(xùn)練的時候優(yōu)化.

推薦訓(xùn)練后量化(post-training quantization)[53],足夠簡單,只要能滿足需求.

Table 1 TFLite Post-Training Quantization

Fig. 11 Quantization: map 32 b float to 8 b integer圖11 量化:將32 b浮點數(shù)映射到8 b整數(shù)

最初引入的是動態(tài)范圍量化(dynamic range quantization),它可以動態(tài)地對輸入和激活函數(shù)做量化和去量化,是一種混合量化:當(dāng)有量化算子支持時,調(diào)用量化算子核,否則使用浮點算子核,整個執(zhí)行過程混合了2類算子.精度上會有所損失,損失多大取決于具體模型.圖11展示了如何將32 b浮點數(shù)映射到8 b整數(shù).它貴在簡單,只需在轉(zhuǎn)化時多加一行代碼:converter.optimizations=[tf.lite.Optimize.DEFAULT].

而全整型量化[54]可以同時量化權(quán)重和激活函數(shù),這樣所有的權(quán)重和計算都是整形的,可以進(jìn)一步改善延遲,減少峰值內(nèi)存使用量,以及利用僅支持整數(shù)的硬件加速器.

為進(jìn)一步提高精度,我們支持了按軸量化或按通道量化:不會對整個張量使用同一組量化參數(shù),而是對張量中每個通道使用不同的量化參數(shù).為此,需要使用代表性數(shù)據(jù)集來評估激活函數(shù)和輸入的動態(tài)范圍,幫助確定量化參數(shù),這樣可以實現(xiàn)與訓(xùn)練時量化大體相當(dāng)?shù)木_度.對于一個基于圖片的模型而言,或許只需要輸入30張圖片,就能夠探索出量化和輸出值的空間.

開發(fā)者只需創(chuàng)建一個輸入數(shù)據(jù)生成器,并將代表性數(shù)據(jù)提供給TFLite轉(zhuǎn)換器即可:

converter.representative_dataset=representative_dataset_gen

如有GPU,則考慮使用16 b浮點數(shù),進(jìn)一步減少精度損失:

converter.target_spec.supported_types=[tf.lite.constants.FLOAT16]

訓(xùn)練時優(yōu)化,需要對于模型訓(xùn)練過程做一些改變,相對更復(fù)雜.為盡量簡化用戶體驗,MOT針對Keras提供了非常便捷的API.目前可以支持:

1) 訓(xùn)練時量化(training-aware quantization).可以量化整個Keras模型和部分Keras模型節(jié)點.

2) 剪枝(pruning).去掉一些權(quán)重,讓模型更稀疏.

比如量化整個Keras模型只需要增加一行:

quantized_model=mot.quantization.keras.quantize_model(keras_model)

MOT在壓縮Google的一些關(guān)鍵模型發(fā)揮著重要作用,比如1.4節(jié)提到的離線語音模型.我們一直致力于開發(fā)一些更易用的工具,既簡化操作,又能夠在模型壓縮比和加速性能方面同樣優(yōu)異.比如,之前的訓(xùn)練時量化工具需要在模型中插入偽量化(fake quantization)節(jié)點,相對復(fù)雜,因此我們發(fā)布了新的更易使用的基于Keras訓(xùn)練時量化[55].

我們也在探索更多壓縮方法的支持,比如張量壓縮算法或者模型蒸餾.

3.3 減少運行庫大小

除了壓縮模型本身,我們也希望減少運行庫大小.一個技巧就是只鏈接所需要的算子,因為通常一個模型只用到部分算子,我們稱之為選擇性注冊(selective registration).

TFLite有很好的可擴(kuò)展性,可以自己定義算子和算子解析器.我們在tensorflowlitetools下提供了工具,給定一個模型,可以掃描用到的算子,自動生成一個注冊實際算子的代碼文件,這樣利用自定義的算子解析器,就可以刪除不用的算子內(nèi)核.

3.4 選擇正確的模型

選擇合適的模型非常關(guān)鍵,這很大程度上取決于應(yīng)用的需求,比如:

1) 模型大小的限制;

2) 模型延遲的需求;

3) 精度要求;

4) 硬件運行環(huán)境.

可以嘗試不同的模型,對各個方面做取舍.比如,如果精度要求高而硬件許可,可以選擇較復(fù)雜的模型;而速度最關(guān)鍵時,選擇簡單而精度低的模型.

研究領(lǐng)域發(fā)布的模型日新月異,開發(fā)人員很難時刻跟進(jìn),另外,論文上的精度更多是理想情況,是否在真實場景下有穩(wěn)定表現(xiàn)還需要根據(jù)實際場景評估.通常情況下,我們可以從一些經(jīng)典的針對移動特別優(yōu)化的在工業(yè)界久經(jīng)考驗的模型開始,比如MobileNet.

可以嘗試在目標(biāo)手機(jī)上運行一些TFLite的參考應(yīng)用[56],感受模型實際取得的效果,比如對象追蹤應(yīng)用的流暢程度.

TFHub上提供了一系列的經(jīng)典模型[57],既有預(yù)訓(xùn)練的TF模塊,可做遷移學(xué)習(xí)后轉(zhuǎn)換到TFLite模型,也可以直接下載TFLite模型.機(jī)器學(xué)習(xí)是一個飛速發(fā)展的領(lǐng)域,也許每隔幾個月就有新的模型刷新記錄.我們在努力確保最前沿(SOTA)的模型可以在TFLite上運行.

最近,我們增加了對EfficientNet-Lite(圖像分類模型系列)[58],MobileBERT[59]和ALBERT-Lite[60](支持多種NLP任務(wù)的輕量級版本BERT)的支持.

EfficientNet-Lite是一種新穎的圖像分類模型,可通過減少計算和參數(shù)的數(shù)量級來實現(xiàn)SOTA的準(zhǔn)確性.它針對TFLite量化方式進(jìn)行了優(yōu)化,在損失較低精度(幾乎可忽略)的同時大大提升了推理速度,并可以運行在CPU,GPU和EdgeTPU上[61].

圖12中,在相似的高精度下,EifficientNet-Lite4比Inception V4有顯著的速度提升.

Fig. 12 Benchmarked on Pixel 4 CPU with 4 threads (March 2020)圖12 在四線程Pixel 4 CPU上做基準(zhǔn)測試(2020年3月)

Fig. 13 Benchmarked on Pixel4,Float32 QA model, 4 threads CPU圖13 在Pixel 4,F(xiàn)loat32問答模型,4線程CPU上評測

MobileBERT[62]和ALBERT-Lite[63]是流行的BERT模型的優(yōu)化版本,該模型在一系列NLP任務(wù)(包括問答、自然語言推斷等)上均達(dá)到了SOTA的準(zhǔn)確度.圖13中,MobileBERT的體積是BERT的14,速度是BERT的4倍,同時保持了相近的準(zhǔn)確度.ALBERT-Lite的體積甚至更小,僅有BERT的16,也就是MobileBERT體積的23,在速度上ALBERT-Lite稍遜于MobileBERT.我們還在探索量化版本的MobileBERT,它是BERT的116,速度是BERT的8倍,同時也保持了相近的準(zhǔn)確度,MLPerf社區(qū)正嘗試基于此建立移動硬件加速的NLP測試基準(zhǔn).

3.5 性能的最佳實踐

TFLite性能測試工具[64]可以找出在特定設(shè)備上運行時的性能瓶頸,輸出耗時長的算子,還可以插入不同的計算后端,并探索它究竟是如何影響推理性能的.它支持對內(nèi)部事件(如算子調(diào)用)的檢測日志記錄,可以通過Android的系統(tǒng)跟蹤(system tracing)[65]進(jìn)行追蹤.

以下是性能分析工具給出的分析示例,及性能提升的備選解決方案:

1) 如果可用的CPU內(nèi)核數(shù)量少于推理線程的數(shù)量,則CPU調(diào)度開銷可能會導(dǎo)致性能下降.可以在應(yīng)用程序中重新調(diào)度其他大量占用CPU的任務(wù),以避免與模型推斷重疊,或嘗試調(diào)整解釋器線程的數(shù)量.

2) 如果算子沒有完全被代理到GPU上執(zhí)行,那么模型計算圖中的某些部分將在CPU上執(zhí)行,而不是按預(yù)想的在硬件加速器上執(zhí)行.可以將不支持的算子替換為相似的已支持算子.

盡可能優(yōu)化模型,比如量化.盡可能地使用硬件加速器,也注意一些性能負(fù)擔(dān),比如內(nèi)存零拷貝.

當(dāng)然,移動平臺可能具有多種硬件加速器,而模型的選擇也很多(比如模型類型、量化或浮點),組合起來比較復(fù)雜.同時這些加速器也可能需要被用作其他用途,比如GPU可能需要預(yù)留給視頻處理,這帶來了優(yōu)化的復(fù)雜度.通常情況下,需要在不同平臺上嘗試運行應(yīng)用,統(tǒng)計數(shù)據(jù),根據(jù)數(shù)據(jù)進(jìn)行優(yōu)化.我們也在探索提供更好的開發(fā)者工具支持.

3.6 TensorFlow Lite的使用限制

由于TensorFlow算子豐富,而新模型也不斷出現(xiàn),雖然TFLite覆蓋了很多常見的模型,對于普通開發(fā)者,模型轉(zhuǎn)換仍是較大的痛點.請參考3.1節(jié)部分解決,比如自定義算子,利用Select TF Ops.

TFLite目前對動態(tài)張量形狀支持有限,需要在轉(zhuǎn)化時將輸入設(shè)置成固定大小,隨后在運行時調(diào)用ResizeInput.很多TFLite ops可能還不支持bfloat和string.另外,TFLite目前只支持TensorFlow的某些固定格式,而廣播只支持有限的一些ops(比如tf.add,tf.mul,tf.sub,andtf.div,tf.min,tf.max)[32].

硬件加速部分,delegate的算子不支持仍是主要挑戰(zhàn).總體而言,CPU算子有較好的覆蓋率,而GPU和DSP等覆蓋率相對小一些;而NNAPI的算子則更新速度較慢,且其硬件驅(qū)動的性能不一,建議進(jìn)行實際模型性能測試.如碰到問題,歡迎到社區(qū)里反饋.

社區(qū)對于個性化的應(yīng)用和聯(lián)邦學(xué)習(xí)(federated learning[66])的興趣逐步增強(qiáng),因此對于端側(cè)訓(xùn)練的需求越來越多.目前TFLite對于端側(cè)訓(xùn)練還不支持.我們提供了一個TFLite案例,允許有限的端側(cè)模型遷移,從而讓端側(cè)模型個性化,不過使用相對復(fù)雜[67].

4 適合初學(xué)者的工具

4.1 預(yù)訓(xùn)練模型和完整參考示例

我們提供了預(yù)訓(xùn)練模型的代碼庫和實現(xiàn)這些模型的示例應(yīng)用[56,68],開發(fā)者無需編寫任何代碼即可在實際設(shè)備上試用TFLite模型,并可以在github找到完整應(yīng)用代碼,包括模型的前處理和后處理.包括多種案例,比如對象追蹤、風(fēng)格遷移和問題回答,也包括不同平臺的例子,比如Android、WiOS、樹莓派及MCU.

比如,在手機(jī)上實現(xiàn)問題問答[17]是一個很有挑戰(zhàn)的問題,我們發(fā)布了基于MobileBERT的參考應(yīng)用,學(xué)術(shù)界的多個BERT模型可以在這個應(yīng)用上運行.風(fēng)格遷移模型[69]啟發(fā)了Google Arts & Culture的產(chǎn)品新特性[14].

對于視頻處理應(yīng)用,MediaPipe[70]提供了很好的框架,可以和TFLite配合使用.MediaPipe也有豐富應(yīng)用例子,比如手勢追蹤.

另外,社區(qū)github項目“Awesome TFLite”[71],收集了很多有意思的示例.

4.2 TensorFlow Lite Model Maker

TFLite Model Maker[72]使用遷移學(xué)習(xí),可讓開發(fā)者在自己的數(shù)據(jù)集上應(yīng)用最前沿的機(jī)器學(xué)習(xí)模型.它將復(fù)雜的機(jī)器學(xué)習(xí)概念封裝在直觀的API中,無需機(jī)器學(xué)習(xí)專業(yè)知識,只需幾行代碼即可訓(xùn)練最新的圖像分類模型:

Fig. 14 TFLite Model Maker example圖14 TFLite Model Maker示例

ModelMaker支持TensorFlowHub上的許多最新模型,如3.5節(jié)EfficientNet-Lite.如果想獲得更高的準(zhǔn)確率,僅需修改一行代碼,即可切換到不同的模型架構(gòu).目前支持圖片分類和文本分類任務(wù),我們還在不斷擴(kuò)展其功能.

4.3 TensorFlow Lite Support庫

執(zhí)行模型推理前,通常需要對輸入數(shù)據(jù)做轉(zhuǎn)換,稱為前處理,比如圖片裁剪和大小挑戰(zhàn).而推理之后,如何解讀數(shù)據(jù),又需要做后處理.

為簡化開發(fā)流程,我們提供了TFLite Support[73]庫,它提供了一系列工具庫.目前支持圖片處理庫,更多數(shù)據(jù)類型(比如NLP)和更多平臺(比如iOS)的支持正在進(jìn)展當(dāng)中.

4.4 模型元數(shù)據(jù)、自動代碼生成和Android Studio工具

直接使用TFLite解釋器,它的輸入輸出都是張量.這帶來了2個問題:

1)TFLite模型的使用者將需要確切地知道一個1×224×224×3張量的含義.比如它是位圖嗎?特別是模型創(chuàng)建團(tuán)隊和使用團(tuán)隊不是同一個時,更容易出問題.

2)對高維數(shù)據(jù)進(jìn)行轉(zhuǎn)換時容易出錯,例如把Bitmap轉(zhuǎn)換為RGB浮點數(shù)組或者ByteArray.

我們希望把模型調(diào)用并做前后處理的整個復(fù)雜過程都封裝到一個簡單的API中,開發(fā)者只需要調(diào)用簡單4~5行代碼,而且可以直接使用他們熟悉的原生數(shù)據(jù),比如Android開發(fā)時直接用Bitmap,而不是轉(zhuǎn)化為ByteArray.

為此,TFLite增加了對模型元數(shù)據(jù)的支持[74],這讓模型創(chuàng)建者可以使用類型化的對象來描述模型的輸入和輸出,方便模型共享和自動化處理.更進(jìn)一步,提供了一個Android代碼生成器[75],給定模型,它可以讀取元數(shù)據(jù),自動生成封裝好的Java類,它可以自動調(diào)整圖片大小,對其進(jìn)行歸一化且從ByteArray進(jìn)行轉(zhuǎn)換.

更進(jìn)一步,我們正將此功能集成到Android Studio的ML model binding工具中[76],只需要把模型導(dǎo)入到Android Studio中就可以生成代碼,目前已提供試用版,請參考文獻(xiàn)[77].

5 未來的方向

TFLite作為開源項目,為了更好地與社區(qū)互動,我們提前公開了開發(fā)計劃[78],以確保所從事的工作和優(yōu)先級清晰明了.

性能是我們持續(xù)關(guān)注的重點.我們正在集成XNNPACK以便于進(jìn)一步優(yōu)化浮點模型,還在提升訓(xùn)練后量化的性能,以便加快CPU推理速度.增加更多優(yōu)化的算子,并讓現(xiàn)有的硬件加速器delegate支持更多算子,以便加速更多模型,支持更多的硬件加速器.在有多個異構(gòu)加速器的情況下,探索如何提供更簡易的工具,幫助發(fā)揮出其最佳性能.

簡化開發(fā)者體驗很關(guān)鍵.我們會持續(xù)不斷更新最前沿的端側(cè)模型以及相關(guān)的示例,展示更多的可能性.增強(qiáng)TFLite Model Maker,支持更多任務(wù),例如目標(biāo)檢測,支持BERT系列的NLP任務(wù).更豐富的TFLite Support庫.擴(kuò)展模型元數(shù)據(jù)和代碼生成工具,以支持更多用例,以及與Android Studio的無縫集成,進(jìn)一步簡化體驗.提供更便捷工具,幫助用戶根據(jù)模型來減少算子庫,壓縮運行時間.

進(jìn)一步讓TensorFlow模型到TFLite模型轉(zhuǎn)化更流暢,比如更好地支持RNNLSTM和動態(tài)形狀、模型轉(zhuǎn)換過程更好的語義匹配(比如只轉(zhuǎn)換部分計算圖).長期看來,如何更好地融合TensorFlow和TFLite,共享算子和核心庫,同時,也兼具移動平臺的優(yōu)化.

提供更豐富的模型優(yōu)化工具,比如剪枝、張量壓縮和蒸餾技術(shù).

在TFLite微控制器版中,和社區(qū)合作支持更多芯片平臺、更多算子,同時提供更多適合MCU的樣例模型和應(yīng)用.

更好地支持聯(lián)邦學(xué)習(xí),保護(hù)用戶隱私.更好地支持端側(cè)訓(xùn)練,支持個性化應(yīng)用.

致謝感謝TensorFlow團(tuán)隊,特別是Tensor-Flow Lite團(tuán)隊的杰出工作,設(shè)計并開源TensorFlow Lite,加速端側(cè)機(jī)器學(xué)習(xí)的發(fā)展.感謝Google相關(guān)團(tuán)隊持續(xù)對TensorFlow Lite的貢獻(xiàn)和反饋.感謝廣大硬件平臺的支持.感謝最廣大開發(fā)者對TensorFlow社區(qū)的貢獻(xiàn),持續(xù)推動其發(fā)展.

出国| 徐水县| 义乌市| 沂源县| 滨海县| 保山市| 满洲里市| 堆龙德庆县| 洪江市| 介休市| 茶陵县| 城固县| 河西区| 司法| 石林| 宜君县| 瓮安县| 会理县| 那坡县| 天等县| 武宁县| 阿鲁科尔沁旗| 咸宁市| 芦溪县| 通榆县| 奇台县| 崇义县| 海淀区| 广东省| 伊金霍洛旗| 天水市| 平乐县| 平陆县| 兰溪市| 双牌县| 习水县| 景谷| 图片| 措美县| 普格县| 永平县|