嵌入式裝置上卷積神經網路推理時memory的優化

2021-10-19 07:16:49 字數 2065 閱讀 7019

以前的神經網路幾乎都是部署在雲端(伺服器上),裝置端採集到資料通過網路傳送給伺服器做inference(推理),結果再通過網路返回給裝置端。如今越來越多的神經網路部署在嵌入式裝置端上,即inference在裝置端上做。嵌入式裝置的特點是算力不強、memory小。可以通過對神經網路做量化來降load和省memory,但有時可能memory還吃緊,就需要對神經網路在memory使用上做進一步優化。本文就以一維卷積神經網路為例談談怎麼來進一步優化卷積神經網路使用的memory。

文章(卷積神經網路中一維卷積的計算過程 )講了卷積神經網路一維卷積的處理過程,可以看出卷積層的輸入是乙個大矩陣,輸出也是乙個大矩陣,儲存這些矩陣是挺耗memory的。其實做卷積計算時,每次都是從輸入中取出kernel size大小的資料與kernel做卷積運算,得到的是乙個值,儲存在卷積層的輸出buffer裡,輸出也是下一層的輸入。如果輸入是卷積層kernel的大小(即是能做運算的最小size),輸出是下一層的能做運算的最小size,相對於整個輸入和輸出的size而言,能節省不少memory。下面就講講怎麼用這種思路來做cnn的memory優化。

假設當前層和下一層均為卷積層,stride為1,padding模式為same。當前層的輸入是乙個mxn的矩陣,kernel size是p,kernel count是q,所以kernel是乙個mxp的矩陣,當前層的輸出是乙個qxn矩陣。當前卷積層的輸出就是下一卷積層的輸入。下一卷積層的kernel size是j,kernel count是k,所以下一卷積層的kernel是乙個qxj的矩陣,輸出是乙個kxn的矩陣。示意如下圖:

首先從輸入矩陣中取出0~(p-1)列(共p列)放進輸入buffer中,正好放滿。與第乙個kernel做卷積運算就得到乙個值放進輸出buffer中(0,0)位置。同樣與第二個kernel做卷積得到的值放在輸出buffer中(1,0)位置,與所有kernel做完卷積後得到是乙個q行1列的矩陣,放在輸出buffer第一列上,如下圖:

再將輸入矩陣的第1~p列取出放進輸入buffer中(即把輸入buffer中每列向前移一格,0列移出buffer,第p列放在最後1列),同上面一樣計算,得到的依舊是1列數值放進輸出buffer的第2列中。如下圖:

依次這麼做下去,當輸出buffer裡的最後一列被填滿時,就要觸發下一卷積層做卷積運算,與k個kernel卷積運算後得到的是乙個k行1列的值放進下一卷積層輸出buffer的第一列中。如下圖:

由於下一卷積層的輸出buffer未滿,不能觸發後面的運算。又回到從輸入矩陣中取資料放進當前卷積層的輸入buffer中,再進行當前卷積層和下一卷積層的運算,結果放在各自的輸出buffer裡(如輸出buffer滿了就要把每列左移一格,0列移出buffer,新生成的1列資料放在最後1列)。類似的處理,直到把輸入矩陣中取到最後一列,再把各個層的輸入buffer全處理完,最後得到結果。

從上面的思路看出,輸入和輸出buffer從大矩陣變成kernel大小的小矩陣可以省不少memory。具體軟體實現時,有輸入層,中間各層(包括卷積層等),每一層為乙個整體,要用event機制去觸發下乙個要處理的層。當一層處理完後要判斷下一步是哪一層做處理(有可能是下一層,也有可能是當前層或上一層,還有可能是輸入層等),就給那一層發event,那一層收到event後就會繼續處理。示意如下圖:

軟體實現時還有很多細節要處理,尤其是當輸入層資料取完後後面各層的處理,這裡就不一一細述了。軟體除錯時先用不省memory的原始code生成每層的輸出,儲存在各自的檔案裡,用於做位元校驗。然後對省memory的code進行除錯,先從第一層開始,一層一層的除錯。優化後的**每層的輸出跟優化前的輸出是完全一樣的才算除錯完成。

什麼是嵌入式裝置? 嵌入式裝置的定義

區別於通用計算機的其他裝置都可以稱之為嵌入式裝置 個人電腦,伺服器 一段時期內,必備的硬體配置。底層驅動開發 關鍵字 bsp 嵌入式linux wince vxworks 上層應用開發 關鍵字 posix jd以嵌入式linux系統開發為例 熟悉常見外設,匯流排的linux驅動開發 微控制器,m3,...

ssl證書 嵌入式裝置 嵌入式裝置支援https

2.openssl 1.0.1i.tar.gz 一 一般編譯 沒有ssl支援 1.配置如下 2.把它複製到開發板 usr sbin目錄 然後複製下列檔案 3.放置網頁檔案 4.測試 default 2 main default 2 main host localhost default 2 main...

嵌入式裝置抓包

1.通過hub 集線器 來抓包。可能交換機不可以 路由器和集線器的區別 路由器接受到某一埠發來的資料報的時候,它是定向傳遞給目標的 hub則採用廣播機制,只要收到資料,既向所有埠傳送廣播很明顯,hub就很容易抓包了,當然效能和效率比不上路由器。2.嵌入式網路中的抓包神器 我們在開發網路程式設計和研究...