Rhino X1 Qwen3-8B 端侧部署说明(qwen3-8b-qnn2.36-w4a16-qcs8550)

azouyana 2026-09-21 09:39:01

本文档记录在 Rhino X1 QCS8550 边缘设备上,基于 AidGenSE 推理引擎部署 Qwen3-8B 大语言模型并启动 OpenAI 兼容 HTTP 服务的完整流程与实测结果。

参考文档:使用 AidGenSE 部署 LLM HTTP Server | APLUX Doc Center


1. 部署环境

项目说明
设备QCS8550 平台(SoC ID 603,kalama
系统Ubuntu 22.04.2 LTS(内核 5.15.148-android13,aarch64)
推理引擎AidGenSE v3.3.1(Genie 后端)
推理单元Hexagon DSP / HTP(NPU)

软件依赖包

包名版本用途
aidgense3.3.1AidGenSE 推理引擎主体
aidgen-sdk2.4.3.166AidGen SDK 运行时
aidgen-qnn2362.4.0.139QNN 2.36 运行时(本模型必需)
aidgen-qnn2402.4.3.166QNN 2.40 运行时(可选)
aidgen-qnn2482.4.3.166QNN 2.48 运行时(可选)

2. 模型信息

项目说明
模型名称qwen3-8b-qnn2.36-w4a16-qcs8550
模型类型LLM(纯文本大语言模型)
量化方式W4A16(权重 4bit / 激活 16bit)
转换工具链Qualcomm QNN 2.36
上下文长度4096 tokens(cl4096
磁盘占用约 5.4 GB(5 个 serialized.bin 分片 + tokenizer + 配置)
模型存放路径/opt/aidlux/app/aid-openai-api/res/models/qwen3-8b-qnn2.36-w4a16-qcs8550/
默认采样参数temperature=0.7,top-k=20,top-p=0.8,seed=42

模型目录结构:

/opt/aidlux/app/aid-openai-api/res/models/qwen3-8b-qnn2.36-w4a16-qcs8550/
├── qwen3-8b_qnn236_qcs8550_cl4096_1_of_5.serialized.bin   # 模型权重分片(共 5 片)
├── qwen3-8b_qnn236_qcs8550_cl4096_2_of_5.serialized.bin
├── qwen3-8b_qnn236_qcs8550_cl4096_3_of_5.serialized.bin
├── qwen3-8b_qnn236_qcs8550_cl4096_4_of_5.serialized.bin
├── qwen3-8b_qnn236_qcs8550_cl4096_5_of_5.serialized.bin
├── qwen3-8b-tokenizer.json          # 分词器
├── qwen3-8b-qnn2.36-w4a16-qcs8550.json   # AIDL/Genie 推理配置
├── aidgen_config.json               # AidGenSE 服务配置
├── config_linux.json                # Linux 平台配置
├── htp_backend_ext_config.json      # HTP 后端扩展配置(NPU 性能参数)
├── prefix-kvcache/                  # 前缀 KV Cache
├── prompt.conf                      # 提示词模板
├── chat-think.txt / chat-nothink.txt # 思考/非思考模式参考模板
└── tokenizer.json

3. 部署步骤

步骤一:安装 AidGenSE 依赖

sudo aid-pkg update
sudo aid-pkg -i aidgense
sudo aid-pkg -i aidgen-sdk
sudo aid-pkg -i aidgen-qnn236    # 部署 QNN 2.36 模型必需
sudo aid-pkg -i aidgen-qnn240
sudo aid-pkg -i aidgen-qnn248

验证安装:

aid-pkg list | grep -E "aidgen|qnn"

步骤二:查询与下载模型

# 查看远程仓库已支持的模型(可配合 grep 过滤)
aidllm remote-list api | grep qwen3-8b

# 下载模型(约 4.9 GB 安装包,解压后约 5.4 GB,耗时取决于网速)
aidllm pull api qwen3-8b-qnn2.36-w4a16-qcs8550

# 查看已下载模型
aidllm list api

下载成功的输出示例:

Pulling API model qwen3-8b-qnn2.36-w4a16-qcs8550...
Downloading package 100% [==========================] (4.9/4.9 GB, 10 MB/s)
Extracting package...
Pull API model qwen3-8b-qnn2.36-w4a16-qcs8550 successfully!

步骤三:启动 HTTP 服务

# 启动 OpenAI 兼容 HTTP 服务(默认端口 8888)
aidllm start api -m qwen3-8b-qnn2.36-w4a16-qcs8550

启动成功输出示例:

Use model:  qwen3-8b-qnn2.36-w4a16-qcs8550
Processor:  dsp
args : [--device dsp --qnn_ver 240]
Api server start successfully.

注意:若服务已在运行(例如运行其他模型),需先执行 aidllm stop api 再启动。

步骤四:服务管理

aidllm status api      # 查看服务状态
aidllm stop api        # 停止服务
aidllm restart api     # 重启服务

常见启动参数(aidllm start api --help):

参数说明默认值
-m, --model指定模型 ID
-p, --port服务端口8888
-d, --device推理单元(cpu / gpu / dsp)自动选择 dsp
--qnn_verQNN 版本(236 / 240 / 248)240
-b, --backend推理框架(genie / llamacpp)genie
--api_keyBearer Token 鉴权密钥(可选)

4. 接口测试

4.1 健康检查与服务信息

curl http://127.0.0.1:8888/health

返回示例(可查看驱动版本、后端、设备等信息):

{
  "status": "ok",
  "aidgen_api_version": "Aplux_Aidgen_V2.4.3.166_...",
  "svr_status": "SVR_STATUS_START_SUCCESS",
  "svr_current_backend": "genie",
  "svr_current_device": "dsp"
}

4.2 查看已加载模型

curl http://127.0.0.1:8888/v1/models
{"object":"list","loaded_id":"qwen3-8b-qnn2.36-w4a16-qcs8550","model_type":"llm", ...}

4.3 curl 对话测试(非流式)

curl -s -X POST http://127.0.0.1:8888/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3-8b-qnn2.36-w4a16-qcs8550",
    "messages": [{"role": "user", "content": "你好,请用一句话介绍你自己"}],
    "stream": false
  }'

4.4 Python 流式对话测试

工作区已附带测试脚本 test_chat.py

python3 test_chat.py

脚本核心逻辑(OpenAI 兼容 SSE 流式解析):

import requests, json

url = "http://127.0.0.1:8888/v1/chat/completions"
payload = {
    "model": "qwen3-8b-qnn2.36-w4a16-qcs8550",
    "messages": [{"role": "user", "content": "你好。"}],
    "stream": True,
}
response = requests.post(url, json=payload, stream=True)
for line in response.iter_lines():
    if line and line.decode("utf-8").startswith("data: "):
        data = line.decode("utf-8")[len("data: "):]
        if data.strip() == "[DONE]":
            break
        content = json.loads(data)["choices"][0]["delta"].get("content")
        if content:
            print(content, end="", flush=True)

4.5 Web UI 对话测试(可选)

sudo aidllm install ui    # 安装 UI 前端服务(首次)
aidllm start ui           # 启动 UI 服务
aidllm status ui          # 查看状态

浏览器访问:http://<设备IP>:51104


5. 思考模式(Thinking Mode)说明

Qwen3 默认开启思考模式,输出中会包含 <think>...</think> 推理过程,响应更慢但更准确。可在用户消息末尾追加 /no_think 关闭思考模式,显著降低延迟:

curl -s -X POST http://127.0.0.1:8888/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3-8b-qnn2.36-w4a16-qcs8550",
    "messages": [{"role": "user", "content": "用一句话介绍杭州。/no_think"}],
    "stream": false
  }'
模式说明实测效果
默认(思考)输出 <think> 推理过程回答更严谨,耗时较长
/no_think跳过推理过程直接回答响应快(示例问题约 2.8s / 30 tokens)

6. 实测记录

测试项结果
aidllm list apiqwen3-8b-qnn2.36-w4a16-qcs8550 已列出 ✅
aidllm start api -m ...Api server start successfully,端口 8888 监听 ✅
/v1/modelsloaded_id = qwen3-8b-qnn2.36-w4a16-qcs8550
非流式对话(首次,含思考)正常返回中文回答,230 tokens,约 20.7s(含首次加载)
流式对话(test_chat.pySSE 流式输出正常,逐字返回 ✅
/no_think 对话正常返回,30 tokens,约 2.8s ✅

7. 常见问题(FAQ)

Q1:aidllm start api 报错 api service is already running

说明服务已在运行。先停止再启动:

aidllm stop api
aidllm start api -m qwen3-8b-qnn2.36-w4a16-qcs8550

Q2:启动失败或报 QNN / 模型加载错误?

确认已安装对应 QNN 版本依赖包(本模型需要 aidgen-qnn236),并检查:

aid-pkg list | grep aidgen
aidllm status api

Q3:推理速度慢?

  • 首次请求包含模型加载,耗时较长属正常现象,后续请求明显加快;
  • 简单问答场景建议在消息末尾加 /no_think 关闭思考模式;
  • 避免并发请求过多(svr_slot_num 默认为 1,串行推理)。

Q4:如何释放磁盘空间?

删除不需要的模型:

aidllm rm api <模型名>

Q5:手机/PC 如何远程访问服务?

服务默认监听 0.0.0.0:8888,局域网内可通过 http://<设备IP>:8888/v1/chat/completions 访问;如需公网访问,建议开启 API Key 鉴权:

aidllm start api -m qwen3-8b-qnn2.36-w4a16-qcs8550 --api_key your-secret-key

8. 服务接口速查

接口方法说明
http://<IP>:8888/healthGET健康检查与版本信息
http://<IP>:8888/v1/modelsGET模型列表(OpenAI 兼容)
http://<IP>:8888/v1/chat/completionsPOST对话补全(支持 stream)(OpenAI 兼容)

其中 model 字段统一填写:qwen3-8b-qnn2.36-w4a16-qcs8550


9. 拓展设想:接入 QQ / 微信,打造"代聊"聊天机器人

9.1 设想目标

将本机部署的 Qwen3-8B 作为"对话大脑",通过一个消息桥接服务接入 QQ / 微信,实现:

  • 收到消息后自动调用本地模型生成回复(代聊);
  • 支持自定义人设(system prompt)与语气,模仿"我"的聊天风格;
  • 支持触发规则:私聊全量回复、群聊仅被 @ 时回复、联系人 / 关键词白名单;
  • 消息全部在本设备本地推理,聊天内容不出设备,隐私可控。

9.2 整体架构

img

9.3 接入方案选型

平台方案协议 / 工具合规性说明
QQ官方机器人QQ 机器人开放平台(q.qq.com)+ 官方 SDK botpy✅ 官方需注册开发者与机器人,支持频道 / 群 / 私聊
QQ个人号(非官方)OneBot v11 协议 + NapCat / Lagrange.Core 等实现⚠️ 灰色登录个人 QQ 收发消息,存在风控 / 封号风险
微信官方企业微信应用消息 / 群机器人 Webhook、微信公众号消息回调✅ 官方企业微信机器人群内自动回复,公众号支持消息回调
微信个人号(非官方)Wechaty(付费 puppet)等框架⚠️ 灰色自动化个人微信,违反用户协议,封号风险高

💡 建议:优先选择官方渠道(QQ 机器人开放平台、企业微信 / 公众号);个人号非官方方案仅供个人学习研究,请勿用于商业营销或骚扰用途。

9.4 消息桥接核心逻辑

无论 QQ 还是微信,桥接服务的思路一致:收到消息 → 调用本地 LLM → 把回复发回对应会话。以 OneBot v11(NapCat 消息上报)为例:

# qq_bridge.py —— 消息桥接示意代码(OneBot v11)
import requests

LLM_URL    = "http://127.0.0.1:8888/v1/chat/completions"   # 本机 LLM 服务
ONEBOT_URL = "http://127.0.0.1:3000"                       # NapCat HTTP 接口
MODEL      = "qwen3-8b-qnn2.36-w4a16-qcs8550"

# 代聊人设:可按你的聊天风格调整
SYSTEM_PROMPT = "你是我的聊天分身,请用轻松、简短、口语化的语气代我回复消息。"

def ask_llm(text: str) -> str:
    resp = requests.post(LLM_URL, json={
        "model": MODEL,
        "messages": [
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user",   "content": text + " /no_think"},  # 关闭思考,降低延迟
        ],
        "stream": False,
    }, timeout=120)
    return resp.json()["choices"][0]["message"]["content"].strip()

def on_message(event: dict):
    """处理 OneBot 上报的消息事件"""
    if event.get("post_type") != "message":
        return
    text = event.get("raw_message", "").strip()
    if not text:
        return

    answer = ask_llm(text)

    if event.get("message_type") == "private":          # 私聊:直接回复
        requests.post(f"{ONEBOT_URL}/send_private_msg",
                      json={"user_id": event["user_id"], "message": answer})
    elif event.get("message_type") == "group":          # 群聊:仅被 @ 时回复
        if f"[CQ:at,qq={event['self_id']}]" in text:
            requests.post(f"{ONEBOT_URL}/send_group_msg",
                          json={"group_id": event["group_id"], "message": answer})

微信端(企业微信回调或 Wechaty)思路完全相同:收到消息 → 调用 ask_llm() → 将返回文本发回会话。

9.5 关键设计点

设计点建议
降低延迟代聊场景建议加 /no_think;实测简单问题约 2~3s 出结果
上下文管理模型上下文 4096 tokens,建议只保留最近 N 轮(如 6~10 轮)拼接发送
触发规则私聊可全量回复;群聊建议"仅 @ 机器人 / 命中关键词"才回复,避免刷屏
人设与风格通过 system prompt 定义语气、口头禅;可按联系人切换多套人设
消息队列服务端 svr_slot_num=1 串行推理,高并发时建议加队列 + 节流限速
安全兜底联系人白名单、敏感词过滤、超时兜底回复(如"稍后回复你")

9.6 风险与合规提示

  • ⚠️ 使用非官方协议(个人 QQ / 微信自动化)可能违反平台服务条款,存在封号风险,请自行评估;
  • 优先使用官方开放能力:QQ 机器人开放平台、企业微信、微信公众号;
  • "代聊"应遵守基本社交礼仪与法律法规,禁止用于诈骗、营销骚扰等场景;
  • 聊天记录建议仅本地存储,注意个人信息保护。

附:一键部署脚本

#!/bin/bash
# deploy_qwen3_8b.sh - Qwen3-8B (QCS8550) 一键部署脚本
set -e

echo "[1/4] 更新软件源并安装 AidGenSE 依赖..."
sudo aid-pkg update
sudo aid-pkg -i aidgense
sudo aid-pkg -i aidgen-sdk
sudo aid-pkg -i aidgen-qnn236

echo "[2/4] 下载模型(已下载会自动跳过)..."
if aidllm list api | grep -q "qwen3-8b-qnn2.36-w4a16-qcs8550"; then
    echo "模型已存在,跳过下载。"
else
    aidllm pull api qwen3-8b-qnn2.36-w4a16-qcs8550
fi

echo "[3/4] 启动 HTTP 服务..."
aidllm stop api 2>/dev/null || true
aidllm start api -m qwen3-8b-qnn2.36-w4a16-qcs8550

echo "[4/4] 等待服务就绪并验证..."
for i in $(seq 1 15); do
    if curl -s http://127.0.0.1:8888/health | grep -q '"status": "ok"'; then
        echo "服务已就绪: http://127.0.0.1:8888"
        curl -s http://127.0.0.1:8888/v1/models
        exit 0
    fi
    sleep 2
done

echo "服务启动超时,请使用 'aidllm status api' 检查状态"
exit 1

文档实测日期:2026-09-20 | 环境:QCS8550 + Ubuntu 22.04 + AidGenSE v3.3.1

...全文
24 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

7,697

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、IoT、PC 、XR、Auto等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
物联网人工智能开源 企业社区 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧