本教程记录了如何在 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()
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |