找回密码
 立即注册
首页 业界区 安全 RK3588 上的 LLM(三):板端部署 RKLLM 并进行大模型推 ...

RK3588 上的 LLM(三):板端部署 RKLLM 并进行大模型推理(以 RK3588 为例)

指陡 3 天前
本教程记录了如何在 RK3588 开发版上部署 RKLLM 并使用其进行大模型推理的过程,包含基于命令行的运行和服务端部署(本文以 Gradio 前后端为例)

注:运行 RKLLM 需要 RKNPU 驱动版本至少为 0.9.8,升级方法可以参考合集中升级 RKNPU 驱动版本的文章

0、安装 RKLLM Runtime:

首先拉取rknn-llm源码:
  1. git clone https://github.com/airockchip/rknn-llm && cd rknn-llm
复制代码
安装 RKLLM 的 Runtime 到/usr/lib:
  1. sudo install rrkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so /usr/lib
复制代码
1、使用命令行运行:

从源码编译llm_demo:
  1. 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模型文件为例,这里假设你已经上传此模型文件到~目录):
  1. #  直接输入 llm_demo 可查看使用说明
  2. 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文件夹下):
  1. mkdir ~/rkllm_gradio
  2. cp ./examples/rkllm_server_demo/rkllm_server/gradio_server.py ~/rkllm_gradio
  3. cd ~/rkllm_gradio
复制代码
随后,创建一个虚拟环境(这里以 python-venv 为例,也可使用 conda 等虚拟环境):
  1. python -m venv venv && source venv/bin/activate
  2. # 从清华源安装
  3. pip install gradio -i https://pypi.tuna.tsinghua.edu.cn/simple
  4. # --rkllm_model_path 参数为模型文件的位置,这里以转换出的`Qwen3-4B-Instruct-2507_W8A8_RK3588.rkllm`模型文件为例,这里假设你已经上传此模型文件到 ~ 目录
  5. # --target_platform 参数为当前开发板的芯片型号,这里为rk3588
  6. 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 进行连接,以下是一份示例代码:
  1. from gradio_client import Client
  2. import sys
  3. import time
  4. import argparse
  5. def main():
  6.     parser = argparse.ArgumentParser(description='Gradio客户端连接到RKLLM后端')
  7.     parser.add_argument('--text', '-t', type=str, required=True, help='要发送给模型的输入文本')
  8.     args = parser.parse_args()
  9.     # 后端URL
  10.     url = "http://127.0.0.1:8080"
  11.     try:
  12.         # 创建客户端连接
  13.         client = Client(url, verbose=False)
  14. #        print(f"已连接到后端: {url}")
  15.     except Exception as e:
  16.         print(f"连接失败: {e}")
  17.         sys.exit(1)
  18.     # 输入文本
  19.     input_text = args.text  # 替换为您的输入
  20.     # 如果需要从用户输入获取,取消下一行注释:
  21.     # input_text = input("请输入您的消息: ")
  22.     try:
  23.         # 第一步:调用get_user_input端点,清空输入框并更新历史
  24. #        print("发送用户消息...")
  25.         result1 = client.predict(
  26.             user_message=input_text,
  27.             history=[],  # 空历史记录
  28.             api_name="/get_user_input"
  29.         )
  30.         # result1返回 (inputtextbox, value_3)
  31.         # inputtextbox是清空后的输入框,value_3是更新后的历史
  32.         updated_history = result1[1]
  33. #        print(f"更新后的历史: {updated_history}")
  34.         # 第二步:调用get_RKLLM_output端点,获取模型回复
  35. #        print("等待模型回复...")
  36.         job = client.submit(
  37.             history=updated_history,
  38.             api_name="/get_RKLLM_output",
  39.             fn_index=1  # 第二个端点
  40.         )
  41. #        print("流式输出开始:")
  42.         last_response = ""
  43.         for output in job:
  44.             # 输出是更新后的历史记录
  45.             if output and len(output) > 0:
  46.                 # 获取最后一条消息的助手回复
  47.                 last_exchange = output[-1]
  48.                 if len(last_exchange) > 1 and last_exchange[1]:
  49.                     current_response = last_exchange[1]
  50.                     # 只打印新增的部分
  51.                     new_text = current_response[len(last_response):]
  52.                     if new_text:
  53.                         print(new_text, end='', flush=True)
  54.                         last_response = current_response
  55.             time.sleep(0.05)  # 稍微延迟以避免过于频繁的检查
  56. #        print("\n流式输出结束。")
  57.         print("\n ")
  58.     except Exception as e:
  59.         print(f"请求失败: {e}")
  60. if __name__ == "__main__":
  61.     main()
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册