作者 | Andrew Zhuravchak
譯者 | 彎月
封圖 | CSDN 下載自 VCG
出品 | CSDN(ID:CSDNnews)
然而,機(jī)器學(xué)習(xí)與嵌入式設(shè)備的相結(jié)合仍然存在非常大的鴻溝。
我們不了解什么是嵌入式世界
我們已經(jīng)習(xí)慣了使用強(qiáng)大的計(jì)算能力來(lái)處理機(jī)器學(xué)習(xí)。
AlexNet 需要 727MFlops 的運(yùn)算能力(Flops=浮點(diǎn)運(yùn)算)以及 235Mb 的內(nèi)存才能處理小小的一張 227 x 227 像素的圖像。例如,Google Nexus S 上的 ARM Cortex-A8 的處理能力為每秒 66MFlops。因此,你必須等待大約 11 秒才能進(jìn)行推斷。這也太慢了!
大學(xué)里我上了幾門(mén)與機(jī)器學(xué)習(xí)相關(guān)的課程。我們做了很多有趣的作業(yè)。但是當(dāng)時(shí)即便是 4GB GTX1050 也不足以訓(xùn)練所有模型。
一般的機(jī)器學(xué)習(xí)工程師很少考慮計(jì)算資源。而且他們也很少關(guān)心內(nèi)存的使用情況。為什么?因?yàn)檫@些硬件都很便宜,甚至是你的手機(jī)都擁有相當(dāng)不錯(cuò)的 CPU 和大量?jī)?nèi)存。
你已經(jīng)很久沒(méi)有過(guò)聚會(huì)拍照時(shí)發(fā)現(xiàn)自己手機(jī)上的存儲(chǔ)不夠的情況了吧?想象一下,你使用的是只有 256KB 閃存的 TrueTouch 感應(yīng)控制器。沒(méi)錯(cuò),只有 256KB。而且由于固件占用了一部分, 因此你不能完全使用這點(diǎn)存儲(chǔ)。算下來(lái),你能使用的也就是大約 100KB。回頭再看看你的上一個(gè)模型的大小。可能比這個(gè)大多了。
有意思吧?我們來(lái)繼續(xù)看。
當(dāng)聽(tīng)到“嵌入式設(shè)備”時(shí)你會(huì)想起什么?記住腦海中出現(xiàn)的第一印象。
1. 嵌入式設(shè)備可以是任何電動(dòng)機(jī)械,甚至是微波爐和洗衣機(jī)
沒(méi)錯(cuò),你答對(duì)了!
如今,幾乎所有的電氣設(shè)備都是嵌入式的。這些設(shè)備內(nèi)部可能擁有一個(gè)或多個(gè)控制器來(lái)負(fù)責(zé)每個(gè)功能:觸摸感應(yīng)、發(fā)動(dòng)機(jī)狀態(tài)監(jiān)控等。
2. Arduino 和樹(shù)莓派
恭喜你,再次答對(duì)了!
二者是 DIY 項(xiàng)目中最受歡迎和使用最廣泛的工具包之一。它們也是嵌入式設(shè)備。
3. Jetson Nano 及類似的產(chǎn)品
再次回答正確。
這是一種特殊的開(kāi)發(fā)套件,簡(jiǎn)稱迷你計(jì)算機(jī),專門(mén)為運(yùn)行機(jī)器學(xué)習(xí)模型而開(kāi)發(fā)。它非常強(qiáng)大,而且非常酷。
但似乎有些不對(duì)。
我有很多朋友都在做一些很棒的硬件業(yè)余項(xiàng)目。通常他們會(huì)使用 Arduino 或 STM32。
我認(rèn)識(shí)幾個(gè) AI 工程師對(duì) Jetson Nano 和類似設(shè)備超有興趣。他們認(rèn)為這些設(shè)備是嵌入式 AI 的未來(lái)。
那么,接下來(lái)請(qǐng)考慮這樣一個(gè)問(wèn)題:“這些設(shè)備有多少用在了生產(chǎn)級(jí)別的產(chǎn)品中?”
答案:微乎其微
想一想你家中有多少電氣設(shè)備,然后再想想汽車中包含的大量控制器,以及工作上用到的安保系統(tǒng),等等。
每個(gè)設(shè)備都有一個(gè)控制器。通常,這些控制器都是微型,且超級(jí)便宜。它們根本無(wú)法企及 Jetson 或樹(shù)莓派的資源和功能。
假設(shè)你有一個(gè)微控制器。它的主要任務(wù)是處理手指觸摸屏幕。它擁有 ARM Cortex-M0 處理器,256KB 內(nèi)存(其中只有 80–120KG 可用)。這是一個(gè)實(shí)時(shí)系統(tǒng),因此你只需很少的時(shí)間來(lái)推斷模型,例如 100 微秒。你的目標(biāo)是改善算法或替換算法。
祝你好運(yùn),歡迎來(lái)到“嵌入式 AI”的世界。
重點(diǎn):真正的嵌入式世界,由資源極其有限的 1-2 美元芯片組成。而生產(chǎn)級(jí)別的產(chǎn)品使用的就是這種芯片。
純基礎(chǔ)設(shè)施
我一直在從事上述項(xiàng)目,進(jìn)展良好,我開(kāi)發(fā)了一個(gè)適合該微控制器的小型神經(jīng)網(wǎng)絡(luò)。
接下來(lái),我需要將模型從我的電腦轉(zhuǎn)移到設(shè)備上!
1. 量化
該處理器無(wú)法執(zhí)行浮點(diǎn)數(shù)運(yùn)算。即使可以,我們也不會(huì)使用,因?yàn)樗牟僮鞣浅?fù)雜且需要大量時(shí)間。
因此,我對(duì)模型的權(quán)重進(jìn)行量化,即將連續(xù)范圍內(nèi)的值轉(zhuǎn)換為有限范圍內(nèi)的離散值。
你猜怎么著?PyTorch 和 TensorflowLite 都無(wú)法完全支持。它們不能支持所有激活函數(shù)(盡管我使用了非常簡(jiǎn)單的 HardTanh)。PyTorch 甚至無(wú)法將量化模型保存到文件中。
所以,我不得不親自動(dòng)手。
2. 推理代碼生成
你想在這個(gè)控制器上運(yùn)行模型,對(duì)吧?那么你就需要使用 C 代碼進(jìn)行模型推斷。
告訴你一個(gè)不幸的消息,這一步你也必須手動(dòng)完成。為什么?因?yàn)?PyTorch 沒(méi)有推斷代碼生成的功能。相比之下,TFLite 雖然有這個(gè)功能,但功能相當(dāng)有限,并且不支持常見(jiàn)的激活函數(shù)。
所以,我不得不再次親自動(dòng)手。
在工作中,我遇到過(guò)很多這樣的情況。我并不是想抨擊 PyTorch 和 TensorflowLite,而是在“求救”。
重點(diǎn):機(jī)器學(xué)習(xí)社區(qū)還有一個(gè)重大的問(wèn)題:沒(méi)有“嵌入式 AI”的專業(yè)工具。
黑暗中的光明?
我看到大型半導(dǎo)體公司對(duì) AI 產(chǎn)生了極大的興趣,他們?cè)诜e極地做非常有價(jià)值和重要的事情。
- CMSIS-NN:用于 Arm Cortex-M CPU 的高效神經(jīng)網(wǎng)絡(luò)內(nèi)核。
- 有些編譯器能夠產(chǎn)生高效的推理代碼,而且這些推理代碼能夠根據(jù)你的硬件進(jìn)行優(yōu)化。
- 還有很多其他很棒的東西。
英文:Machine Learning Fails When It Comes to Embedded System. Here’s Why
鏈接:https://towardsdatascience/machine-learning-fails-when-it-comes-to-embedded-system-9ce6def9ba75
作者:Andrew Zhuravchak,研發(fā)系統(tǒng)工程師。
譯者:彎月


