博客專欄

        EEPW首頁 > 博客 > 內(nèi)存占用與監(jiān)控方式介紹

        內(nèi)存占用與監(jiān)控方式介紹

        發(fā)布人:地平線開發(fā)者 時(shí)間:2025-02-08 來源:工程師 發(fā)布文章
        1.內(nèi)存占用

        神經(jīng)網(wǎng)絡(luò)模型常見的內(nèi)存占用可以分為以下幾個(gè)部分:

        1.1 模型參數(shù)內(nèi)存
        • 定義:神經(jīng)網(wǎng)絡(luò)的權(quán)重和偏置等參數(shù)會(huì)占用內(nèi)存。

        • 計(jì)算方法:

          • 參數(shù)總量 = 各層參數(shù)數(shù)量的總和。

          • 每個(gè)參數(shù)的大小取決于數(shù)據(jù)類型(如 float32 為 4 字節(jié),float16 為 2 字節(jié),int8 為 1 字節(jié))。

        • 公式: 參數(shù)內(nèi)存=參數(shù)總數(shù)×每個(gè)參數(shù)的字節(jié)數(shù)

        • 示例: 一個(gè)全連接層 輸入維度=1024,輸出維度=512,數(shù)據(jù)類型為 float32,則: 參數(shù)量=1024×512+512 (偏置項(xiàng))=524,800 參數(shù)內(nèi)存: 524,800×4?Bytes≈2.1?MB

        1.2 激活內(nèi)存
        • 定義:網(wǎng)絡(luò)各層的中間結(jié)果(激活)占用內(nèi)存。

        • 計(jì)算方法:

          • 激活值總量 = 每層輸出的維度之和。

          • 數(shù)據(jù)類型通常與模型參數(shù)一致(如 float32)。

        • 公式: 激活內(nèi)存=每層激活值數(shù)量×每個(gè)激活值的字節(jié)數(shù)

        • 示例: 卷積層:輸入特征圖大小為 64×64(寬 × 高),通道數(shù)為 128,輸出通道數(shù)為 256,假設(shè)數(shù)據(jù)類型為 float32,則: 激活內(nèi)存大小=64×64×256×4 (Bytes)=4MB

        1.3 數(shù)據(jù)存儲(chǔ)內(nèi)存
        • 輸入數(shù)據(jù):

          • 輸入數(shù)據(jù)占用內(nèi)存,根據(jù)輸入維度計(jì)算。

          • 示例:輸入大小為 32×3×224×224,數(shù)據(jù)類型為 float32:32×(3×224×224)×4≈19MB

        • 輸出數(shù)據(jù):

          • 模型輸出也需要占用內(nèi)存,占用情況同輸入。

        2.征程 6 模型推理內(nèi)存分析

        模型推理過程中的內(nèi)存占用來自三個(gè)方面, input tensor memory + output tensor memory + model memoy,其中 model memory 主要是模型文件 size + 運(yùn)行時(shí)指令運(yùn)行時(shí)所需的內(nèi)存(如從 SRAM 換出所需),可以等效理解為第一節(jié)介紹的模型參數(shù)內(nèi)存+激活內(nèi)存。

        此外,模型加載過程中 runtime 將申請(qǐng)額外的內(nèi)存用于模型的解析,該申請(qǐng)的內(nèi)存在初始化完成后釋放。

        3.征程 6 模型推理內(nèi)存監(jiān)控

        OpenExplorer 中提供的 hrt_ucp_monitor 支持監(jiān)控內(nèi)存信息,下面我們來看一下 hrt_ucp_monitor 監(jiān)控內(nèi)存的用法示例。

        工具準(zhǔn)備:將工具鏈 OpenExplorer 開發(fā)包中 hrt_ucp_monitor 傳到開發(fā)板上即可。

        工具使用:運(yùn)行 hrt_ucp_monitor 時(shí),如果不指定參數(shù),則使用默認(rèn)參數(shù)運(yùn)行。默認(rèn)開啟所有硬件 IP 監(jiān)控,以交互模式運(yùn)行, BPU 和 DSP 每秒采樣 500 次,硬件 IP 占用率每 1000ms 刷新一次。如果想要修改,可以參考工具鏈的用戶手冊(cè),或運(yùn)行 hrt_ucp_monitor -h 獲取工具的使用詳情。

        3.1 無模型推理

        在終端運(yùn)行命令:hrt_ucp_monitor,可以看到板端預(yù)留 4.5G 內(nèi)存。

        圖片

        有兩個(gè)地方需要專門解釋一下:

        1.ION(Ion Memory Allocator)共享內(nèi)存管理

        ION 是 google 在 Android4.x 為了解決內(nèi)存碎片化管理而引入的通用內(nèi)存管理器,用來支持不同的內(nèi)存分配機(jī)制,如 CARVOUT(PMEM),物理連續(xù)內(nèi)存(kmalloc),虛擬地址連續(xù)但物理地址不連續(xù)內(nèi)存(vmalloc),IOMMU 等。

        ION Info 還包括一些系統(tǒng)以及核間通信的占用,并不是模型本身的占用

        2.HBMEM(Hobot Memory Management)地平線內(nèi)存管理模塊

        HBMEM,是一個(gè)地平線自研的內(nèi)存管理軟件,用于解決 Linux 內(nèi)核無法很好的支持預(yù)留內(nèi)存的管理,以及應(yīng)用與驅(qū)動(dòng)之間的內(nèi)存共享的問題。

        3.2 有模型推理

        在 A 終端運(yùn)行程序,在 B 終端運(yùn)行命令:hrt_ucp_monitor,即可看到對(duì)應(yīng)的監(jiān)控信息:

        圖片

        可以看到,模型推理時(shí),主要是 carveout 的內(nèi)存,也可以使用如下命令查看內(nèi)存使用情況:

        cat /sys/kernel/debug/ion/heaps/carveout

        查看對(duì)應(yīng)進(jìn)程的占用即可


        圖片

        *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。




        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 乡城县| 咸丰县| 海阳市| 顺昌县| 定远县| 弥勒县| 霍林郭勒市| 鄂托克旗| 临夏县| 夹江县| 合肥市| 汉源县| 镇远县| 武强县| 西峡县| 古交市| 天台县| 贺州市| 仁怀市| 阿图什市| 顺平县| 安龙县| 高密市| 阳高县| 临沧市| 红安县| 准格尔旗| 雅安市| 东辽县| 洛浦县| 修水县| 尼木县| 娄烦县| 当阳市| 塘沽区| 绩溪县| 武汉市| 大英县| 潞城市| 虎林市| 桐乡市|