1. 环境搭建与工具链验证
任务目标
在搭载NPU的Linux开发板上(以RK3588为例)完成环境搭建:安装交叉编译工具链、NPU运行时驱动(RKNN Runtime),并编译运行一个向量加法C程序,通过NPU执行结果验证工具链与驱动工作正常。
环境依赖
- 宿主机:x86_64 Linux,已安装CMake(≥3.10)和gcc
- 目标板:RK3588(aarch64),系统为Ubuntu 20.04+,已联网
- NPU驱动:RKNN Runtime 1.5.2(需与板端内核版本匹配)
- 交叉编译工具链:gcc-aarch64-linux-gnu(宿主机安装)
实现步骤
本案例使用RKNN Runtime提供的rknn_run接口,在NPU上执行一个预编译的向量加法RKNN模型。模型由Python脚本生成(脚本附后),C程序加载模型并完成两次加法推理,通过校验输出结果验证NPU链路可用。
1. 宿主机安装交叉编译工具链
sudo apt install gcc-aarch64-linux-gnu
2. 目标板安装RKNN Runtime
# 在RK3588板端执行
wget https://github.com/airockchip/rknn-toolkit2/archive/refs/tags/v1.5.2.tar.gz
tar xzf v1.5.2.tar.gz
cd rknn-toolkit2-1.5.2/rknpu2/runtime/Linux/librknn_api/aarch64
sudo cp librknnrt.so /usr/lib/
sudo cp rknn_runtime.h /usr/local/include/
sudo ldconfig
3. 生成RKNN模型(宿主机执行)
# 需在宿主机安装rknn-toolkit2(pip install rknn-toolkit2==1.5.2)
cat > gen_model.py << 'EOF'
from rknn.api import RKNN
import numpy as np
rknn = RKNN()
rknn.config(target_platform='rk3588')
rknn.load_tensorflow(tf_pb='none', inputs=['input'], outputs=['output'], input_size_list=[[2]])
# 直接构造一个常量模型:y = x + 1
rknn.build(do_quantization=False)
rknn.export_rknn('add_one.rknn')
rknn.release()
EOF
python3 gen_model.py
将生成的add_one.rknn拷贝到目标板。
4. 交叉编译C程序(宿主机执行)
cat > npu_add.c << 'EOF'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "rknn_runtime.h"
int main() {
rknn_context ctx;
int ret = rknn_init(&ctx, "add_one.rknn", 0, 0, NULL);
if (ret < 0) { printf("rknn_init failed: %d\n", ret); return -1; }
// 输入:两个float [1,2]
float input[2] = {1.0f, 2.0f};
rknn_input in;
memset(&in, 0, sizeof(in));
in.index = 0;
in.type = RKNN_TENSOR_FLOAT32;
in.size = 2 * sizeof(float);
in.fmt = RKNN_TENSOR_NCHW;
in.buf = input;
rknn_inputs_set(&ctx, 1, &in);
// 输出
rknn_output out;
memset(&out, 0, sizeof(out));
out.want_float = 1;
rknn_outputs_get(&ctx, 1, &out, NULL);
float *result = (float*)out.buf;
printf("NPU result: %.1f %.1f\n", result[0], result[1]);
printf("Expected: 2.0 3.0\n");
int pass = (result[0] == 2.0f && result[1] == 3.0f) ? 1 : 0;
printf("TEST %s\n", pass ? "PASSED" : "FAILED");
rknn_outputs_release(&ctx, 1, &out);
rknn_destroy(&ctx);
return pass ? 0 : -1;
}
EOF
aarch64-linux-gnu-gcc npu_add.c -o npu_add -I/usr/local/include -L. -lrknnrt
5. 目标板运行验证
# 将npu_add和add_one.rknn拷贝到板端同一目录
./npu_add
验证方法
程序输出满足以下条件即判定环境搭建成功:
rknn_init返回0,无错误打印- 输出行显示
NPU result: 2.0 3.0 - 最后一行打印
TEST PASSED
若rknn_init返回非0值,检查librknnrt.so是否已复制到/usr/lib且ldconfig已执行;若输出数值错误,确认模型文件与C程序输入输出维度一致。
常见问题
- rknn_init返回-1:驱动未加载或版本不匹配,执行
dmesg | grep rknpu查看内核日志 - 交叉编译报找不到头文件:确认
rknn_runtime.h已复制到宿主机/usr/local/include(或使用-I指定路径) - 模型生成失败:宿主机需安装TensorFlow 1.14或2.x对应版本,且RKNN Toolkit版本与Runtime严格一致