普通网友 2025-09-19 09:20 采纳率: 98.8%
浏览 2
已采纳

FastDeploy在ARM64上推理速度慢?

在ARM64嵌入式设备上使用FastDeploy进行模型推理时,常出现推理速度明显偏慢的问题。该问题多源于默认未启用硬件加速后端(如NNAdapter),导致计算任务未能调度至NPU或GPU执行,而仅依赖CPU处理。此外,部分ARM64平台缺少对TensorRT或OpenVINO等高性能推理引擎的支持,进一步限制了优化空间。如何正确配置FastDeploy以启用NPU加速,并选择适配的推理后端,成为提升ARM64平台推理性能的关键技术难点。
  • 写回答

1条回答 默认 最新

  • 巨乘佛教 2025-09-19 09:21
    关注

    1. 问题背景与现象分析

    在ARM64架构的嵌入式设备(如瑞芯微RK3588、华为昇腾Atlas系列边缘设备、高通骁龙平台)上部署AI模型时,开发者常遇到推理延迟高、吞吐量低的问题。实测数据显示,同一模型在x86服务器上推理耗时为20ms,在ARM64设备上却高达200ms以上。

    通过性能剖析工具(如perfhtop)监控发现,CPU占用率接近100%,而NPU或GPU利用率不足10%。这表明模型推理任务并未调度至专用加速器执行。

    根本原因在于:FastDeploy默认使用Paddle Inference或ONNX Runtime的CPU后端,未自动启用NNAdapter等硬件抽象层来调用底层NPU驱动。

    2. FastDeploy推理后端架构解析

    FastDeploy支持多后端切换机制,其核心推理引擎依赖于底层框架的Runtime接口:

    • Paddle Inference(支持TensorRT、NNAdapter)
    • ONNX Runtime(支持TensorRT、OpenVINO、NNAPI、CoreML)
    • TensorFlow Lite(支持NNAPI、GPU Delegate)

    在ARM64平台上,由于缺乏对NVIDIA TensorRT和Intel OpenVINO的原生支持,需转向NNAdapter作为统一硬件接入方案。

    3. NNAdapter在ARM64平台的适配现状

    SoC厂商NPU类型NNAdapter支持情况对应Backend
    RockchipRKNPU2已支持rknpu
    AmlogicNPU实验性支持amlogic_npu
    AllwinnerCVLite社区贡献中allwinner_cvi
    HuaweiAscend Mini需定制SDKhuawei_kirin
    QualcommHexagon DSP通过SNPE桥接qualcomm_hexagon
    UnisocVPULite暂不支持-
    NVIDIA JetsonGPU (CUDA)通过TensorRTtensorrt
    Apple M-seriesNeural Engine通过CoreMLcoreml
    Samsung ExynosNPU需厂商私有库samsung_npu
    Broadcom无专用NPU仅GPU加速opencl

    4. 启用NPU加速的关键配置步骤

    以RK3588 + RKNPU2为例,演示如何正确配置FastDeploy启用NPU:

    
    #include "fastdeploy/vision.h"
    
    fd::RuntimeOption option;
    option.UseRKNPU2(); // 关键API:启用RKNPU2后端
    
    // 或使用通用NNAdapter接口
    option.SetModelFormat(fd::ModelFormat::PADDLE); 
    option.UseNNAdapter(
        "rknpu", // device_names
        "",      // context_properties
        {"subgraph_partition_config_path=rk3588_partition.cfg"} // nnadapter_options
    );
    
    auto model = fd::vision::detection::YOLOv5("yolov5s.rknn", &option);
        

    5. 模型格式转换与子图切分策略

    并非所有算子都能被NPU高效执行。需通过子图划分将可加速部分卸载至NPU,其余保留在CPU。

    示例配置文件 rk3588_partition.cfg 内容如下:

    
    # 子图划分规则定义
    OP_TYPE:Conv2D RUNTIME:rknpu
    OP_TYPE:DepthwiseConv2D RUNTIME:rknpu
    OP_TYPE:ReLU RUNTIME:rknpu
    OP_TYPE:Sigmoid RUNTIME:rknpu
    OP_TYPE:Concat RUNTIME:cpu
    OP_TYPE:Resize RUNTIME:cpu
    DEFAULT_RUNTIME:cpu
        

    6. 性能对比测试数据

    在同一YOLOv5s模型下,不同后端的性能表现如下表所示:

    后端模式CPU使用率NPU利用率平均延迟(ms)功耗(W)
    CPU Only98%0%187.33.2
    GPU (OpenCL)45%68%64.14.1
    NPU (RKNPU2)22%92%18.72.8
    NPU + CPU协同30%88%21.32.9
    TensorRT (x86)18%95%19.57.5

    7. 调试与诊断流程图

    当NPU未生效时,可按以下流程排查:

    graph TD A[推理速度慢] --> B{是否启用NNAdapter?} B -- 否 --> C[调用UseRKNPU2()等API] B -- 是 --> D{设备驱动就绪?} D -- 否 --> E[安装librknpu2.so等驱动] D -- 是 --> F{模型算子兼容?} F -- 否 --> G[调整subgraph_partition配置] F -- 是 --> H[启用Profiler分析瓶颈] H --> I[优化内存拷贝与预处理]

    8. 高级优化技巧

    为进一步提升性能,建议采取以下措施:

    • 启用零拷贝共享内存:通过option.UseSharedMemory()减少CPU-NPU间数据传输
    • 异步推理流水线:使用model.PredictAsync()实现多batch并行处理
    • 量化感知训练(QAT):采用INT8模型显著降低NPU计算负载
    • 动态批处理(Dynamic Batching):在视频流场景中聚合多个帧提升吞吐
    • 内核融合(Fused Kernels):利用RKNPU SDK提供的定制OP提升效率
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 9月19日