RKLLM 使用与大语言模型部署
本文档将讲述如何使用 RKLLM 将 Huggingface 格式的大语言模型部署到 RK3588 上利用 NPU 进行硬件加速推理
目前支持模型
- TinyLLAMA 1.1B
- Qwen 1.8B
- Qwen2 0.5B
- Phi-2 2.7B
- Phi-3 3.8B
- ChatGLM3 6B
- Gemma 2B
- InternLM2 1.8B
- MiniCPM 2B
这里以 TinyLLAMA 1.1B 为例子,完整讲述如何从 0 开始部署大语言模型到搭载 RK3588 芯片的开发版上,并使用 NPU 进行硬件加速推理
提示
如没安装与配置 RKLLM 环境,请参考 RKLLM 安装
模型转换
这里以 TinyLLAMA 1.1B 为例子,用户也可以选择任意目前支持模型列表中的链接
- x86 PC 工作站中下载 TinyLLAMA 1.1B 所有文件, 如没安装 git-lfs,请自行安装
git clone https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0
- 激活 rkllm conda 环境, 可参考RKLLM conda 安装
conda activate rkllm
- 更改
rknn-llm/rkllm-toolkit/examples/huggingface/test.py
中 modelpath 模型路径与 rkllm 导出路径modelpath = 'Your Huggingface LLM model'
ret = llm.export_rkllm("./Your_Huggingface_LLM_model.rkllm") - 运行模型转换脚本
转换成功后可得到 rkllm 模型
cd rknn-llm/rkllm-toolkit/examples/huggingface
python3 test.py
编译可执行文件
- 下载交叉编译工具链 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
- 修改主程序代码, 这里修改两个地方
74 param.num_npu_core = 3; // rk3588 num_npu_core 的取值范围 [1,3]
118 string text = PROMPT_TEXT_PREFIX + input_str + PROMPT_TEXT_POSTFIX;
119 // string text = input_str; - 修改
rknn-llm/rkllm-runtime/examples/rkllm_api_demo/build-linux.sh
编译脚本中 gcc 路径GCC_COMPILER_PATH=gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
- 运行模型转换脚本
生成的可执行文件在
cd rknn-llm/rkllm-runtime/examples/rkllm_api_demo
bash build-linux.shbuild/build_linux_aarch64_Release/llm_demo
板端部署
本地终端模式
- 将转换成功后的 rkllm 模型与编译后的二进制文件 llm_demo 复制到板端
- 导入环境变量
ulimit -n 102400
export LD_LIBRARY_PATH=rknn-llm/rkllm-runtime/runtime/Linux/librkllm_api/aarch64:$LD_LIBRARY_PATH - 运行 llm_demo,输入
exit
退出bash taskset f0 ./llm_demo your_rkllm_path
Gradio 模式
服务端
- 安装 gradio
pip3 install gradio
- 复制
librkllmrt.so
到rkllm_server/lib
cd rknn-llm/rkllm-runtime
cp ./runtime//Linux/librkllm_api/aarch64/librkllmrt.so ./examples/rkllm_server_demo/rkllm_server/lib - 修改 gradio_server.py, 禁用 GPU 进行 prefill 加速
rknnllm_param.use_gpu = False
- 启动 gradio server
cd examples/rkllm_server_demo/rkllm_server
python3 gradio_server.py --target_platform rk3588 --rkllm_model_path your_model_path - 浏览器访问开发板 ip 8080 端口
客户端
用户可以在开发板开启 gradio 服务端后在同网络环境其他设备上通过 Gradio API 调用 LLM gradio server
- 安装 gradio_client
pip3 install gradio_client
- 修改 chat_api_gradio.py 中的 ip 地址,用户需要根据自己部署的具体网址进行修改
# 用户需要根据自己部署的具体 ip 进行修改
client = Client("http://192.168.2.209:8080/") - 运行 chat_api_gradio.py
bash cd rknn-llm/rkllm-runtime/examples/rkllm_server_demo python3 chat_api_gradio.py
Falsk 模式
服务端
-
安装 flask
pip3 install flask==2.2.2 Werkzeug==2.2.2
-
复制
librkllmrt.so
到rkllm_server/lib
cd rknn-llm/rkllm-runtime
cp ./runtime//Linux/librkllm_api/aarch64/librkllmrt.so ./examples/rkllm_server_demo/rkllm_server/lib -
修改 flask_server.py, 禁用 GPU 进行 prefill 加速
rknnllm_param.use_gpu = False
-
启动 flask server, 端口 8080
bash cd examples/rkllm_server_demo/rkllm_server python3 flask_server.py --target_platform rk3588 --rkllm_model_path your_model_path
客户端
用户可以在开发板开启 flask 服务端后在同网络环境其他设备上通过 flask API 调用 flask server, 户在进行自定义功能的开发的过程中,只需参考该 API 访问示例使用对应的收发结 构体进行数据的包装、解析即可
- 修改 chat_api_flask.py 中的 ip 地址,用户需要根据自己部署的具体网址进行修改
# 用户需要根据自己部署的具体 ip 进行修改
server_url = 'http://192.168.2.209:8080/rkllm_chat' - 运行 chat_api_flask.py
bash cd rknn-llm/rkllm-runtime/examples/rkllm_server_demo python3 chat_api_flask.py
部分模型性能对比
Model | Parameter Size | Chip | Chip Count | Inference Speed |
---|---|---|---|---|
TinyLlama | 1.1B | RK3588 | 1 | 15.03 token/s |
Qwen | 1.8B | RK3588 | 1 | 14.18 token/s |
Phi3 | 3.8B | RK3588 | 1 | 6.46 token/s |
ChatGLM3 | 6B | RK3588 | 1 | 3.67 token/s |