CPU& 内存加压工具 stress-ng 介绍

01 文章背景介绍

在实车测试时,除了感知算法外,往往还会有别的 APP 在同时运行,从而挤压算法的资源占用,影响模型性能,降低部署效果。因此在项目早期做板端验证的时候,我们就可以使用一些工具对 CPU 和内存进行加压,再运行模型,以模拟实车测试的情况,得到模型在硬件资源受限时的性能数据,做到心中有数,及时调整优化,避免到了项目后期还要为节约性能开销而裁剪模型,得不偿失。

本文的重点在于向广大开发者介绍 stress-ng 工具,并探究该工具是否能明显影响模型的性能表现,以方便开发者在非实车环境下能做好性能验证工作。关于模型或工程的性能调优,可参考社区其他精品贴。因作者水平有限,文章如有错漏之处,欢迎指出并共同交流。

02 开发板加压工具介绍

2.1 stress-ng 简介

Stress-ng 可以在 linux 上产生系统负载,可加压 CPU、内存、磁盘 IO 等,且有多种加压策略,比如浮点运算、整数运算、矩阵运算、压缩、解压缩等,可以用来测试系统在高负载的状况下的稳定性。

Stress-ng 工具的 github 开源地址为:https://github.com/ColinIanKing/stress-ng

2.2 stress-ng 编译说明

  1. 首先进入 stress-ng 的 github 页面,下载源码到我们的 x86 服务器上
  1. 接下来进行源码编译。由于我们的加压测试环境是 arm 开发板,而 github 介绍的编译流程基于 x86,因此我们需要配置**环境变量来设置交叉编译器**,以编译出可在开发板运行的二进制文件,参考代码如下:
复制代码
cd stress-ng-0.17.06export CC=aarch64-linux-gnu-gccmake
  1. 编译完成后,会在源码所在的文件夹下生成可执行文件 stress-ng,将其复制到开发板上的/userdata 路径即可。

2.3 stress-ng 使用说明

2.3.1 主要参数介绍

  • --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

2.3.2 CPU 加压方法

CPU 加压命令:

复制代码
stress-ng --cpu 4 --cpu-load 90

运行以上命令可让 4 个 CPU 核各以 90%左右的负载运行。

2.3.3 CPU 和内存共同加压方法(推荐)

执行以下命令可让 CPU 和内存共同被加压:

复制代码
stress-ng --vm 2 --vm-bytes 2G --vm-keep

vm 为 2 会让 2 个 CPU 核满载运行,vm-bytes 为 2G 则会占用 2G 的内存(和 vm 数量无关),添加 vm-keep 会让内存一直占据不被释放。这个命令可以同时为 CPU 和内存加压,是比较推荐的一种方式,本文也会基于这种方法做性能测试工作

03 模型性能评测工具介绍

3.1 hrt_model_exec 简介

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 路径找到这个工具,需要将其复制到开发板。

3.2 hrt_model_exec 使用方法

hrt_model_exec 可以在单核单线程下评测模型的单帧延时(Latency),也可以在双核多线程下评测模型的吞吐量(FPS)。单帧延时体现了单个模型处理一帧数据所需的时间,是衡量计算平台能满足实时性能要求的重要指标。

这里我们选择基于单帧延时来分析性能影响,相比 FPS,对单帧延时的观测会更加稳定。

评测模型单帧延时的参考命令如下:

复制代码
hrt_model_exec perf --model_file ./model.bin --frame_count 1000

frame_count 默认为 200,这里我们设置为 1000,为的是让评估的数值更加准确。

04 实验部分

4.1 实验思路

本文分别使用一大一小两个模型分析 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 和内存共同加压方法",比较两个模型的单帧延时受影响程度。

4.2 征程 5 硬件资源说明

对本实验涉及到的 征程 5 硬件资源,这里做出以下简单介绍。

  • CPU: 8 * A55

  • BPU:征程 5 有双核 BPU,但本文所做的性能测试只用到单核

  • 内存:可使用 free 命令查看开发板内存分配情况,在不执行任何用户进程时,可用内存约为 3.8G,见下图

4.3 实验结果展示

*4.3.1 实验数据总表*

  • 实验 1 为不加压时,分别单独运行 CenterPoint 和 Resnet18 得到的单帧延时数据;

  • 实验 2-8 为 1 个 CPU 核满载时,内存占用依次提升的单帧延时数据;

  • 实验 9-15 为 4 个 CPU 核满载时,内存占用依次提升的单帧延时数据;

  • 实验 16-22 为全部 CPU 核满载时,内存占用依次提升的单帧延时数据;

  • CenterPoint 和 Resnet18 分开测试,不会同时运行。

可以查看下方更加直观的,基于表格信息制作的折线图。

4.3.2 CenterPoint 折线图

图中蓝色圆点 代表不加压时,CenterPoint 的性能数据,绿色折线 表示单核满载时内存占用依次提升的性能数据,黄色折线 表示 4 核满载时内存占用依次提升的性能数据,红色折线表示 8 核满载时内存占用依次提升的性能数据。

4.3.3 Resnet18 折线图

Resnet18 折线图的阅读方法同 Centerpoint。由于在 8 核满载(红色折线) 时,模型性能下降尤为严重,因此额外提供了下图,可方便地看出单核满载(绿色折线) 和 **4 核满载(黄色折线)**下的性能变化情况。

05 实验结论

  1. stress-ng 工具对 CPU 和**内存的占用,可以显著影响模型性能**;

  2. 内存加压对模型单帧延时的影响相对较小,CPU 加压影响较大;

  3. 在内存占用相同时,CPU 占用越高,模型单帧延时越高;

  4. 在 CPU 负载相同时,随着内存占用的提升,模型的单帧延时有上升趋势;

  5. 在 CPU 全部核满载时,小模型的单帧延时上升情况比大模型严重很多。

06 结论

本文重点介绍了 stress-ng 工具并通过实验证明了 stress-ng 对 CPU 和内存的加压可以明显影响模型的性能表现,该工具可方便开发者验证模型在资源受限时的实际运行性能。

相关推荐
计算机小白一个5 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^6 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
楼台的春风8 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
大数据追光猿8 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!8 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉8 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生8 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
柠石榴8 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
Leuanghing8 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
qy发大财8 小时前
加油站(力扣134)
算法·leetcode·职场和发展