12.RK3588本地大模型性能评估优化

1.性能分析基础

进行性能评估前,先建立一个基准,方便后续对比

请参考 15.RK3588 查询和设置板子配置 把板子CPU、NPU、DDR运行频率设置到最大,后续的性能分析都在这个基准上比较,避免动态调频导致性能表现出现误差

整个部署程序的推理部分耗时的占用有如下三个方面:用户应用程序耗时、输入输出数据拷贝耗时、模型推理耗时。

2.开启性能调试

2.1 板子Linux系统里进行性能分析

#设置日志级别
export RKNN_LOG_LEVEL=4
#运行大模型
./run_rknn_test ./test.rknn ./input.jpg

比如运行大模型

./demo demo.jpg ../models/qwen3-vl_vision_rk3588.rknn ../models/qwen3-vl-2b-instruct_w8a8_rk3588.rkllm 2048 4096 3  "<|vision_start|>" "<|vision_end|>" "<|image_pad|>"

就可以看到性能耗时

可以看到 Expand 和 Transpose是运行在CPU上的,可以通过算子替换等把它修改到NPU上以提高性能

比如

2.2 rknn-toolkit2里运行性能分析

这个是在ubuntu PC机里,通过python 调用rknn-toolkit2,连接到板端进行性能分析

需要调用eval_perf获取每一层的耗时情况

# perf_debug 需要改为True
rknn.init_runtime(target=platform, perf_debug=True)
#获取性能情况
rknn.eval_perf()

运行结果

2.3 优化方法

2.3.1算子替代

比如上述文章提到的用固定输出尺寸静态Resize代替动态Resize

2.3.2强制指定算子跑 NPU

转换时配置 op_target 强制指定算子跑 NPU(工具 API 强制调度)

如果算子硬件本身支持,只是编译器自动切到 CPU,用op_target强制绑定 NPU:

rknn.config(
    target_platform="rk3588",
    op_target={
    # key=算子输出节点名(Netron查看), value=npu/cpu
    "node_123": "npu",
    "avgpool_out": "npu"
    }
)

适用场景:AvgPool、Resize、Add、Mul 等基础算子误 fallback。

2.3.3 int8量化上NPU

量化参数适配,消除量化导致的算子降级

很多算子 FP32 不支持 NPU,INT8 量化后即可上 NPU:

rknn.config(
    quantized_method="channel", # 按通道量化兼容性更好
    quantized_algorithm="normal",
    channel_wise_quantization=True  #True=INT8量化,False=FP16/FP32
)

补充:输入输出尽量统一 INT8,避免浮点分支触发 CPU 子图。

2.3.4 激活值量化损失(绝大多数精度掉点元凶)

推理时每层 feature map 数值分布不稳定、极值异常

优化方法:量化校准优化(最高性价比,优先做)

量化核心:依靠校准数据集统计激活值范围 (min/max),决定量化缩放因子

校准数据集作用:前向跑一遍模型,收集每层输出特征图所有数值,统计该层激活全局 min、max。

-- 剔除极端异常值,精度就能提升

posted @ 2026-08-11 11:29  wssheng  阅读(1)  评论(0)    收藏  举报