端侧AI推理 - 基于国产AI芯片瑞芯微Rk3588的Rust内核组件开发赛预研

155 阅读8分钟

前言

最近在公司写边缘计算,也看到市面上有不少端侧推理的需求,恰好举办方又给我发来一条信息邀请参赛。 于是调研一下

lQDPJwzhrQBakRfNCWDNBDiwSDCttPPa8u0JFMGb5727AA_1080_2400.jpg

概述

旨在基于国产AI芯片瑞芯微RK3568开发板,实现StarryOS内核在ARM架构上的移植,并开发Rust语言编写的NPU驱动和AI加速组件,最终实现TinyLlama模型在端侧的高效推理。将探索Rust语言在操作系统内核和驱动开发中的优势,解决内存安全和并发性能问题,同时充分发挥国产AI芯片的算力优势

项目目标: 

  • 1.完成StarryOS内核在瑞芯微RK3568开发板上的移植 
  • 2. 开发Rust语言编写的NPU驱动,实现与StarryOS内核的无缝集成 
  • 3.设计AI加速单元组件,支持TinyLlama模型在端侧的高效推理
  • 4.提交完整的Rust内核组件代码和文档,推动国产操作系统生态发展

硬件平台分析

2.1 芯片/SoC特性分析

选用芯片型号:瑞芯微RK3568J

芯片特性: 

  • CPU:四核ARM Cortex-A55处理器,主频高达2.0GHz(典型值1.8GHz),采用22nm制程工艺 

  • NPU:内置独立神经网络处理器,算力达1TOPS@INT8,支持INT8/INT16/FP16/BFP16等精度 

  • GPU:双核Mali-G52 2EE,支持OpenGL ES 1.1/2.0/3.2、OpenCL 2.0、Vulkan 1.0/1.1

  • 视频处理:支持4096x2304@60fps H.264/H.265/VP9解码,1920x1080@60fps H.264/AVC编码 

  • 存储:支持DDR4内存,通过CPU专用eMMC接口连接存储

  • 接口:丰富的通信接口,包括3路Ethernet、3路CAN、5路USB3.0、3路RS485等

AI加速单元情况: 

  • RKNPU第三代架构,专为轻量级人工智能应用设计
  • 支持多种深度学习框架:TensorFlow、Caffe、PyTorch、ONNX等
  • 提供RKNN-Toolkit2工具链,支持模型转换和推理
  • 支持INT8量化模型,可显著提升推理速度并降低功耗

2.2 开发板/Platform特性分析

选用开发板型号:创龙科技2K1000星云开发板

开发板特性: 

  • 处理器:瑞芯微RK3568J/RK3568B2,22nm制程
  • 内存:1/2/4GB DDR4
  • 存储:8/16/32GB eMMC
  • 接口:3路Ethernet、3路CAN、5路USB3.0、3路RS485、SDIO、SPI等 
  • 显示:支持HDMI、LVDS、MIPI等多种显示接口,支持多屏异显  
  • 通信:板载WIFI模块,支持4G/5G模块
  • 调试:1路Debug UART(Type-C接口),1路RS232 UART(DB9接口)
  • 工作温度:-40℃~+85℃工业级

所需配置: 

  • 基础型号:MYD-LR3568J-32E4D-180-I-GK 

  • 内存:4GB DDR4 - 存储:32GB eMMC

  • 接口:5路USB3.0、3路RS485、1路4G/5G模块

对应价格:约1500元(含外壳和配件)

移植工作难点分析

3.1 StarryOS内核当前支持情况

StarryOS内核特性: 

  • 基于Rust语言开发,采用框内核架构,将操作系统划分为特权的”OS框架”和去特权的”OS服务” 

  • 当前仅支持x86-64虚拟机环境,尚未原生支持ARM架构

  • 兼容Linux系统调用,支持POSIX接口标准库

  • 最小内核内存占用仅13KB,对硬件资源需求低 

对RK3568芯片的支持情况: 

  • 不支持:StarryOS官方文档未列出对RK3568的支持

  • 可启动性:需从零开始适配ARM架构,包括CPU启动流程、内存管理、中断处理等 

  • 外设驱动支持:StarryOS可能已支持部分通用外设驱动,但针对RK3568的特定外设(如NPU、多路Ethernet、CAN等)需重新开发

3.2 外设驱动开发计划

准备移植的三种外设驱动类型: 

1. NPU驱动:利用Rust语言的安全特性,开发高性能NPU驱动,支持TinyLlama模型推理 

2.USB驱动:实现USB3.0接口的驱动,支持高速数据传输和设备连接 

3.Ethernet驱动:开发双路千兆以太网驱动,支持网络通信和数据传输

3.3 AI加速单元开发计划

准备开发的AI加速单元类型: 

  • NPU驱动:基于Rust语言开发,通过FFI调用RKNN-SDK的C API,实现与StarryOS内核的无缝集成 

  • AI推理引擎:设计Rust接口封装NPU推理流程,支持TinyLlama模型的高效推理 

  • 硬件抽象层:实现NPU硬件抽象层,提供统一的API接口,便于不同AI模型的集成和优化

 

开发计划

4.1 人员分工

成员职责技术栈
风轮内核架构适配、NPU驱动开发、项目协调Rust、ARM架构、Linux内核
风轮硬件适配、外设驱动开发、调试支持C、ARM架构、Linux设备驱动
风轮AI模型量化、NPU加速优化、推理接口开发Python、Rust、TinyLlama、量化技术
风轮Rust组件设计、框内核架构优化、性能测试Rust、框内核架构、并发模型

4.2 开发环境/工具

开发环境: 

  • 主机系统:Ubuntu 22.04 - Rust版本:1.70+ 

  • 交叉编译工具链:arm-linux-gnueabihf-gcc

  • Docker环境:用于模拟器测试和部署

  • 调试工具:JTAG配置工具、minicom(串口通信)

开发工具: 

  • Rust编译器:rustup 

  • FFI绑定工具:bindgen

  • NPU开发工具:RKNN-Toolkit2、RKNN-Toolkit-Lite2 

  • AI模型量化工具:GPTQ、TinyLlama量化工具

4.3 开发计划

第1周(2025年9月9日-9月15日):环境搭建与基础适配 - 安装Rust工具链和交叉编译工具链 - 搭建StarryOS开发环境,配置QEMU模拟器 - 下载并研究RK3568芯片手册和NPU驱动文档 - 验证基础交叉编译,确保内核能在模拟器中启动

第2周(2025年9月16日-9月22日):ARM架构适配 - 分析StarryOS内核的架构适配机制 - 适配ARM Cortex-A55架构的启动流程和内存管理 - 实现基础中断处理和时钟管理 - 在模拟器中验证内核启动

第3周(2025年9月23日-9月29日):NPU驱动开发 - 使用bindgen生成RKNN-SDK的FFI绑定

  • 设计Rust驱动框架,封装NPU寄存器操作和中断处理
  • 实现基础NPU算子调用和内存管理 - 在开发板上测试NPU驱动

第4周(2025年9月30日-10月6日):AI加速单元集成 - 使用GPTQ工具将TinyLlama模型量化为INT8格式

  • 设计Rust接口封装NPU推理流程 - 实现TinyLlama模型在端侧的推理 - 优化推理性能,确保延迟≤100ms

第5周(2025年10月7日-10月13日):外设驱动与系统优化 - 开发USB和Ethernet驱动,实现与StarryOS内核的集成 - 优化AI加速单元与内核的协作,减少资源竞争 - 测试系统整体性能和稳定性 - 准备代码提交和文档编写

计划设计的Rust组件说明

5.1 内核相关组件

1. npu_device(特权层)  

  • 功能:管理NPU硬件资源,提供安全的寄存器访问和中断处理 
  • API
trait NpuDevice {       
  fn init(&self) -> Result<()>;       
  fn allocate_memory(&self, size: usize) -> Result<MemoryHandle>;       
  fn free_memory(&self, handle: MemoryHandle) -> Result<()>;       
  fn submit_task(&self, task: &NpuTask) -> Result<()>;       
  fn wait_for Completion(&self, task_id: u32) -> Result<()>;   
}
  • 架构:基于StarryOS的框内核架构,将底层硬件操作封装为安全API,通过所有权系统管理内存资源,避免内存安全漏洞

2. device_manager(特权层)  

  • 功能:管理所有硬件设备,提供统一的设备接口 
    • API: 

impl DeviceManager { 
  fn register_device(&mut self, device: Box) -> Result<()>; 
  fn get_device(&self, device_type: DeviceType) -> Option<&Box>; 
  fn allocate_irq(&self, device: &Box) -> Result; } 
  • 架构:基于StarryOS的设备管理框架,通过Rust的类型系统和所有权模型,确保设备访问的安全性和效率

5.2 驱动相关组件

1. rknpu_driver(驱动层)

  • 功能:实现Rust语言编写的NPU驱动,通过FFI调用RKNN-SDK的C API
  • API: 
struct RknpuDriver { // NPU句柄和资源 }

impl RknpuDriver { 
  fn new() -> Result self; 
  fn load_model(&self, model_path: &str) -> Result ModelHandle; 
  fn run_inference(&self, model: ModelHandle, input: &InputTensor, output: &mut OutputTensor) -> Result(); 
} 
  • 架构:使用bindgen生成RKNN-SDK的FFI绑定 ,通过Rust的所有权系统和类型安全机制,确保驱动的安全性和效率

2. usb_driver(驱动层)  

  • 功能:实现USB3.0接口的驱动,支持高速数据传输和设备连接 
  • API: 
trait UsbDriver {       
        fn enumerate(&self) -> Result<DeviceList>;       
        fn open_device(&self, device_id: u32) -> Result<UsbDeviceHandle>;       
        fn close_device(&self, handle: UsbDeviceHandle) -> Result<()>;       
        fn transfer(&self, handle: UsbDeviceHandle, endpoint: u8, data: &mut[u8]) -> Result<()>;   
}

  • 架构:基于StarryOS的USB驱动框架,通过Rust的类型系统和所有权模型,确保USB设备访问的安全性和效率

5.3 AI应用相关组件

1. accelerator(AI加速抽象层)  

  • 功能:提供统一的AI加速接口,支持不同硬件加速单元 
  • API: 

trait Accelerator {

fn allocate_memory(&self, size: usize) -> Result;

fn free_memory(&self, handle: MemoryHandle) -> Result<()>;

fn submit_task(&self, task: &Task) -> Result u32;

fn wait_for-completion(&self, task_id: u32) -> Result<()>;

}

struct RknpuAccelerator { // NPU句柄和资源 }

impl Accelerator for RknpuAccelerator { // 实现加速器接口 } 
  • 架构:基于Rust的 trait 系统,定义AI加速接口,实现对瑞芯微NPU的适配,确保接口的安全性和可扩展性

2. tinyllama_inference(AI应用层)  - 功能:实现TinyLlama模型在端侧的高效推理 

  • API: 

struct TinyLlamaInference { // 模型和加速器句柄 }

impl TinyLlamaInference {

fn new(model_path: &str, accelerator: Box) -> Result self;

fn generate(&self, prompt: &str, max_tokens: u32) -> Result;

fn quantify(&self, model: &str, output: &str) -> Result(); } 
  • 架构:基于量化后的TinyLlama模型,通过Rust的 trait 系统和所有权模型,实现模型推理的安全性和高效性,支持实时问答场景