RK3588 上的 LLM(三):板端部署 RKLLM 并进行大模型推理(以 RK3588 为例)
本教程记录了如何在 RK3588 开发版上部署 RKLLM 并使用其进行大模型推理的过程,包含基于命令行的运行和服务端部署(本文以 Gradio 前后端为例)
注:运行 RKLLM 需要 RKNPU 驱动版本至少为 0.9.8,升级方法可以参考合集中升级 RKNPU 驱动版本的文章
0、安装 RKLLM Runtime:
首先拉取rknn-llm源码:
git clone https://github.com/airockchip/rknn-llm && cd rknn-llm
安装 RKLLM 的 Runtime 到/usr/lib:
sudo install rrkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so /usr/lib
1、使用命令行运行:
从源码编译llm_demo:
g++ -std=c++11 ./examples/rkllm_api_demo/deploy/src/llm_demo.cpp -o llm_demo -lrkllmrt
此时,在当前目录下会生成一个llm_demo可执行文件,此程序可以运行转换过后的模型(有关 RKLLM 的模型转换请参考这里,这里以此教程转换出的Qwen3-4B-Instruct-2507_W8A8_RK3588.rkllm模型文件为例,这里假设你已经上传此模型文件到~目录):
# 直接输入 llm_demo 可查看使用说明
llm_demo ~/Qwen3-4B-Instruct-2507_W8A8_RK3588.rkllm 2048 4096
成功运行后可直接在终端中与其对话
2、使用官方脚本搭建服务端:
官方给出了两个脚本用于搭建 RKLLM 服务器,分别基于 Flask 和 Gradio,这里以 Gradio 为例:
Gradio 服务器的脚本位于 rknn-llm 中的examples/rkllm_server_demo/rkllm_server/gradio_server.py,可以新建一个文件夹存放此项目(假设你当前位于rknn-llm文件夹下):
mkdir ~/rkllm_gradio
cp ./examples/rkllm_server_demo/rkllm_server/gradio_server.py ~/rkllm_gradio
cd ~/rkllm_gradio
随后,创建一个虚拟环境(这里以 python-venv 为例,也可使用 conda 等虚拟环境):
python -m venv venv && source venv/bin/activate
# 从清华源安装
pip install gradio -i https://pypi.tuna.tsinghua.edu.cn/simple
# --rkllm_model_path 参数为模型文件的位置,这里以转换出的`Qwen3-4B-Instruct-2507_W8A8_RK3588.rkllm`模型文件为例,这里假设你已经上传此模型文件到 ~ 目录
# --target_platform 参数为当前开发板的芯片型号,这里为rk3588
python gradio_server.py --rkllm_model_path ~/Qwen3-4B-Instruct-2507_W8A8_RK3588.rkllm --target_platform rk3588
运行后会自动监听8080端口(若无占用),此时电脑访问http://开发板ip:8080/即可直接进入网页端
2.1、使用 API 连接
Gradio 支持使用 python API 进行连接,以下是一份示例代码:
from gradio_client import Client
import sys
import time
import argparse
def main():
parser = argparse.ArgumentParser(description='Gradio客户端连接到RKLLM后端')
parser.add_argument('--text', '-t', type=str, required=True, help='要发送给模型的输入文本')
args = parser.parse_args()
# 后端URL
url = "http://127.0.0.1:8080"
try:
# 创建客户端连接
client = Client(url, verbose=False)
# print(f"已连接到后端: {url}")
except Exception as e:
print(f"连接失败: {e}")
sys.exit(1)
# 输入文本
input_text = args.text # 替换为您的输入
# 如果需要从用户输入获取,取消下一行注释:
# input_text = input("请输入您的消息: ")
try:
# 第一步:调用get_user_input端点,清空输入框并更新历史
# print("发送用户消息...")
result1 = client.predict(
user_message=input_text,
history=[], # 空历史记录
api_name="/get_user_input"
)
# result1返回 (inputtextbox, value_3)
# inputtextbox是清空后的输入框,value_3是更新后的历史
updated_history = result1[1]
# print(f"更新后的历史: {updated_history}")
# 第二步:调用get_RKLLM_output端点,获取模型回复
# print("等待模型回复...")
job = client.submit(
history=updated_history,
api_name="/get_RKLLM_output",
fn_index=1 # 第二个端点
)
# print("流式输出开始:")
last_response = ""
for output in job:
# 输出是更新后的历史记录
if output and len(output) > 0:
# 获取最后一条消息的助手回复
last_exchange = output[-1]
if len(last_exchange) > 1 and last_exchange[1]:
current_response = last_exchange[1]
# 只打印新增的部分
new_text = current_response[len(last_response):]
if new_text:
print(new_text, end='', flush=True)
last_response = current_response
time.sleep(0.05) # 稍微延迟以避免过于频繁的检查
# print("\n流式输出结束。")
print("\n ")
except Exception as e:
print(f"请求失败: {e}")
if __name__ == "__main__":
main()

浙公网安备 33010602011771号