本地部署

K3588S开发板用rkllama部署7B大模型实战教程

📑 目录

适用平台:ROC-RK3588S-PC 开发板(8GB 内存)
操作系统:Ubuntu 22.04 LTS (内核 6.1.118)
核心框架:rkllama (GitHub: NotPunchnox/rkllama)
模型:Qwen2.5-Coder-7B-Instruct (W8A8) 或 DeepSeek-R1-Distill-Qwen-7B (微调版)
应用场景:BTC 每日自动化分析 + 飞书推送

本指南特色:所有步骤均经过实际调试验证,特别收录了在 8GB 内存极限下让 7B 模型稳定运行的消息清洗性能优化核心技巧,以及避免定时任务失败的环境变量配置

一、基础环境准备

1.1 系统优化(释放内存)

Ubuntu 桌面版会占用约 1-1.5GB 内存,建议关闭图形界面,腾出资源给模型推理。

# 设置为多用户模式(命令行)
sudo systemctl set-default multi-user.target

# 停止并禁用显示管理器(根据实际情况选择 lightdm / gdm3 / sddm)
sudo systemctl stop lightdm && sudo systemctl disable lightdm

# 移除 Snap 软件包(若存在)
sudo apt autoremove --purge snapd -y
sudo rm -rf ~/snap /snap /var/snap /var/lib/snapd

1.2 创建 SWAP(8GB ZRAM)

8GB 物理内存运行 W8A8 量化的 7B 模型必须借助 SWAP 扩展可用内存。ZRAM 在内存中创建压缩的交换空间,速度快且不受文件系统限制。

# 加载 zram 模块
sudo modprobe zram

# 设置压缩算法为 lzo(兼容性最好)
echo lzo | sudo tee /sys/block/zram0/comp_algorithm

# 设置大小为 8GB
echo 8G | sudo tee /sys/block/zram0/disksize

# 格式化为 swap 并启用
sudo mkswap /dev/zram0
sudo swapon /dev/zram0

# 验证(Swap 行应显示 8.0Gi)
free -h

设置开机自启:

sudo tee /etc/systemd/system/zram-swap.service > /dev/null <<'EOF'
[Unit]
Description=ZRAM Swap
Before=swap.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c 'modprobe zram && echo lzo > /sys/block/zram0/comp_algorithm && echo 8G > /sys/block/zram0/disksize && mkswap /dev/zram0 && swapon /dev/zram0'
ExecStop=/bin/sh -c 'swapoff /dev/zram0 && echo 1 > /sys/block/zram0/reset'
TimeoutSec=60

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable zram-swap.service

1.3 调整系统 swappiness

降低 swappiness 值,让系统优先使用物理内存,避免推理性能因频繁交换而下降。

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
cat /proc/sys/vm/swappiness   # 应返回 10

二、NPU 驱动检查与 rkllama 部署

2.1 验证 NPU 驱动

# 查看驱动加载日志
dmesg | grep -i rknpu

# 查看驱动版本
sudo cat /sys/kernel/debug/rknpu/version
# 期望输出:RKNPU driver: v0.9.8

2.2 安装 rkllama(源码方式)

cd ~
git clone https://github.com/NotPunchnox/rkllama.git
cd rkllama

# 安装 Python 3.10 及虚拟环境支持
sudo apt install python3.10 python3.10-venv python3.10-dev -y

# 创建虚拟环境
python3.10 -m venv venv
source venv/bin/activate

# 修复 pyproject.toml 中的 license 字段(避免安装报错)
sed -i 's/license = "GPL-3.0"/license = {text = "GPL-3.0"}/' pyproject.toml
sed -i '/^license-files\s*=/s/^/# /' pyproject.toml

# 使用国内镜像安装
pip install -e . -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

2.3 修改默认上下文长度

rkllama 代码中硬编码了 default_num_ctx = 4096,需要修改以允许更大的上下文窗口。

cd ~/rkllama/src/rkllama/config
nano config_schema.py
# 找到这行:
# model.string("default_num_ctx", 4096, "...")
# 改为:
# model.string("default_num_ctx", 8192, "...")
# (8GB 内存建议先设 8192,若稳定可升至 16384)

2.4 放置模型文件并创建 Modelfile

mkdir -p ~/rkllama/models/Qwen2.5-Coder-7B-Instruct
# 将 .rkllm 文件放入该目录
cp your_model.rkllm ~/rkllama/models/Qwen2.5-Coder-7B-Instruct/

cd ~/rkllama/models/Qwen2.5-Coder-7B-Instruct
cat > Modelfile << 'EOF'
FROM="./Qwen2.5-Coder-7B-Instruct_W8A8_RK3588.rkllm"
HUGGINGFACE_PATH="Qwen/Qwen2.5-7B-Instruct"
EOF

2.5 创建 systemd 服务(开机自启)

sudo tee /etc/systemd/system/rkllama.service > /dev/null << 'EOF'
[Unit]
Description=RKLLama LLM Server
After=network.target

[Service]
Type=simple
User=firefly
WorkingDirectory=/home/firefly/rkllama
Environment="PYTHONPATH=/home/firefly/rkllama/src"
Environment="RKLLAMA_MODEL_DIR=/home/firefly/rkllama/models"
Environment="RKLLAMA_LOG_LEVEL=INFO"
ExecStart=/home/firefly/rkllama/venv/bin/python -m rkllama.server.server --models /home/firefly/rkllama/models
Restart=on-failure
RestartSec=10
MemoryMax=7G

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now rkllama.service

三、关键步骤:消息清洗与性能优化

这是整个部署中最关键的一步!OpenClaw 发送的消息体量极大(8000+ tokens),包含大量心跳包和元数据,直接导致推理超时、OOM 和回复质量下降。以下“一条消息”清洗策略将 Token 数量从 8000+ 降至 200-500,效果立竿见影。

3.1 核心修改:只改 server.py 的 chat_ollama 函数

定位到 ~/rkllama/src/rkllama/server/server.py(约第 1250 行附近),在调用 ChatEndpointHandler.handle_request 之前插入以下代码:

# ===== 强制消息清洗(保留 tools 传递) =====
cleaned_messages = []
for msg in reversed(messages):
    if msg.get('role') == 'user':
        content = msg.get('content', '')
        # 1. 列表格式转字符串(OpenClaw 可能发送 [{"type":"text","text":"..."}] 格式)
        if isinstance(content, list):
            text_parts = []
            for part in content:
                if isinstance(part, dict) and part.get('type') == 'text':
                    text_parts.append(part.get('text', ''))
                elif isinstance(part, str):
                    text_parts.append(part)
            content = ' '.join(text_parts)
        else:
            content = str(content)
        # 2. 去掉 OpenClaw 的用户 ID 前缀,只保留实际文本
        match = re.search(r'ou_[a-z0-9]+:\\s*(.+)', content)
        if match:
            content = match.group(1).strip()
        # 3. 过滤无意义的系统摘要/启动消息/心跳探测
        if content and not any(kw in content for kw in [
            'Preserve important context',
            'context summarization',
            'The messages above are',
            'Bootstrap pending',
            'Please read BOOTSTRAP'
        ]):
            cleaned_messages.append({'role': 'user', 'content': content})
        break   # 只取最近一条用户消息!
# 4. 兜底:如果清洗后为空,发送默认消息
if not cleaned_messages:
    cleaned_messages = [{'role': 'user', 'content': 'Hello'}]
messages = cleaned_messages
system = ""
tools = data.get('tools', None)  # 保留 tools 参数,不强制设为 None
# ===== 清洗结束 =====

3.2 辅助修改:server_utils.py 保留 tools 传递

cd ~/rkllama/src/rkllama/api
nano server_utils.py
# 在 prepare_prompt 函数中,将 tools=None 改为 tools=tools

3.3 修改后重启并验证

sudo systemctl restart rkllama.service
sudo journalctl -u rkllama.service -f   # 观察启动日志,确认无报错

四、OpenClaw 部署与飞书对接

4.1 安装 OpenClaw

# 安装 Node.js 22
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt update && sudo apt install nodejs -y

# 配置 npm 国内镜像
npm config set registry https://registry.npmmirror.com

# 全局安装 OpenClaw
npm install -g openclaw@latest

# 初始化(一路回车)
openclaw onboard --install-daemon

4.2 配置模型提供者

编辑 ~/.openclaw/openclaw.json

{
  "models": {
    "providers": {
      "local-rkllama": {
        "baseUrl": "http://127.0.0.1:8080/v1",
        "apiKey": "not-needed",
        "api": "openai-completions",
        "timeoutSeconds": 600,
        "models": [{
          "id": "Qwen2.5-Coder-7B-Instruct",
          "name": "Qwen Coder 7B",
          "contextWindow": 8192,
          "maxTokens": 512,
          "input": ["text"],
          "compat": { "requiresStringContent": true }
        }]
      }
    }
  },
  "agents": {
    "defaults": {
      "model": { "primary": "local-rkllama/Qwen2.5-Coder-7B-Instruct" },
      "contextPruning": { "mode": "cache-ttl", "ttl": "3m" },
      "compaction": { "reserveTokensFloor": 2048 }
    }
  }
}

4.3 飞书长连接配置

{
  "channels": {
    "feishu": {
      "enabled": true,
      "appId": "cli_xxxxxxxx",
      "appSecret": "xxxxxxxx",
      "connectionMode": "websocket",
      "dmPolicy": "pairing",
      "groupPolicy": "open",
      "requireMention": true
    }
  }
}

在飞书开放平台完成应用的发布,并确保订阅了 im.message.receive_v1 事件。

五、BTC 自动分析脚本

使用 Python 脚本直接调用 rkllama API,整合多维度数据(Gate.io K线、恐慌指数、彩虹图、BlockBeats Pro ETF/DXY/美债/重要快讯),并通过飞书 Webhook 推送。

5.1 脚本核心结构

  • 数据获取:Gate.io (K线计算技术指标)、alternative.me (恐慌指数)、blockchain.info (彩虹图)、BlockBeats Pro API (ETF、DXY、美债收益率、重要快讯)
  • 模型调用:使用精炼的“提问式”Prompt,引导 7B 模型进行深度分析
  • 飞书推送:通过自定义机器人 Webhook 发送结构化报告

5.2 关键配置(脚本顶部)

FEISHU_WEBHOOK = "https://open.feishu.cn/open-apis/bot/v2/hook/你的token"
RKLLAMA_URL = "http://127.0.0.1:8080/v1/chat/completions"
MODEL_NAME = "deepseek-r1-btc-7b"  # 或 "Qwen2.5-Coder-7B-Instruct"
BLOCKBEATS_API_KEY = "bbp_你的API_KEY"

5.3 Prompt 设计要点

为了让 7B 模型生成更有深度的分析,我们采用了“提问式”Prompt,要求模型回答六个问题,从而引导其进行多维度交叉推理:

1. 当前市场最核心的矛盾是什么?
2. 技术面和资金面是否支持当前的价格走势?
3. 新闻事件中,哪个对短期走势影响最大?为什么?
4. 给出两个关键价位(支撑和阻力),并说明理由。
5. 基于以上分析,给出两种情景推演(看涨/看跌)。
6. 针对稳健型和激进型投资者,分别给出具体的操作建议。

六、定时任务(Crontab)

避坑要点:必须显式设置环境变量,并每次执行前清理模型缓存,否则定时任务极易失败。

crontab -e
# 添加以下一行(每天早 8:00 执行):
PATH=/home/firefly/venv/bin:/usr/bin:/bin
0 8 * * * rm -rf /home/firefly/rkllama/models/deepseek-r1-btc-7b/cache && /usr/bin/python3 /home/firefly/btc_advanced_agent/advanced_analysis.py >> /home/firefly/btc_advanced_agent/cron.log 2>&1

七、关键问题排查记录

问题原因解决方法
Worker 被 OOM Kill8GB 内存 + W8A8 7B 模型超出物理内存添加 8GB ZRAM;在 server.py 中实施消息清洗;降低 num_ctx 至 8192
模型推理超时(300s+)OpenClaw 发送的完整对话历史导致 Token 爆炸在 server.py 中只保留最后一条用户消息,Token 从 8000+ 降至 200-500
飞书收到 500 错误tools 参数格式问题 / 消息 content 为列表格式在 server.py 中添加列表→字符串转换;保留 tools 传递
模型编造不存在的工具调用7B W8A8 低内存下指令遵循能力下降改用独立 Python 脚本直接调用 rkllama API,绕开 Agent 工具调用
定时任务返回结果格式错误Crontab 环境变量缺失,模型缓存未清理在 Crontab 中显式设置 PATH,并每次执行前删除缓存目录
API 数据获取失败(定时任务)Crontab 环境中缺少代理或环境变量在 Crontab 中设置 http_proxy/https_proxy,或在脚本内使用绝对路径

八、总结

本教程完整记录了在 ROC-RK3588S-PC(8GB 内存)开发板上,从零开始部署 7B 大模型,并通过 OpenClaw 对接飞书,最终实现 BTC 每日自动分析推送的全过程。调试过程中的核心经验是:

  • W8A8 量化的 7B 模型在 8GB 设备上必须借助 ZRAM SWAP 和消息清洗才能稳定。
  • 最重要的优化是——在 server.py 中实施“一条消息”策略,将 Token 量从 8000+ 削减至 200-500,这是解决 OOM 和推理超时的关键转折点。
  • 工具调用在低内存场景下不够稳定,推荐使用独立 Python 脚本直接调用 rkllama API,配合 Crontab 实现自动化任务。
  • 飞书推送优先使用自定义关键词方式,比签名校验更容易调试。
  • 定时任务务必显式设置环境变量,并定期清理模型缓存。

现在,你拥有了一套完全本地化、自主可控的“AI + 自动化”系统,后续可轻松扩展为更多数据分析和监控任务。

文章作者: luanpacom

文章链接: http://www.luanpa.com/2026/08/k3588s-rkllama-deepseek-r1-distill-qwen-7b/

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源。

luanpacom