大语言模型

1.RKLLM 介绍

RKLLM SDK可以帮助用户快速将大语言模型部署到AIBOX-3576上。 SDK下载

1.1 RKLLM-Toolkit 功能介绍

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

  • 模型转换:支持将 Hugging Face 格式的大语言模型(Large Language Model, LLM)转换为RKLLM 模型,转换后的 RKLLM 模型能够在 Rockchip NPU 平台上加载使用。

  • 量化功能:支持将浮点模型量化为定点模型,目前支持的量化类型包括 w4a16 和 w8a8。

1.2 RKLLM Runtime 功能介绍

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

2.RKLLM-Toolkit 安装

RKLLM-Toolkit目前只适用于Linux PC,建议使用Ubuntu20.04(x64)。因为系统中可能同时有多个版本的 Python 环境,建议使用 miniforge3 管理 Python 环境。

# 检查是否安装 miniforge3 和 conda 版本信息,若已安装则可省略此小节步骤。
conda -V
# 下载 miniforge3 安装包
wget -c https://mirrors.bfsu.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-Linux-x86_64.sh
# 安装 miniforge3
chmod 777 Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh
# 进入Conda base 环境,miniforge3 为安装目录
source ~/miniforge3/bin/activate
# 创建一个 Python3.8 版本(建议版本)名为 RKLLM-Toolkit 的 Conda 环境
conda create -n RKLLM-Toolkit python=3.8
# 进入 RKLLM-Toolkit Conda 环境
conda activate RKLLM-Toolkit
# 安装 RKLLM-Toolkit,如rkllm_toolkit-1.0.1-cp38-cp38-linux_x86_64.whl
pip3 install packages/rkllm_toolkit-1.0.1-cp38-cp38-linux_x86_64.whl

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

python
from rkllm.api import RKLLM

3.大语言模型部署例程

RKLLM已支持的大语言模型如下

Model Huggingface Link
TinyLLAMA-1.1B LINK
Qwen-1.8B LINK
Qwen2-0.5B LINK
Phi-2-2.7B LINK
Phi-3-3.8B LINK
ChatGLM3-6B LINK
Gemma-2B LINK
InternLM2-1.8B LINK
MiniCPM-2B LINK

3.1 大语言模型转换运行Demo

下面以RKLLM SDK的rkllm-toolkit/examples/test.pyrkllm-runtime/examples/rkllm_api_demo为例演示如何转换、量化、导出大语言模型,最后在板端部署运行。

3.1.1 在 PC 上转换模型

以Qwen-1.8B为例,点击表格链接,克隆完整仓库内容。然后在test.py设置要转换的模型路径

# 注意是克隆下来的 Qwen-1.8B 仓库路径
modelpath = '/rkllm/rkllm_model/Qwen-1_8B-Chat'

在前述RKLLM-Toolkit安装正确的前提下,进入Conda base 环境,执行test.py。即可得到转换模型。

(RKLLM-Toolkit) root@ea5d57ca8e66:/rkllm/rknn-llm/rkllm-toolkit/examples/huggingface# python3 test.py 
rkllm-toolkit version: 1.0.1
Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:01<00:00,  1.84it/s]
Optimizing model: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 24/24 [02:13<00:00,  5.55s/it]
Converting model: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 195/195 [00:00<00:00, 2363841.85it/s]
Model has been saved to ./Qwen-1.8b.rkllm!

3.1.2 在 AIBOX-3576 上部署运行RKLLM模型

3.1.2.1 板端内核要求

在板端使用RKLLM Runtime 进行模型推理前,首先需要确认板端的NPU 内核是否为v0.9.6版本以上

root@firefly:/# cat /sys/kernel/debug/rknpu/version
RKNPU driver: v0.9.6
3.1.2.2 RKLLM Runtime 的编译要求

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

3.1.2.3 板端运行推理

参考例程rkllm-runtime/examples/rkllm_api_demo进行编译,将编译得到的rkllm_demo和库文件rkllm-runtime/runtime/Linux/librkllm_api/aarch64/librkllmrt.so一并通过scp推送到板端。

# 提高可打开的文件描述符数量上限
root@firefly:/# ulimit -n 102400 
root@firefly:/# ./llm_demo Qwen-1.8b.rkllm 
rkllm init start
rkllm-runtime version: 1.0.1
rkllm init success

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

[0] 把下面的现代文翻译成文言文:到了春风和煦,阳光明媚的时候,湖面平静,没有惊涛骇浪,天色湖光相连,一片碧绿,广阔无际;沙洲上的鸥鸟,时而飞翔,时而停歇,美丽的鱼游来游去,岸上与小洲上的花草,青翠欲滴。
[1] 以咏梅为题目,帮我写一首古诗,要求包含梅花、白雪等元素。
[2] 上联: 江边惯看千帆过
[3] 把这句话翻译成中文:Knowledge can be acquired from many sources. These include books, teachers and practical experience, and each has its own advantages. The knowledge we gain from books and formal education enables us to learn about things that we have no opportunity to experience in daily life. We can also develop our analytical skills and learn how to view and interpret the world around us in different ways. Furthermore, we can learn from the past by reading books. In this way, we won't repeat the mistakes of others and can build on their achievements.
[4] 把这句话翻译成英文:RK3588是新一代高端处理器,具有高算力、低功耗、超强多媒体、丰富数据接口等特点

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

user: 你是谁?
robot: 我是来自阿里云的大规模语言模型,我叫通义千问。
3.1.2.4 聊天模板

LLM 的一个常见应用场景是聊天。在聊天上下文中,不再是连续的文本字符串构成的语句,聊天模型由一条或多条消息组成的对话组成,每条消息都有一个“用户“或“助手”等角色,还包括消息文本。然而不同的模型对聊天的输入格式要求也不同。聊天模板用于将问答的对话内容转换为模型的输入prompt。倘若使用空的聊天模板或者使用默认的聊天模板,与模型在训练期间看到的消息格式不匹配,可能会导致性能下降。

例如查看ChatGLM3的聊天模板

<|system|>
You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.
<|user|>
Hello
<|assistant|>
Hello, I'm ChatGLM3. What can I assist you today?

4.其他

更多demo和api使用请参考RKLLM SDK例程和文档。

5.FAQs

Q1:转换模型失败?

A1:检查 PC 可用运行内存,参数量越大的模型转换或者运行时所需的内存越大,可以尝试增大 swapfile 或者使用大内存的 PC。

Q2:板端运行报错E RKNN: [08:05:50.345] failed to convert handle(1120) to fd, ret: -1, errno: 24, errstr: Too many open files ?

A2:大语言模型运行时打开文件较多,参考前述提高可打开的文件描述符数量上限

Q3:use_gpu设置为true时报错

A3:ln -s /usr/lib/aarch64-linux-gnu/libmali.so /usr/lib/aarch64-linux-gnu/libOpenCL.so