跳到主要内容

RKLLM DeepSeek-R1

DeepSeek-R1 是由杭州深度求索公司开发, 该模型完全开源了所有训练技术和模型权重,性能对齐闭源的 OpenAI-o1, deepseek 通过 DeepSeek-R1 的输出,蒸馏了 6 个小模型给开源社区,包括 Qwen2.5 和 Llama3.1。 本文档将讲述如何使用 RKLLM 将 DeepSeek-R1 蒸馏模型 DeepSeek-R1-Distill-Qwen-1.5B 大语言模型部署到 RK3588 上利用 NPU 进行硬件加速推理。

rkllm_2.webp

模型文件下载

提示

瑞莎已经提供编译好的 rkllm 模型和执行文件,用户可直接下载使用,如要参考编译过程可继续参考可选部分

  • 使用 git LFSModelScope 下载预编译好的 rkllm

    X86 Linux PC
    git lfs install
    git clone https://www.modelscope.cn/radxa/DeepSeek-R1-Distill-Qwen-1.5B_RKLLM.git

(可选)模型编译

提示

请用户根据 RKLLM安装 完成 PC 端和开发板端 RKLLM 工作环境的准备

提示

RK358X 用户 TARGET_PLATFORM 请指定 rk3588 平台

  • x86 PC 工作站中下载 DeepSeek-R1-Distill-Qwen-1.5B 权重文件, 如没安装 git-lfs,请自行安装

    X86 Linux PC
    git lfs install
    git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
  • 激活 rkllm conda 环境, 可参考RKLLM conda 安装

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

    X86 Linux PC
    cd examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/export
    python3 generate_data_quant.py -m /path/to/DeepSeek-R1-Distill-Qwen-1.5B
    参数必要性描述选项
    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/DeepSeek-R1-Distill-Qwen-1.5B_Demo'
  • 更改模型上下文最大值 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 模型, 此处应得到 ./DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm,从模型命名中可以看出此模型是经过 W8A8 量化的适用于 RK3588 平台的 DeepSeek-R1-Distill-Qwen-1.5B 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

板端部署

终端模式

  • 将转换成功后的 DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm 模型与编译后生成的 demo_Linux_aarch64 文件夹拷贝到板端

  • 导入环境变量

    Radxa OS
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/demo_Linux_aarch64/lib
    提示

    使用 ModelScope 下载的用户可直接 export 下载仓库里的 librkllmrt.so

  • 运行 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/DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm 2048 4096
    参数必要性描述选项
    path必要RKLLM 模型文件夹路径。N
    max_new_tokens必要每轮最大生成 token 数小于等于 max_context_len
    max_context_len必要模型最大上下文范围小于等于模型转换时的 max_context

    rkllm_2.webp

性能分析

对于数学问题: 解方程 x+y=12, 2x+4y=34, 求x,y的值

在 RK3588 上达 15.36 token/s,

StageTotal Time (ms)TokensTime per Token (ms)Tokens per Second
Prefill122.70294.23236.35
Generate27539.1642365.1015.36

在 RK3582 上达 10.61 token/s

StageTotal Time (ms)TokensTime per Token (ms)Tokens per Second
Prefill599.71817.4135.07
Generate76866.4185194.2510.61