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。
-- 剔除极端异常值,精度就能提升
浙公网安备 33010602011771号