AI 开放平台

提供适配不同硬件平台的AI模型,探索更多端侧与边缘侧场景应用

使用RKLLM部署Deepseek模型

瑞芯微: RK3588

本文档演示如何在Rockchip RK3588芯片上使用RKLLM工具链部署DeepSeek-R1-Distill-Qwen-1.5B模型。

RKLLM 工具链介绍

RKLLM-Toolkit 功能介绍

RKLLM-Toolkit 是为用户提供在计算机上进行大语言模型的量化、转换的开发套件。通过该工具提供的Python接口可以便捷地完成以下功能:

1)模型转换:支持将Hugging Face和GGUF格式的大语言模型转换为RKLLM模型, 目前支持的模型包括LLaMA, Qwen, Qwen2, Phi-2, Phi-3, ChatGLM3, Gemma, Gemma2, Gemma3, InternLM2, TeleChat2, MiniCPM-S, MiniCPM和MiniCPM3,转换后的RKLLM模型能够在Rockchip NPU平台上加载使用。

2)量化功能:支持将浮点模型量化为定点模型,目前支持的量化类型包括

  • w4a16;
  • w4a16 分组量化(支持的分组数为32, 64, 128);
  • w8a8;
  • w8a8 分组量化(支持的分组数为128, 256, 512);

RKLLM Runtime 功能介绍

RKLLM Runtime主要负责加载RKLLM-Toolkit转换得到的RKLLM模型, 并在RK3588板端通过调用NPU驱动在Rockchip NPU上加速RKLLM模型的推理。在推理RKLLM模型时,用户可以自行定义RKLLM模型的推理参数设置,定义不同的文本生成方式,并通过预先定义的回调函数不断获得模型的推理结果。

整体框架如下:

<center class="half">

<div style="background-color:#ffffff;">
<img src="https://aijishu.com/img/bVcja8" title="RKLLM" style="width: 672px; height: 378px;"/>

</center>

x86 PC工作站安装RKLLM软件工具包

要使用 RKNPU,用户需要先在 x86 工作站上运行 RKLLM-Toolkit 工具,将训练好的模型转换为 RKLLM 格式的模型,然后在开发板上使用 RKLLM C API 进行推理

  • (可选)安装 Anaconda

    如果系统中没有安装 Python 3.8(必要版本),或者同时有多个版本的 Python 环境,建议使用 Anaconda 创建新的 Python 3.8 环境

    • 安装 Anaconda

      在计算机的终端窗口中执行以下命令,检查是否安装 Anaconda,若已安装则可省略此节步骤

      $ conda --version
      conda 23.10.0

      如出现 conda: command not found, 则表示未安装 anaconda, 请参考 Anaconda 官网进行安装

    • 创建 conda 环境

      conda create -n rkllm python=3.8.2
    • 进入 rkllm conda 环境

      conda activate rkllm
    • 如要退出环境

      conda deactivate
  • 安装RKLLM-Toolkit

    git clone -b release-v1.1.4 https://github.com/airockchip/rknn-llm.git
    pip3 install ./rknn-llm/rkllm-toolkit/packages/rkllm_toolkit-1.1.4-cp38-cp38-linux_x86_64.whl

    若执行以下命令没有报错,则安装成功

    python3
    from rkllm.api import RKLLM

RKLLM 开发流程介绍

RKLLM的整体开发步骤主要分为2个部分:模型转换和板端部署运行。

1)模型转换:

在这一阶段,用户提供的Hugging Face格式的大语言模型将会被转换为RKLLM格式,以便在Rockchip NPU平台上进行高效的推理。这一步骤包括:

  • 获取原始模型:1、开源的Hugging Face格式的大语言模型;2、自行训练得到的大语言模型,要求模型保存的结构与Hugging Face平台上的模型结构一致;3、GGUF模型,目前仅支持q4_0和fp16类型模型;
  • 模型加载: 通过rkllm.load_huggingface()函数加载huggingface格式模型, 通过rkllm.load_gguf()函数加载GGUF 模型;
  • 模型量化配置:通过rkllm.build()函数构建RKLLM模型,在构建过程中可选择是否进行模型量化来提高模型部署在硬件上的性能,以及选择不同的优化等级和量化类型。
  • 模型导出:通过rkllm.export_rkllm()函数将RKLLM模型导出为一个.rkllm格式文件,用于后续的部署。

2)板端部署运行:

这个阶段涵盖了模型的实际部署和运行。它通常包括以下步骤:

  • 模型初始化:加载RKLLM模型到Rockchip NPU平台,进行相应的模型参数设置来定义所需的文本生成方式,并提前定义用于接受实时推理结果的回调函数,进行推理前准备。
  • 模型推理:执行推理操作,将输入数据传递给模型并运行模型推理,用户可以通过预先定义的回调函数不断获取推理结果。
  • 模型释放:在完成推理流程后,释放模型资源,以便其他任务继续使用NPU的计算资源。
    以上这两个步骤构成了完整的RKLLM开发流程,确保大语言模型能够成功转换、调试,并最终在Rockchip NPU上实现高效部署。

部署DeepSeek-R1-Distill-Qwen-1.5B

模型转换

  • x86 PC工作站中下载DeepSeek-R1-Distill-Qwen-1.5B权重文件,

    git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
  • 激活 rkllm conda 环境

    conda activate rkllm
  • 模型转换

    首先需要创建data_quant.json用于量化rkllm模型,我们采用fp16模型生成结果作为量化校准数据。

    其次,运行以下代码来生成data_quant.json并导出 rkllm 模型。

    cd export
    python generate_data_quant.py -m /path/to/DeepSeek-R1-Distill-Qwen-1.5B
    python export_rkllm.py

    转换成功后可得到 DeepSeek-R1-Distill-Qwen-1.5B.rkllm 模型

编译并构建可执行文件

在使用 RKLLM Runtime 的过程中,需要注意gcc交叉编译工具的版本。推荐下载交叉编译工具链 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu

deploy目录中,提供了板侧推理的示例代码。用户可以通过运行deploy/build-linux.sh脚本(将交叉编译器路径替换为实际路径)直接编译示例代码。这将在deploy目录中生成一个install/demo_Linux_aarch64文件夹,其中包含可执行文件llm_demolib文件夹。

cd deploy
# for linux
./build-linux.sh

板端部署

编译完成后生成可执行程序install/demo_Linux_aarch64/llm_demo,将编译得到的llm_demo和库文件rknn-llm/rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so以及定频脚本rknn-llm/scripts/fix_freq_rk3588.sh一并通过scp推送到板端。

# 执行定频脚本,以最高频率运行
firefly@firefly:~$ ./fix_freq_rk3588.sh
# 指定函数库路径,运行demo
firefly@firefly:~$ export LD_LIBRARY_PATH=./lib
firefly@firefly:~$ taskset f0 ./llm_demo ./DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm 2048 4096
rkllm init start
I rkllm: rkllm-runtime version: 1.1.4, rknpu driver version: 0.9.8, platform: RK3588

rkllm init success

**********************可输入以下问题对应序号获取回答/或自定义输入********************

[0] 现有一笼子,里面有鸡和兔子若干只,数一数,共有头14个,腿38条,求鸡和兔子各有多少只?
[1] 有28位小朋友排成一行,从左边开始数第10位是学豆,从右边开始数他是第几位?

*************************************************************************

user: 你是谁?
robot: <think>

</think>

您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。

user: