前言
最近在公司写边缘计算,也看到市面上有不少端侧推理的需求,恰好举办方又给我发来一条信息邀请参赛。 于是调研一下
概述
旨在基于国产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 系统和所有权模型,实现模型推理的安全性和高效性,支持实时问答场景