当前位置: 首页 > news >正文

MTK 后端初探

一、背景知识了解

1.1 MTK 官方推理 SDK:NeuroPilot

NeuroPilot 是联发科官方的 AI 计算框架,基于 Android NNAPI,并兼容 TensorFlow Lite、ONNX、Caffe 等主流框架。

🔹 支持硬件加速

  • APU(AI Processing Unit)——专用于 AI 加速(部分高端 MTK 处理器配备)。

  • GPU 加速(通过 OpenCL 或 Vulkan 计算)。

  • CPU Fallback(在不支持 APU/GPU 的设备上,使用 CPU 进行推理)。

🔹 适用场景

  • 手机端 AI 计算(如人脸识别、语音识别、NLP)。

  • 计算机视觉(图像分类、目标检测)。

  • 边缘 AI 推理(IoT 设备)。

🔹 使用方法

基于 Android NNAPI(官方推荐方式):

  • 直接调用 Android Neural Networks API (NNAPI),NeuroPilot 作为后端自动优化推理性能。

  • 适用于 TensorFlow Lite、ONNX Runtime 等框架。

NeuroPilot SDK(高级优化):

  • 提供 C++ API 和 Android Java API,可深度优化 AI 计算。

如何获取

  • 访问 MTK NeuroPilot 官网,申请 SDK 访问权限。

MDLA(MediaTek Deep Learning Accelerator)是联发科(MediaTek)为其设备提供的深度学习加速器,用于优化和加速神经网络模型的推理。MDLA 是 MediaTek AI 处理单元(APU)的一部分,与 VPU(视觉处理单元)一起,为 AI 模型提供高效的计算能力。

1.2 MDLA 的模型格式

MDLA(MediaTek Deep Learning Accelerator联发科(MTK) 处理器的一种 AI 加速单元,用于运行 深度学习模型。但 MDLA 不是一种模型格式,而是一种 硬件单元,专门用于 AI 计算加速。

使用 .dla 文件格式作为其模型格式。这种格式是通过 MediaTek 的 Neuron SDK 工具链从常见的模型格式(如 TensorFlow Lite)转换而来的。以下是将模型转换为 MDLA 支持的 .dla 格式的典型步骤:

1. 将原始模型转换为 TensorFlow Lite 格式:使用 MediaTek 提供的 mtk_converter 工具或官方转换工具,将原始模型(如 .pb 格式的 TensorFlow 模型)转换为 TensorFlow Lite 格式。

2. 将 TensorFlow Lite 模型转换为 .dla 格式:使用 Neuron SDK 中的 ncc-tflite 工具,将 TensorFlow Lite 模型编译为 .dla 格式。

1.3 libDmabufHeap.so

libdmabufheap.so 是一个与 DMA-BUF(Direct Memory Access Buffer) 相关的共享库,通常用于 内存管理和高效数据共享,特别是在 Android、Linux 内核和嵌入式设备(如 MTK、Qualcomm、Samsung 等 SoC)上。

1️⃣ libdmabufheap.so 作用

用于 DMA-BUF 共享内存管理(DMA-BUF Heap) 在不同设备、进程或硬件组件(如 CPUGPUISP)之间高效共享内存 主要应用在 Android / Linux 设备的 Camera、GPU、AI 计算、视频处理等场景

📌 它通常被用于 Android dmabuf_heap 机制,支持高效的零拷贝(zero-copy)数据传输。

2️⃣ libdmabufheap.so 适用场景

场景作用
Camera 图像处理在 ISP(Image Signal Processor)、GPU、CPU 之间共享 Camera 采集的数据,提高性能
AI / 深度学习AI 加速器(如 MDLA、APU)和 CPU/GPU 共享数据时减少拷贝
视频编解码(Codec)在解码器、GPU 渲染、显示控制器之间共享内存,提高视频流处理性能
GPU 渲染OpenGL、Vulkan 需要高效管理 Framebuffer
Display / UI 组件硬件加速 UI 组件,提高 Android 界面渲染性能

libdmabufheap.so 相关技术

DMA-BUFDirect Memory Access Buffer一种 Linux 内核内存共享机制,允许多个硬件组件(CPU、GPU、AI 处理器等)共享内存,避免不必要的内存拷贝。

dmabuf_heap 机制(Android 10+ 引入)提供高效的动态分配 DMA-BUF 内存,用于 AI、Camera、GPU 等应用场景。

Android /dev/dmabuf_heap/ 设备节点 允许进程动态申请内存,例如:

int fd = open("/dev/dmabuf_heap/system", O_RDWR);

如果你的设备是 MediaTek(MTK)SoC,libdmabufheap.so 可能是用于 AI 计算(MDLA)、Camera、GPU 渲染等任务。 在 Android 设备上,可能在 /system/lib64//vendor/lib64/ 目录下找到该库。

1.4 计算单元的功能

在 MediaTek(MTK)芯片 上使用 MDLA(Mediatek Deep Learning Accelerator) 进行推理时,主要的计算任务是在 NPU(Neural Processing Unit)上进行的。但在实际运行过程中,CPU 和 GPU 也可能参与某些计算任务,具体情况如下:

1. MDLA(主要执行推理)

核心角色:专门用于加速神经网络(NN)推理的计算单元,属于 NPU 架构的一部分。

适用任务:

  卷积(Convolution)

  全连接层(Fully Connected)

  激活函数(ReLU, Sigmoid, Tanh)

  归一化(BatchNorm, LayerNorm)

  其他常见的深度学习算子(MatMul, Pooling)

优势

  吞吐量(比 CPU 快 10-50 倍)

  低功耗(比 GPU 更节能)

  适合边缘 AI 设备

2. CPU(调度 & 预处理)

虽然推理的主要计算任务由 MDLA 负责,但 CPU 仍然负责一些关键任务

  • 模型解析与加载(如 Neuron SDK 处理 ONNX)

  • 任务调度(决定哪些计算交给 MDLA)

  • 数据预处理(如归一化、数据转换)

  • 后处理(如 Softmax、Argmax)

常见的 CPU 计算任务

  • 处理 控制逻辑调度任务

  • 运行不支持 MDLA 加速的 小型算子

  • 进行 数据格式转换(如 NCHW ↔ NHWC)

CPU 计算适用情况

  • 小模型(如 MobileBERT)

  • 少量计算(如 MLP 任务)

  • 模型初始化 & 预处理

3. GPU(可能辅助计算)

虽然 GPU(Mali G系列 / PowerVR) 也能执行部分 AI 任务,但在 MDLA 可用时,GPU 通常不会执行主要的推理计算。但 GPU 可能用于:

  • 未优化的模型推理(如果某些算子 MDLA 不支持)

  • 图像处理(如 OpenCL 计算任务)

  • 渲染任务(如果涉及图像生成)

总结:当在 MTK 平台 使用 MDLA 进行推理 时:

CPU 解析模型(Neuron SDK 解析 ONNX) CPU 预处理数据(格式转换 / 归一化) CPU 调度任务(确定哪些计算交给 MDLA) MDLA 进行推理(主要算子计算在 NPU/MDLA 上执行) CPU 处理后处理任务(Softmax / Argmax) CPU / GPU 处理额外任务(如图像渲染)

二、将mtk作为后端的大致实现

  1. 和opencl编程类似,首先需要基于neuron SDK进行编程,使用dlopen加载so 库,获取运行时的handle句柄。

  2. handle = dlopen("/vendor/lib64/libneuron_runtime.so", RTLD_LAZY);

  3. 包含头文件,里面会有neuron 的系统函数接口。主要是基于这些接口进行模型的加载,推理,内存分配。

  4. 定义函数指针,利用宏定义将neuron系统函数重命名成便于理解的函数名称。

  5. 在flatbuffer 中定义mdla_buffer[]数组,存放mdla的模型文件.

  6. dla文件其实是将onnx等模型转换成mtk的模型文件,转成wind文件不需要再像onnx 一样一个一个算子的进行转换,dla文件其实已经在转换的时候将算子的计算图已经构建好了,也就是类似于wind的pipeline 已经准备好了。那么只需要读取dla文件到内存中,读取mtk的输入数据bin, 调用runtime函数就可以实现模型的推理。

  7. dlsym() 可以调用打开的so的系统函数。这个也是获取libneuron_runtime.so的系统函数的方法。类似这样子:

    #include <stdio.h>
    #include <stdlib.h>
    #include <dlfcn.h>
    
    int main() {
        // 打开动态库
        void *handle = dlopen("./libexample.so", RTLD_LAZY);
        if (!handle) {
            fprintf(stderr, "dlopen failed: %s\n", dlerror());
            return 1;
        }
        // 获取函数地址
        void (*func)() = (void (*)())dlsym(handle, "example_function");
        if (!func) {
            fprintf(stderr, "dlsym failed: %s\n", dlerror());
            dlclose(handle);
            return 1;
        }
        // 调用函数
        func();
        // 关闭动态库
        dlclose(handle);
        return 0;
    }

  8. 读取输入数据bin文件,然后设置输入,输出,主要是将输入,输出保存tensor buffer进行设置。然后可以调用NeuronRuntime__inference(*runtime)函数进行模型的推理,这个是一个同步函数,会阻塞调用的线程,直到返回结果。

     9. 使用libDmabufHeap.so 进行内存的管理,核心是共享内存,很高效的实现了各个硬件计算单元的数据通信,cpu, gpu, npu。

相关文章:

  • 如何正确地在 Postman 中添加认证 Token?
  • 3PL EDI:SA Piper Logistics EDI需求分析
  • AWS API Gateway Canary部署实战:Lambda到ECS的平滑迁移指南
  • 上位机知识篇---Linux中pythonpipapt
  • 【SpringCloud】Eureka的使用
  • Qt下载模板到本地文件内容丢失问题
  • 软件项目管理课程之第4讲:软件需求管理
  • 重温:时间窗口与滑动步长的概念
  • 【算法】动态规划:子序列问题、回文子串问题、两个数组的dp
  • C++ 变量类型
  • Qt 信号和槽
  • 原型模式为什么可以解决构建复杂对象的资源消耗问题
  • 天洑参展2025全球产业科技创新与投资促进大会
  • dify + deepseek /qwen + win +xinference 等完成知识库建设
  • STM32 IIC通信
  • 从春招“AI热潮”看科技变革中的就业新趋势
  • 学习不同电脑cpu分类及选购指南
  • 【Linux-驱动开发-pinctrl子系统】
  • AI大模型从0到1记录学习 day08
  • Django:构建高性能Web应用
  • 日月谭天丨这轮中美关税会谈让台湾社会看清了什么?
  • 马上评丨岂能为流量拿自己的生命开玩笑
  • “救护车”半路加价?陕西卫健委已介入,记者调查:黑救护车挤占市场
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 《新时代的中国国家安全》白皮书(全文)
  • “影像上海”中的自媒体影像特展:无论何时,影像都需要空间