ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

rknn-llm 实战指南:基于 rkllm-api-demo 将 DeepSeek-R1-Distill-Qwen-1.5B 量化转换并在 RK3588 上完成端侧 C++ 推理部署

rknn-llm 实战指南:基于 rkllm-api-demo 将 DeepSeek-R1-Distill-Qwen-1.5B 量化转换并在 RK3588 上完成端侧 C++ 推理部署 大模型本地部署推理引擎模型量化嵌入式【免费下载链接】rknn-llm项目地址https://gitcode.com/gh_mirrors/rk/rknn-llm点击查看免费下载本文围绕 rknn-llm 仓库中的examples/rkllm_api_demo示例完整讲解一条可落地的端侧大模型部署链路从环境准备、使用 rkllm-toolkit 生成量化校准数据与导出.rkllm模型到借助 rkllm-runtime 的 C 风格 API 编写板端推理程序再到在 RK3588 开发板上编译、推送、固定频率并运行 llm_demo 的完整操作。读完本文你将掌握 RKLLM 模型转换与 RKLLM C API 的核心调用方式并可直接复现鸡兔同笼等示例问题的端侧推理结果。一、示例概览与工作流程rkllm_api_demo 是仓库中面向纯文本大模型的 API 部署示例其目标模型为开源的 DeepSeek-R1-Distill-Qwen-1.5B一个 15 亿参数、具备 推理链输出的蒸馏模型。示例完整覆盖了三个阶段模型转换Host 侧用 rkllm-toolkit 加载 Hugging Face 模型通过 W8A8 量化生成 RK3588 可运行的.rkllm模型文件C 板端推理Target 侧在deploy目录提供llm_demo.cpp源码与 CMake 构建脚本编译出板端可执行程序运行与调优通过adb推送、固定 CPU/NPU/GPU/DDR 频率脚本、RKLLM_LOG_LEVEL日志开关获得可复现的性能观测环境。整体链路与仓库目录的对应关系如下阶段仓库位置作用环境依赖rkllm-toolkit/packages/、rkllm-runtime/模型转换与板端推理所需工具链与运行库校准数据生成generate_data_quant.py用 fp16 模型生成量化校准样本产出data_quant.json模型导出export_rkllm.py加载模型、W8A8 量化、导出.rkllm文件板端推理llm_demo.cppRKLLM C API 完整调用示例初始化、采样参数、回调、推理构建配置CMakeLists.txt自动匹配 Linux/Android 及架构链接 librkllmrt.so运行辅助fix_freq_rk3588.sh固定 RK3588 各算力单元频率保证性能测试可复现二、环境要求原文档明确给出如下依赖以当前仓库配套的 rkllm-toolkit 1.3.0 为准rkllm-toolkit1.3.0 rkllm-runtime1.3.0 python3.9仓库内已随附与 1.3.0 版本对应的安装资源可直接使用Toolkit Python 包rkllm-toolkit-1.3.0-cp310-cp310-linux_x86_64.whl另提供 cp311、cp312、cp39 变体以及 requirements.txt 依赖清单Runtime 板端动态库Linux/aarch64/librkllmrt.so 与 Android/arm64-v8a/librkllmrt.so并提供统一的 rkllm.h 头文件。需要注意版本匹配仓库同时保留了旧版Readme.md对应 rkllm-toolkit 1.2.x、python3.8新版README.md已将要求提升到 1.3.0请以 README.md 为准。若不想自行转换文档还提到可从 rkllm_model_zoo 直接下载已转换好的 rkllm 模型文件。三、模型转换生成量化校准数据并导出 rkllm 模型转换在Hostx86 PC侧完成分为两步。3.1 用 fp16 模型生成校准数据 data_quant.json量化前必须先准备校准样本。示例采用用 fp16 精度模型的实际生成结果作为量化校准数据的策略即让原始模型在典型任务上生成输出把{输入, 目标输出}对写入data_quant.json供后续量化环节参考分布。执行命令export目录下cd export python generate_data_quant.py -m /path/to/DeepSeek-R1-Distill-Qwen-1.5Bgenerate_data_quant.py 的核心行为可从源码确认通过AutoTokenizer.from_pretrained/AutoModelForCausalLM.from_pretrained加载模型trust_remote_codeTrue按torch.cuda.is_available()自动选择cuda或cpu设备内置了一批跨领域的中英文校准样本数学应用题、函数式编程题fizz_buzz、is_multiply_prime等、中英文翻译、中文歧义句、七言绝句创作等覆盖多样化的 token 分布符合根据模型特点与使用场景准备校准样本的注释要求支持命令行参数自定义校准流程--output-file校准文件输出路径默认./data_quant.json、--apply_chat_template是否套用模型的 chat template默认开启、--max_new_tokens默认 128、--temperature默认 0.6、--repetition_penalty默认 1.1每个样本经tokenizer.apply_chat_template格式化后喂给模型做model.generate解码结果中去掉 prompt 部分得到{input: 格式化后的用户输入, target: 模型生成结果}并写入 JSON。仓库中已随附一份 data_quant.json 实际产物其条目格式如下JSON 转义后展示[ {input: 在农业生产中被当作极其重要的劳动对象发挥作用最主要的不可替代的基本生产资料是\nA. 农业生产工具\nB. 土地\nC. 劳动力\nD. 资金, target: \n\nTo determine the correct answer, lets analyze each option...}, {input: 设是 $f(x)$ 偶函数 $\\varphi(x)$ 是奇函数 则下列函数(假设都有意义)中是奇函数的是 ( )., target: ...} ]3.2 导出 RK3588 可运行的 W8A8 量化模型校准数据就绪后运行python export_rkllm.pyexport_rkllm.py 展示了 rkllm-toolkit 最核心的加载-构建-导出三段式 API加载RKLLM().load_huggingface(modelmodelpath, model_loraNone, devicecuda, dtypefloat32, custom_configNone, load_weightTrue)。源码注释给出关键参数说明device可选[cpu, cuda]dtype可选[float32, float16, bfloat16]其中bfloat16/float16可显著降低内存占用但精度略低于float32需按硬件条件取舍若持有 GGUF 模型也可改走llm.load_gguf(modelmodelpath)构建量化llm.build(do_quantizationTrue, optimization_level1, quantized_dtypeW8A8, quantized_algorithmnormal, target_platformRK3588, num_npu_core3, extra_qparamsNone, dataset./data_quant.json, hybrid_rate0, max_context4096)。其中量化算法有明确的选型建议w8a8/w8a8_gx推荐配合normal算法w4a16/w4a16_gx推荐配合grq算法num_npu_core3表示使用 RK3588 的 3 个 NPU 核心max_context4096与板端推理时的上下文长度保持一致导出llm.export_rkllm(f./{os.path.basename(modelpath)}_{quantized_dtype}_{target_platform}.rkllm)最终生成形如DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm的模型文件下文运行示例即以此文件为准。每个步骤均检查返回值ret ! 0并打印Load/Build/Export model failed!后退出便于定位失败环节。四、C 板端推理编译构建 llm_demo转换完成后的.rkllm模型将被部署到 RK3588 设备上由deploy目录的 C 示例执行推理。4.1 编译与产物按原文档说明可在deploy目录下运行./build-linux.shLinux或./build-android.shAndroid脚本完成交叉编译需将脚本中的交叉编译器路径替换为实际路径产物为deploy/install/demo_Linux_aarch64目录内含可执行文件llm_demo与lib动态库目录。本仓库实际提交中未包含这两个 build 脚本但提供了功能等价的 CMakeLists.txt其构建逻辑可印证 README 描述自动判定目标平台Android使用CMAKE_ANDROID_ARCH_ABILinux下按指针宽度区分aarch64/armhf若编译器匹配uclibc则追加_uclibc后缀通过${CMAKE_SOURCE_DIR}/../../../rkllm-runtime/${CMAKE_SYSTEM_NAME}/librkllm_api定位运行时库Android 链接librkllmrt.so并额外链接log与OpenMP::OpenMP_CXX对应 Android 目录下的 libomp.soLinux 直接链接librkllmrt.so安装路径统一为install/demo_${CMAKE_SYSTEM_NAME}_${TARGET_LIB_ARCH}可执行文件装到根目录、运行时库装到lib子目录——这正是 README 中adb push install/demo_Linux_aarch64 /data所推送的目录结构。4.2 源码级解读llm_demo.cpp 的完整调用链llm_demo.cpp 是与 rkllm.h 一一对应的完整示例其调用链可概括为rkllm_createDefaultParam → rkllm_init → rkllm_run循环→ rkllm_destroy初始化参数RKLLMParamrkllm_createDefaultParam()生成默认参数后示例显式配置了param.model_path argv[1]; // 模型路径 param.top_k 1; // Top-K 采样 param.top_p 0.95; // 核采样阈值 param.temperature 0.8; // 采样温度 param.repeat_penalty 1.1; // 重复惩罚 param.frequency_penalty 0.0; param.presence_penalty 0.0; param.max_new_tokens atoi(argv[2]); // 最大新生成 token 数 param.max_context_len atoi(argv[3]); // 最大上下文长度 param.skip_special_token true; param.extend_param.base_domain_id 0; param.extend_param.embed_flash 1; // 词嵌入向量从 flash 查询命令行调用./llm_demo /path/to/your/rkllm/model 2048 4096时2048即max_new_tokens、4096即max_context_len。对照 rkllm.h 中RKLLMParam结构体还可看到更多可选项mirostat/mirostat_tau/mirostat_etaMirostat 采样、ignore_eos_token、is_async以及RKLLMExtendParam中的enabled_cpus_num/enabled_cpus_mask指定参与推理的 CPU 核心与掩码头文件顶部定义了CPU0~CPU7位掩码、n_batch1 时开启批量推理等。回调函数推理结果通过RKLLMCallback.result_callback回调返回回调按LLMCallState状态机分发RKLLM_RUN_NORMAL逐段输出result-text若开启GET_LAST_HIDDEN_LAYER功能回调中会回传last_hidden_layer的内存指针、num_tokens与embd_size示例将其以二进制写入last_hidden_layer.bin注释提醒该指针需在本次回调内及时读取否则下次回调会释放RKLLM_RUN_FINISH本次生成结束输出换行RKLLM_RUN_ERROR报错。推理输入RKLLMInputinput_type RKLLM_INPUT_PROMPT、role user、prompt_input指向用户输入文本。头文件显示输入类型还有RKLLM_INPUT_TOKENtoken 序列、RKLLM_INPUT_EMBEDembedding 向量、RKLLM_INPUT_MULTIMODAL图文多模态对应仓库中 multimodal_model_demo 示例RKLLMInferParam.mode RKLLM_INFER_GENERATE为普通生成模式另有GET_LAST_HIDDEN_LAYER与GET_LOGITS两种模式。交互循环keep_history 0表示单轮对话、不保留历史上下文输入exit退出、clear调用rkllm_clear_kv_cache清空 KV cache输入序号0/1会映射到内置的两个示例问题。代码中还被注释保留了两类进阶用法rkllm_load_lora加载 LoRA 适配器可挂多个、按名称切换以及RKLLMPromptCacheParam的 prompt cache 保存/加载。五、在 RK3588 开发板上运行5.1 推送文件到设备cd deploy # for linux ./build-linux.sh # for android ./build-android.sh # push install dir to device adb push install/demo_Linux_aarch64 /data # push model file to device adb push DeepSeek-R1-Distill-Qwen-1.5B.rkllm /data/demo_Linux_aarch64 # push the appropriate fixed-frequency script to the device adb push ../../../scripts/fix_freq_rk3588.sh /data/demo_Linux_aarch645.2 运行 Demoadb shell cd /data/demo_Linux_aarch64 # export lib path export LD_LIBRARY_PATH./lib # Execute the fixed-frequency script sh fix_freq_rk3588.sh # Set the logging level for performance analysis export RKLLM_LOG_LEVEL1 ./llm_demo /path/to/your/rkllm/model 2048 4096预期先打印rkllm init start rkllm init success随后进入交互菜单两个预置问题**********************可输入以下问题对应序号获取回答/或自定义输入******************** [0] 现有一笼子里面有鸡和兔子若干只数一数共有头14个腿38条求鸡和兔子各有多少只 [1] 有28位小朋友排成一行,从左边开始数第10位是学豆,从右边开始数他是第几位? *************************************************************************5.3 固定频率脚本的作用运行前执行sh fix_freq_rk3588.sh是保证性能数据可复现的关键。从 fix_freq_rk3588.sh 源码可见其具体动作关闭 cpu0–cpu7 的 cpuidle 深度睡眠将 NPUfdab0000.npu切到userspacegovernor 并固定 1 GHz将 CPU 三个频点域policy0/4/6分别固定到 1.8 GHz / 2.352 GHz / 2.352 GHz固定 GPUfb000000.gpu1 GHz、DDRdmc2112 MHz。全部通过/sys设备节点写频率并回读cur_freq校验。仓库 scripts 目录还提供 RK3562、RK3576、RV1126B 等平台的对应脚本以及 eval_perf_watch_cpu.sh、eval_perf_watch_npu.sh 性能观测脚本。RKLLM_LOG_LEVEL1为性能分析日志开关设置后运行时库会输出 prefill/generate 两阶段的耗时与 token 数统计对应 rkllm.h 中RKLLMPerfStat的prefill_time_ms/prefill_tokens/generate_time_ms/generate_tokens/memory_usage_mb字段。六、端侧运行效果DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm示例 1鸡兔同笼user: 0 现有一笼子里面有鸡和兔子若干只数一数共有头14个腿38条求鸡和兔子各有多少只 robot: think 首先设鸡的数量为x兔子的数量为y。 ... 因此鸡有9只兔子有5只。 /think 要解决这个问题我们可以设鸡的数量为 \( x \)兔子的数量为 \( y \)。根据题目给出的条件 1. **头的总数**每只鸡和兔子都有一个头所以 \[ x y 14 \] 2. **腿的总数**鸡有两条腿兔子有四条腿总腿数为38条因此 \[ 2x 4y 38 \] ... **最终答案** 鸡有 \(\boxed{9}\) 只兔子有 \(\boxed{5}\) 只。示例 2排队问题user: 1 有28位小朋友排成一行,从左边开始数第10位是学豆,从右边开始数他是第几位? robot: think 首先总共有28位小朋友。 从左边开始数第10位是学豆的位置。 因此从右边开始数学豆的位置是从右边数的第(28 - 10 1) 第19位。 /think **最终答案** \boxed{19}可以看到部署在 RK3588 上的 W8A8 量化模型完整保留了 R1-Distill 系列的think推理链能力并正确输出最终答案——这也验证了前文量化校准数据应覆盖多样推理任务的实践必要性。七、小结与进阶方向至此一条完整的 RKLLM 端侧部署链路已经走通rkllm-toolkit负责将 Hugging Face 开源模型转换为 W8A8 量化.rkllm文件rkllm-runtime提供的 C APIrkllm_init/rkllm_run/rkllm_destroy 结果回调支撑板端推理程序而固定频率脚本与RKLLM_LOG_LEVEL则让性能评估具备可复现性。若需继续深入可关注本仓库的关联示例与资源图文多模态模型部署见 multimodal_model_demo其RKLLMInput的RKLLM_INPUT_MULTIMODAL输入类型与本例一脉相承更完整的 API 定义与结构体注释LoRA、prompt cache、cross-attention、函数调用等见 rkllm.h各平台固定频率与性能观测脚本见 scripts 目录官方 SDK 中文/英文手册见 doc/Rockchip_RKLLM_SDK_CN_1.3.0.pdf 与 doc/Rockchip_RKLLM_SDK_EN_1.3.0.pdf。赞分享大模型本地部署推理引擎模型量化嵌入式【免费下载链接】rknn-llm项目地址https://gitcode.com/gh_mirrors/rk/rknn-llm点击查看免费下载相关推荐DeepSeek-R1-Distill-Qwen-1.5B模型转换ONNX格式部署性能测试DeepSeek R1 Distill Qwen 1.5B模型转换ONNX格式部署性能测试 引言为什么需要模型格式转换 你是否遇到过这些问题训练好的大模DeepSeek-R1-Distill-Qwen-1.5B移动端SDKiOS/Android集成指南DeepSeek R1 Distill Qwen 1.5B移动端SDKiOS/Android集成指南 引言移动端AI推理的痛点与解决方案 你是否还在为移动端15分钟掌握AntiDupl.NET免费开源图片去重工具完整指南15分钟掌握AntiDupl.NET免费开源图片去重工具完整指南 你是否经常在整理照片时发现同一张图片有多个副本或者电脑存储空间被无数相似图片悄悄占据An图像处理桌面应用上一篇PX4 无人机线缆布线基础指南信号线缆、EMI 抑制与颜色编码规范下一篇MAA明日方舟自动化助手从入门到精通的智能游戏管理方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表