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严格一致