RK、边缘端部署、并行优化、内存调优、模型推理框架的常见调优方法

1. RK3588 :

  • CPU‌:采用ARM big.LITTLE架构,包含:
    • 4×Cortex-A76 大核,最高主频2.4GHz(RK3588J型号为2.0GHz)
    • 4×Cortex-A55 小核,最高主频1.8GHz(RK3588J为1.7GHz)
  • GPU‌:Mali-G610 MP4,支持OpenGL ES 3.2、Vulkan 1.2等图形API,可驱动多屏异显(如双8K输出)
  • NPU‌:集成6 TOPS算力,支持INT4/INT8/INT16/FP16混合运算,兼容TensorFlow/PyTorch等框架
  • 视频解码‌:
    • 8K@60fps H.265/VP9
    • 8K@30fps H.264
    • 4K@60fps AV1
  • 视频编码‌:8K@30fps H.265/H.2

 2.模型加速:

RK3588部署Yolov8 https://blog.csdn.net/ydscc/article/details/145708039

   模型端加速方法:

  • 更换激活函数为relu (yolov8使用silu作为激活函数,在rknn平台上运行在CPU,推理速度慢。将silu转换为relu,利用rknn可以量化到int8,可以在npu运行,起到加速推理效果,当然这会牺牲一部分推理精度。)

    • 模型8bit量化

          量化感知训练 QAT 是将训练过的模型量化后又再进行重训练。量化感知训练(Quantization Aware Training)是在模型中插入伪量化模块(fake_quant module)模拟量化模型在推理过程中进行的舍入(rounding)和钳位(clamping)操作,从而在训练过程中提高模型对量化效应的适应能力,获得更高的量化模型精度 。
      在这个过程中,所有计算(包括模型正反向传播计算和伪量化节点计算)都是以浮点计算实现的,在训练完成后才量化为真正的int8模型。
      Pytorch官方从1.3版本开始提供量化感知训练API,只需修改少量代码即可实现量化感知训练。

    • 在模型输入前加入QuantStub(),在模型输出后加入DeQuantStub()。目的是将输入从float32量化为int8,将输出从int8反量化为float32

    • 算子折叠是将模型的多个层合并成一个层,一般用来减少计算量和加速推理。

    • 在build_model中执行fuse_model()和_replace_relu,指定量化方案

    • 训练完成后实施量化和推理
      训练后量化 PTQ 是使用一批校准数据对训练好的模型进行校准, 将训练过的FP32网络直接转换为定点计算的网络,过程中无需对原始模型进行任何训练。只对几个超参数调整就可完成量化过程, 且过程简单快速, 无需训练, 因此此方法已被广泛应用于大量的端侧和云侧部署场景                                

  线程加速方法:   

     1.     每个线程绑定一个cpu 大核,线程优先级最高 ,(提升20%)

     2.      推理单独线程,预处理和后处理单独一个进程 

     3.     抽帧

    

   

2.  昇腾(Ascend)AI计算体系

模型构建-模型推理-AscendCL应用开发(Python)-应用开发-开发指南-CANN商用版8.0.RC3开发文档-昇腾社区

1. 模型转化用CANN提供的ATC工具将其转换为昇腾AI处理器能识别的OM模型。

1.1 分类模型
模型名称 输入尺寸 典型精度(Top-1) 昇腾优化特性
ResNet-50 224×224 76.3% 算子融合(Conv+BN+ReLU)
EfficientNet-B7 600×600 84.7% 动态分片计算
MobileNetV3 224×224 75.2% 深度量化(INT8)

 1.2目标检测

模型系列 代表模型 COCO mAP 昇腾适配方案
YOLO系列 YOLOv5s 37.4 自适应TensorRT替代
Faster R-CNN ResNet-50 39.8 ROI对齐硬件加速
Anchor-Free CenterNet 42.1 高斯热图生成算子优


   3.欧拉

        OS for AI:openEuler兼容NVIDIA、Ascend等主流算力平台的软件栈,为用户提供高效的开发运行环境。通过将不同AI算力平台的软件栈进行容器化封装,即可简化用户部署过程,提供开箱即用的体验。同时,openEuler也提供丰富的AI框架,方便大家快速在openEuler上使用AI能力。

  • openEuler已兼容CANN、CUDA等硬件SDK,以及TensorFlow、PyTorch等相应的AI框架软件,支持AI应用在openEuler上高效开发与运行。
  • openEuler AI软件栈容器化封装优化环境部署过程,并面向不同场景提供以下三类容器镜像。
  • openeuler/cann 存放 SDK 类镜像,在 openEuler 基础镜像之上安装 CANN 系列软件,适用于 Ascend 环境。

  • openeuler/cuda 存放 SDK 类镜像,在 openEuler 基础镜像之上安装 CUDA 系列软件,适用于 NVIDIA 环境。

  • openeuler/pytorch 存放 AI 框架类镜像,在 SDK 镜像基础之上安装 PyTorch,根据安装的 SDK 软件内容区分适用平台。

  • openeuler/tensorflow 存放 AI 框架类镜像,在 SDK 镜像基础之上安装 TensorFlow,根据安装的 SDK 软件内容区分适用平台。

4.  边缘端部署

   yolov ,resnet50,等模型量化, 

检测层配置 锚点设置

前后处理加速方法:

  • GStreamer + appsink 输出 dma-buf fd(或 zero-copy buffer)

  • RKNNLite 推理接口支持 zero-copy 输入(rknn_zero_copy_run

  • 输出同样写入 NPU buffer,避免从 NPU → CPU 的 memcpy

    Zero-copy 推理的目标就是:

  • 内存 0 拷贝(

    在正常流程中,模型推理涉及:

  • CPU 把数据准备好 → 拷贝到 DDR 内存或 NPU 输入缓存

  • 模型推理 → 输出拷贝回来 CPU → 处理输出

  • 输入张量直接绑定到 NPU 可访问的内存

  • 输出张量也是直接分配在 NPU 输出 buffer 中

  • 这样避免 CPU 和 NPU 间的数据复制,提高吞吐和降低延迟

  • mpp解码

  • rga视频前处理

 系统测加速方法:

  • CPU和NPU定频。

  • 线程池多线程处理(6个),维护线程数量,每个线程加载一个模型。目的是提高NPU利用率。

  • 双缓冲机制的原理

    双缓冲区:系统维护两个相同大小的内存区域。
    分工协作:
    生产者(如传感器、DMA):向一个缓冲区(如 Buffer A)写入数据。
    消费者(如CPU、显示模块):从另一个缓冲区(如 Buffer B)读取数据。
    交替切换:当生产者填满 Buffer A 后,立即切换到 Buffer B 继续写入,同时消费者处理 Buffer A 的数据,反之亦然

5.并行优化

一、并行计算优化

1.1 多线程 vs 多进程选择

I/O 密集型任务(网络请求、文件读写): 多线程

CPU 密集型任务(数值计算、模型推理):多进程

  1. NPU高效利用

    • 批量处理(Batch Inference)

    • 异步推理

    • NPU任务流水线

  2. CPU多核分配

    • 大核(A76)处理关键任务

    • 小核(A55)处理轻量任务

    • 绑定CPU亲和性

  3. 动态频率调节

    • 根据负载动态调整NPU/CPU频率

    • 温度监控与降频保护

6、内存优化策略

  1. 模型优化

    • 使用RKNN-Toolkit2量化模型(INT8/混合量化)

    • 裁剪YOLOv模型(移除不必要层)

    • 启用NPU硬件加速

  2. 内存复用技术

    • 预分配图像缓冲区

    • 零拷贝技术(V4L2直接内存访问)

    • 共享模型权重内存

  3. 帧处理优化

    • 降低分辨率(640x480或更低)

    • 使用灰度图像(如适用)

    • 跳帧处理(非关键帧跳过)

 补充说明:

  1. 硬件加速

    • 使用RGA(Rockchip Graphics Accelerator)进行图像处理

    • 硬件编码/解码

  2. 高级调度

    • 基于重要性的摄像头优先级调度

    • 动态资源分配

              """动态资源调整"""
              avg_time = sum(self.processing_times) / len(self.processing_times)
              
              # 动态跳帧逻辑
              if avg_time > 0.1:  # 如果平均处理时间超过100ms
                  for cam in self.cameras:
                      if cam.buffer.qsize() > 1:
                          cam.buffer.get()  # 丢弃一帧减轻负载
  3. 模型压缩

    • 知识蒸馏训练更小模型

    • 通道剪枝优化

7. 推理框架

   Rockchip,tensorRT, openvion,等

你可能感兴趣的:(harmonyos,华为)