雨山的Blog

雨山的Blog

OrangePi5-pro运行大模型Qwen2.5

200
2025-01-12

Rk3588 具有 6Tops 的大模型 Ai 算力,这肯定不能浪费了啊!经过测试,orangepi 运行 3B 及以下的参数模型相当流畅!,7B 及以上未做测试。下面我以 Qwen 为例,实现模型运行。

CPU:RK3588s

内存大小:8G

使用 emmc 作为存储,额定大小 32G

Linux 版本:Debian11

Linux 内核:Linux 6.1.43-rockchip-rk3588

RKNPU driver: v0.9.8

kllm-runtime version: 1.1.4

此外,另外需要一台电脑运行 Ubuntu22.04, 内存必须大于等于 16GB, 不然在转换时容易被 kill 掉,当然可以使用 VMware!

首先请确认RKNPU driver,kllm-runtime version 是否对应,不然请更新 npu 驱动!(同一时间git pull下来的rknn-llm即可)网上的 nkllm 模型文件大都不清楚其支持的 runtime 版本,因此强烈建议自己转换一遍大模型!

RKLLM-Toolkit 功能介绍

RKLLM-Toolkit 是为用户提供在计算机上进行大语言模型的量化、转换的开发

套件。通过该工具提供的 Python 接口可以便捷地完成以下功能:

1) 模型转换:支持将 Hugging Face 格式的大语言模型(Large Language Model, LLM)

转换为 RKLLM 模型,目前我们测试能够运行的模型包括 TinyLLAMA、Qwen、

Qwen2、Phi-3、ChatGLM3、Gemma、InternLM2 和 MiniCPM,转换后的 RKLLM

模型能够在 RK3588 平台上加载使用。

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

表示权重和激活都被量化为 8 位宽度。

Ubuntu PC 端进行模型转换和编译源码

1) 首先下载 RKLLM 工具链。

cd ~
git clone https://github.com/airockchip/rknn-llm.git
wget -c https://mirrors.bfsu.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-Linux-x86_64.sh
chmod 777 Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh

2) 然后进入 Conda base 环境。

source ~/miniforge3/bin/activate

conda create -n RKLLM-Toolkit python=3.8
conda activate RKLLM-Toolkit

3) 然后使用 pip 命令安装之前下载的 RKLLM 工具链中的 whl 包(请注意最新版本号,具体请到目录里查看)

pip3 install rknn-llm/rkllm-toolkit/packages/rkllm_toolkit-{版本号}-cp38-cp38-linux_x86_64.whl

4) 最后执行以下命令如果没有报错,则说明安装成功

python

模型转换

1. 在 Ubuntu 操作系统上安装 Git LFS

sudo apt update
sudo apt install curl git
sudo apt install git-lfs
 git lfs install

2. 下载模型

这里我选择 Qwen2.5-3B-Instruct

cd ~
git clone https://www.modelscope.cn/Qwen/Qwen2.5-3B-Instruct.git

注意:Instruct代表模型进行过微调,能更好完成指令,能直接拿来使用。如果是chat 说明模型未进行微调,有更高自由度(但前提必须进行大量训练,直接使用会出现词不达意,答非所问的现象)

3. 修改 rknn-llm/rkllm-toolkit/examples/test.py 里面的 modelpath 变量的值 为 下 载 的 Qwen2.5-3B-Instruct 文 件 夹 所 在 的 绝 对 路 径 , 然 后 修 改 ret =llm.export_rkllm("./qwen.rkllm")改为 ret = llm.export_rkllm("./Qwen2.5.rkllm")

4. 另外,在rknn-llm/rkllm-toolkit/examples/test.py 同级目录下新添文件data_quant.json添加示例:

[{"input":"Human: 你好!\nAssistant: ", "target": "你好!我是善解人意,聪明的Ai助手~~"},{"input":"Human: 你可以干什么?\nAssistant: ", "target": "我可以尝试做很多事情,你可以试试考考我。"}]

你可以尝试多添加对话,这样 LLM 能更好模仿对话风格与记忆文件里面特定内容。

5. 用 python 运行 rknn-llm/rkllm-toolkit/examples/test.py 文件来转换大模型

当然你也可以自行修改 test.py 里面预定的参数,例如 Top_k,Temperature 等,你也可以修改 prompt,具体可以在网上搜一下具体参数的影响。

cd ~/rknn-llm/rkllm-toolkit/examples/
python test.py

之后稍作等待,你会发现转换时内存直接占满了(最好开启 swap 虚拟内存,防止物理内存溢出导致死机)

之后成功后,/build 得到 Qwen2.5.rkll 模型文件,下载下来,上传到 OrangePi!

编译测试代码llm_demo(二选一)

1. 下载交叉编译工具链

cd ~
sudo apt install cmake
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz(最好使用代理工具下载,或者有代理本机下载后上传)
tar -xJf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz

2. 然后修改 rknn-llm/examples/rkllm_api_demo/build-linux.sh 中的GCC_COMPILER_PATH

~/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu

2. 编译代码

cd rknn-llm/examples/rkllm_api_demo
bash build-linux.sh

当然你也可以自行修改 test.py 里面预定的参数,例如 Top_k,Temperature 等,你也可以修改 prompt,具体可以在网上搜一下具体参数的影响。

最好将 src/llm_demo.cpp 里面 text = input_str; 修改成 text = PROMPT_TEXT_PREFIX + input_str + PROMPT_TEXT_POSTFIX;

ls build/build_linux_aarch64_Release

你可以看到生成的 llm_demo 请下载上来上传到 orangePi 与 Qwen2.5.rklllm 相同的目录下!

OrangePi 板子上

1. 到模型与测试文件 llm_demo 目录下

cd /your/path

2) 然后运行下面的命令限制最多打开的文件描述符(每开一个终端都要运行)

ulimit -HSn 102400

3. 运行下面的命令来启动模型

chmod 777 llm_demo
./llm_demo ./qwen2.5.rkllm 2048 10192

基于 Gradio 搭建服务器

1. 首先将之前下载的 RKLLM 工具链 rknn-llm 中的

/examples/rkllm_server_demo/rkllm_server 文件夹和转换好的.rkllm 模型文件上传到开发板中,想用哪个大模型就上传哪个.rkllm 模型文件

2. 然后将 rkllm_server/gradio_server.py 文件中的 rkllm_lib = ctypes.CDLL('lib/librkllmrt.so')修改为 rkllm_lib = ctypes.CDLL('/usr/lib/librkllmrt.so')

3.然后在开发板上安装 pip 库和 gradio 库

sudo pip3 install "gradio>=4.24.0" -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. 然后切换到 rkllm_server 目录下运行 gradio_server.py 启动服务

python3 gradio_server.py --target_platform rk3588 --rkllm_model_path /LLM/qwen2.5.rkllm