CPU& 內存加壓工具 stress-ng 介紹
本文的重點在于向廣大開發者介紹 stress-ng 工具,并探究該工具是否能明顯影響模型的性能表現,以方便開發者在非實車環境下能做好性能驗證工作。關于模型或工程的性能調優,可參考社區其他精品貼。因作者水平有限,文章如有錯漏之處,歡迎指出并共同交流。
Stress-ng 可以在 linux 上產生系統負載,可加壓 CPU、內存、磁盤 IO 等,且有多種加壓策略,比如浮點運算、整數運算、矩陣運算、壓縮、解壓縮等,可以用來測試系統在高負載的狀況下的穩定性。
Stress-ng 工具的 github 開源地址為:https://github.com/ColinIanKing/stress-ng
首先進入 stress-ng 的 github 頁面,下載源碼到我們的 x86 服務器上
接下來進行源碼編譯。由于我們的加壓測試環境是 arm 開發板,而 github 介紹的編譯流程基于 x86,因此我們需要配置**環境變量來設置交叉編譯器**,以編譯出可在開發板運行的二進制文件,參考代碼如下:
cd stress-ng-0.17.06export CC=aarch64-linux-gnu-gccmake
編譯完成后,會在源碼所在的文件夾下生成可執行文件 stress-ng,將其復制到開發板上的/userdata 路徑即可。
--cpu N:讓 N 個 CPU 滿載,N=0 會讓所有 CPU 滿載
--cpu-load M:搭配--cpu 使用,占用 N 個核各自 M%的 CPU 負載
--vm N:啟用 N 個進程占用內存,不斷釋放和分配
--vm-bytes N:所有 vm 進程共占用 N 字節的內存大小,可帶單位,如 1M 1G
--vm-keep:vm 進程一直占用內存不釋放
--timeout N:加壓時長 N 秒,可帶單位,如 1s 1m 1h 1d,不配置則為 1d
CPU 加壓命令:
stress-ng --cpu 4 --cpu-load 90
運行以上命令可讓 4 個 CPU 核各以 90%左右的負載運行。
執行以下命令可讓 CPU 和內存共同被加壓:
stress-ng --vm 2 --vm-bytes 2G --vm-keep
vm 為 2 會讓 2 個 CPU 核滿載運行,vm-bytes 為 2G 則會占用 2G 的內存(和 vm 數量無關),添加 vm-keep 會讓內存一直占據不被釋放。這個命令可以同時為 CPU 和內存加壓,是比較推薦的一種方式,本文也會基于這種方法做性能測試工作。
hrt_model_exec 是地平線算法工具鏈提供的模型執行工具,可以使用該工具的 perf 功能在開發板上評測模型的推理性能,該工具的完整介紹可以查看用戶手冊:
https://developer.horizon.cc/api/v1/fileData/horizon_j5_open_explorer_cn_doc/runtime/source/tool_introduction/source/hrt_model_exec.html
我們可以在 OE 包的 ddk/package/board/hrt_tools/bin 路徑找到這個工具,需要將其復制到開發板。
hrt_model_exec 可以在單核單線程下評測模型的單幀延時(Latency),也可以在雙核多線程下評測模型的吞吐量(FPS)。單幀延時體現了單個模型處理一幀數據所需的時間,是衡量計算平臺能滿足實時性能要求的重要指標。
這里我們選擇基于單幀延時來分析性能影響,相比 FPS,對單幀延時的觀測會更加穩定。
評測模型單幀延時的參考命令如下:
hrt_model_exec perf --model_file ./model.bin --frame_count 1000
frame_count 默認為 200,這里我們設置為 1000,為的是讓評估的數值更加準確。
本文分別使用一大一小兩個模型分析 CPU 和內存加壓對單幀延時的影響,計算平臺為 征程 5。
大模型使用 CenterPoint(來自 OE 包 ddk/samples/model_zoo/runtime/ai_benchmark/qat/centerpoint_pointpillar_nuscenes),小模型使用 Resnet18(OE 包 ddk/samples/ai_toolchain/horizon_model_convert_sample/03_classification/03_resnet18 以 O3 編譯)。加壓手段采用本文 2.3.3 “CPU 和內存共同加壓方法”,比較兩個模型的單幀延時受影響程度。
對本實驗涉及到的 征程 5 硬件資源,這里做出以下簡單介紹。
CPU: 8 * A55
BPU:征程 5 有雙核 BPU,但本文所做的性能測試只用到單核
內存:可使用 free 命令查看開發板內存分配情況,在不執行任何用戶進程時,可用內存約為 3.8G,見下圖
實驗 1 為不加壓時,分別單獨運行 CenterPoint 和 Resnet18 得到的單幀延時數據;
實驗 2-8 為 1 個 CPU 核滿載時,內存占用依次提升的單幀延時數據;
實驗 9-15 為 4 個 CPU 核滿載時,內存占用依次提升的單幀延時數據;
實驗 16-22 為全部 CPU 核滿載時,內存占用依次提升的單幀延時數據;
CenterPoint 和 Resnet18 分開測試,不會同時運行。
可以查看下方更加直觀的,基于表格信息制作的折線圖。
圖中藍色圓點代表不加壓時,CenterPoint 的性能數據,綠色折線表示單核滿載時內存占用依次提升的性能數據,黃色折線表示 4 核滿載時內存占用依次提升的性能數據,紅色折線表示 8 核滿載時內存占用依次提升的性能數據。
Resnet18 折線圖的閱讀方法同 Centerpoint。由于在 8 核滿載(紅色折線)時,模型性能下降尤為嚴重,因此額外提供了下圖,可方便地看出單核滿載(綠色折線)和 4 核滿載(黃色折線)下的性能變化情況。
stress-ng 工具對 CPU 和**內存的占用,可以顯著影響模型性能**;
內存加壓對模型單幀延時的影響相對較小,CPU 加壓影響較大;
在內存占用相同時,CPU 占用越高,模型單幀延時越高;
在 CPU 負載相同時,隨著內存占用的提升,模型的單幀延時有上升趨勢;
在 CPU 全部核滿載時,小模型的單幀延時上升情況比大模型嚴重很多。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。