跳到主要内容

RKLLM 使用与大语言模型部署

本文档将讲述如何使用 RKLLM 将 Huggingface 格式的大语言模型部署到 RK3588 上利用 NPU 进行硬件加速推理。

目前支持模型

这里以 Qwen2.5-1.5B-Instruct 为例子,使用 RKLLM 仓库中的示例脚本, 完整讲述如何从 0 开始部署大语言模型到搭载 RK3588 芯片的开发版上,并使用 NPU 进行硬件加速推理。

提示

如没安装与配置 RKLLM 环境,请参考 RKLLM 安装

模型转换

提示

RK358X 用户 TARGET_PLATFORM 请指定 rk3588 平台

这里以 Qwen2.5-1.5B-Instruct 为例子,用户也可以选择任意目前支持模型列表中的链接。

  • x86 PC 工作站中下载 Qwen2.5-1.5B-Instruct 权重文件, 如没安装 git-lfs,请自行安装

    X86 Linux PC
    git lfs install
    git clone https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct
  • 激活 rkllm conda 环境, 可参考RKLLM conda 安装

    X86 Linux PC
    conda activate rkllm
  • 生成 LLM 模型量化校准文件

    提示

    对于 LLM 模型这里使用 rknn-llm/xamples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/export 提供的转换脚本。

    对于 VLM 模型可使用 rknn-llm/examples/Qwen2-VL_Demo/export 提供的转换脚本。对于多模态 VLM 模型请参考 RKLLM Qwen2-VL

    X86 Linux PC
    cd examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/export
    python3 generate_data_quant.py -m /path/to/Qwen2.5-1.5B-Instruct
    参数必要性描述选项
    path必要Huggingface 模型文件夹路径。N

    generate_data_quant.py 会生成模型量化时使用到的量化文件 data_quant.json

  • 更改 rknn-llm/xamples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/export/export_rkllm.py 中 modelpath 模型路径

    Python Code
    11 modelpath = '/path/to/Qwen2.5-1.5B-Instruct'
  • 更改模型上下文最大值 max_context

    如对 max_context 长度有需求,可在 rknn-llm/xamples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/export/export_rkllm.py 中的 llm.build 函数接口中修改 max_context 参数的值,默认是 4096, 值越大,占用内存越多。不得超过 16,384,且必须是 32 的倍数(例如,32、64、96、...、16,384)。

  • 运行模型转换脚本

    X86 Linux PC
    python3 export_rkllm.py

    转换成功后可得到 rkllm 模型, 此处应得到 Qwen2.5-1.5B-Instruct_W8A8_RK3588.rkllm,从模型命名中可以看出此模型是经过 W8A8 量化的适用于 RK3588 平台的 Qwen2.5-1.5B-Instruct RKLLM 模型。

编译可执行文件

  • 下载交叉编译工具链 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu

  • 修改主程序 rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy/src/llm_demo.cpp 代码

    这里需要注释掉 165 行的代码,RKLLM 在转换模型时,会自动解析 Hugging Face 模型 tokenizer_config.json 文件中的 chat_template 字段,故无需修改 chat_template。

    CPP Code
    165 // rkllm_set_chat_template(llmHandle, "", "<|User|>", "<|Assistant|>");
  • 修改 rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy/build-linux.sh 编译脚本中 GCC_COMPILER_PATH 路径

    BASH
    8 GCC_COMPILER_PATH=/path/to/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
  • 运行模型转换脚本

    X86 Linux PC
    cd rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy/
    bash build-linux.sh

    生成的可执行文件在 install/demo_Linux_aarch64

板端部署

本地终端模式

  • 将转换成功后的 rkllm 模型 与编译后生成的 demo_Linux_aarch64 文件夹拷贝到板端

  • 导入环境变量

    Radxa OS
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/demo_Linux_aarch64/lib
  • 运行 llm_demo,输入 exit 退出

    Radxa OS
    export RKLLM_LOG_LEVEL=1
    ## Usage: ./llm_demo model_path max_new_tokens max_context_len
    ./llm_demo /path/to/Qwen2.5-1.5B-Instruct_W8A8_RK3588.rkllm 2048 4096
    参数必要性描述选项
    path必要RKLLM 模型文件夹路径。N
    max_new_tokens必要每轮最大生成 token 数小于等于 max_context_len
    max_context_len必要模型最大上下文范围小于等于模型转换时的 max_context

    rkllm_2.webp

部分模型性能对比

ModelParameter SizeChipChip CountInference Speed
TinyLlama1.1BRK3588115.03 token/s
Qwen1.8BRK3588114.18 token/s
Phi33.8BRK358816.46 token/s
ChatGLM36BRK358813.67 token/s
Qwen2.51.5BRK3588115.44 token/s