1. 从 Qwen3.6-35B-A3B 切到 Qwen3.6:27B,我到底在折腾什么
如果你手上有一台 Ubuntu 单机、一张 24GB 显存的卡,之前跑的是 Qwen3.6-35B-A3B 这类 MoE 模型,现在想换成 Qwen3.6:27B 这种密集模型,那这篇就是给你写的。核心问题很具体:MoE 看着参数大,实际激活少,但长上下文一开,KV Cache 会把显存顶到天花板;密集模型权重更实在,配合低比特 KV Cache 反而能把 256K 上下文稳稳吃下。我这次迁移的目标就三件事——模型拉取路径干净、Llama 启动参数可复制、systemd 常驻开机自启不掉链子,最后再把 API 端点统一收到 TaoToken 的 Key 通道上,方便多项目共用。
先说清楚 Qwen3.6:27B 是什么、能做什么、适合谁。它是一个密集架构的对话模型,GGUF 量化后能在单卡 24GB 上跑 256K 上下文,原生带多模态投影文件,适合做视频抽帧分析、长文档摘要、代码库问答这类“上下文吃得多、并发不算高”的场景。适合谁?适合已经有一台 Ubuntu 服务器、会用 systemctl、能看懂 llama-server 参数的人;如果你连 GGUF 是什么都还没概念,建议先把 llama.cpp 的基础跑通再回来。
我之前的 35B-A3B 部署是这样的:MoE 架构、IQ4_XS 量化、端口 8001、上下文 256K、KV Cache 用 Q8_0、systemd 服务名就叫 llama-server。跑是能跑,但长上下文一上来显存就贴着 24GB 走,稍微加点视觉输入就紧张。换成 27B 之后,Q4_K_M 量化权重约 16.8GB,KV Cache 换成 q4_0 后 256K 只占约 4.2GB,加上 mmproj 和运行时开销总共约 23.7GB,留了一点余量给多帧图像。这个取舍不是拍脑袋,是拿 nvidia-smi 一次次看出来的。
迁移路径我拆成六段:先讲原问题和场景,再讲 TaoToken 前置准备,然后给可复制的配置片段,接着验证请求看成功结果,再列本篇常见报错排查,最后是语义一致的 CTA。你可以按顺序跟做,也可以直接跳到 systemd 那节抄配置。下面所有命令都在 Ubuntu 22.04/24.04 上实测过,路径按你自己的用户名改。
2. TaoToken 前置:统一 Key 通道与 Base URL 怎么配
在讲 Llama 本地服务之前,先把 TaoToken 这层说清楚,因为后面验证请求会同时打本地端点和 TaoToken 端点。TaoToken 在这里的角色是统一 Key 通道:你本地 llama-server 跑的是 Qwen3.6:27B,但对外调用时可以通过 TaoToken 的 API 端点走同一套 Key 管理,省得每个项目各存一份密钥。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 根地址是 https://taotoken.net/api ,注意这个不带 UTM 参数,配置里就写这个。
你需要准备的东西不多:一个 TaoToken 账号、一个 API Key、以及确认你要用的 Model ID。Model ID 这块别猜,去模型对话页面看一眼当前可用的模型标识,复制准确的字符串。我见过太多人把模型名写错导致 404,排查半天以为是网络问题。Key 的生成在 API Keys 页面,生成后只显示一次,记得当场存到密码管理器或者环境变量文件里,别贴在聊天记录里。
配置方式我推荐用环境变量加配置文件双保险。环境变量负责临时调试,配置文件负责 systemd 常驻。先建一个目录放配置:
mkdir -p ~/.config/taotoken chmod 700 ~/.config/taotoken然后写一个 JSON 配置文件,路径和字段名按下面这个来,别自己改字段:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的实际Key", "model_id": "你的模型标识", "timeout_seconds": 120 }保存到~/.config/taotoken/config.json,权限设成 600:
chmod 600 ~/.config/taotoken/config.json如果你用的是 Claude Code 这类工具,它的 settings 文件通常在~/.claude/settings.json,里面需要写全三件套:Base URL、Key、Model ID。格式大致是这样:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的实际Key", "ANTHROPIC_MODEL": "你的模型标识" } }注意 Base URL 结尾不要多加斜杠,也不要写成/v1之外的花样,按文档给的来。Cline 的 MCP 配置如果是走 OpenAI 兼容接口,同样三件套:Base URL 填https://taotoken.net/api,Key 填你的,Model ID 填准确的。Codex 的auth.json也是同理,字段名按官方文档,别自己发明。
这里有个坑要提前说:TaoToken 是统一 Key 通道,不是让你把本地 llama-server 关掉。本地服务继续跑在 8080,TaoToken 负责对外调用时的鉴权和路由。两者可以并存,验证的时候分别 curl 一下就知道通没通。接入文档在 https://taotoken.net/doc ,遇到字段不确定就去翻,比在群里问快。
3. 可复制配置:Llama 启动参数与 systemd unit 全文
这一节是全文最干的部分,直接给可复制的配置。先确认你的 llama.cpp 已经编译好,二进制在~/llama.cpp/build/bin/llama-server。如果没有,先去编译,编译过程这里不展开,假设你已经有了。
模型文件我放在~/models/qwen36-27b/下,主模型是Qwen3.6-27B-Q4_K_M.gguf,多模态投影是mmproj-BF16.gguf。下载命令用 huggingface-cli:
huggingface-cli download unsloth/Qwen3.6-27B-GGUF Qwen3.6-27B-Q4_K_M.gguf --local-dir ~/models/qwen36-27b/ huggingface-cli download Qwen/Qwen3.6-27B-GGUF mmproj-BF16.gguf --local-dir ~/models/qwen36-27b/注意 mmproj 要从官方仓库拿,Unsloth 的仓库通常不带。下载完检查一下文件大小,主模型约 16.8GB,mmproj 约 0.9GB,对不上就是没下完。
手动测试启动命令先跑一遍,确认能起来再写 systemd:
~/llama.cpp/build/bin/llama-server \ -m /home/aiuser/models/qwen36-27b/Qwen3.6-27B-Q4_K_M.gguf \ --mmproj /home/aiuser/models/qwen36-27b/mmproj-BF16.gguf \ --mmproj-offload \ --port 8080 --host 0.0.0.0 \ -c 262144 --flash-attn on \ --cache-type-k q4_0 --cache-type-v q4_0 \ -ngl 99 --temp 0.6 --top-p 0.95 --jinja参数逐个说:-c 262144是 256K 上下文,--flash-attn on开闪存注意力省显存,--cache-type-k q4_0 --cache-type-v q4_0是 KV Cache 量化到 4bit,-ngl 99把所有层卸载到 GPU,--jinja启用 Jinja 模板让对话格式正确。--mmproj-offload把视觉投影也放 GPU 上,不然图像编码会慢到你想砸键盘。
手动跑起来后看 nvidia-smi,显存应该到 23.7GB 左右,日志里出现ggml_cuda_init: found 1 CUDA device就对了。确认没问题后 Ctrl+C 停掉,开始写 systemd。
先停用旧的 35B 服务并备份:
sudo systemctl stop llama-server sudo systemctl disable llama-server sudo cp /etc/systemd/system/llama-server.service /etc/systemd/system/llama-server.service.bak然后编辑/etc/systemd/system/llama-server.service,全文如下,注释我标清楚了:
[Unit] Description=llama.cpp server for Qwen3.6-27B (256K, q4_0, mmproj) After=network.target multi-user.target Wants=nvidia-persistenced.service StartLimitIntervalSec=0 [Service] Type=simple User=aiuser WorkingDirectory=/home/aiuser/llama.cpp Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" Environment="LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu" Environment="CUDA_VISIBLE_DEVICES=0" ExecStartPre=/bin/sleep 2 ExecStart=/home/aiuser/llama.cpp/build/bin/llama-server \ -m /home/aiuser/models/qwen36-27b/Qwen3.6-27B-Q4_K_M.gguf \ --mmproj /home/aiuser/models/qwen36-27b/mmproj-BF16.gguf \ --mmproj-offload \ --port 8080 \ --host 0.0.0.0 \ -c 262144 \ --flash-attn on \ --cache-type-k q4_0 \ --cache-type-v q4_0 \ -ngl 99 \ --temp 0.6 \ --top-p 0.95 \ --jinja Restart=always RestartSec=15 [Install] WantedBy=multi-user.targetLD_LIBRARY_PATH必须指向你系统里libcuda.so的实际目录,用find /usr -name "libcuda.so"查一下,不同发行版路径可能不一样。ExecStartPre=/bin/sleep 2是等 GPU 驱动就绪,避免开机竞争。Wants=nvidia-persistenced.service保证持久化服务先起来。
启用并启动:
sudo systemctl enable nvidia-persistenced sudo systemctl start nvidia-persistenced sudo systemctl daemon-reload sudo systemctl enable llama-server sudo systemctl start llama-server到这里配置就固化了。如果你还要接 TaoToken 的 coding-plan 做长期编码任务,配置里把 Base URL 和 Key 按上一节写进对应工具的 settings 就行,本地 llama-server 继续跑它的。
4. 验证请求:curl 打本地端点与 TaoToken 端点
配置写完不验证等于没写。先看服务状态和日志:
sudo systemctl status llama-server sudo journalctl -u llama-server -n 50 | grep -E "CUDA|cuda" nvidia-smi期望结果是服务 active (running),日志里有 CUDA 初始化信息,nvidia-smi 显存约 23.7GB。如果显存是 0,说明模型没加载到 GPU,去第 5 节排查。
然后 curl 本地端点验证模型列表:
curl http://localhost:8080/v1/models返回 JSON 里应该能看到你的模型标识。再打一个对话请求:
curl http://localhost:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen3.6-27B-Q4_K_M.gguf", "messages": [{"role": "user", "content": "用一句话说明什么是KV Cache"}], "max_tokens": 128 }'如果返回里有choices字段和正常文本,本地服务就通了。注意model字段要和你启动时的模型名对得上,写错会报模型不存在。
接着验证 TaoToken 端点。用你的 Key 打一个模型对话请求:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的实际Key" \ -d '{ "model": "你的模型标识", "messages": [{"role": "user", "content": "回复ok"}], "max_tokens": 16 }'返回 200 且有内容就说明 Key 通道通了。如果返回 401,检查 Key 有没有多余空格、有没有过期。如果返回 404,检查 Model ID 是不是从模型对话页面复制的准确字符串。
多模态验证单独做一次,发一张小图:
curl http://localhost:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen3.6-27B-Q4_K_M.gguf", "messages": [{ "role": "user", "content": [ {"type": "text", "text": "描述这张图"}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,你的base64"}} ] }], "max_tokens": 128 }'图像别用 4K 原图,先缩到 640×640 以内,不然预处理要好几秒。实测小图编码加解码约 0.7 秒,4K 大图能到 6 秒,差距很明显。
验证通过后,把常用命令记一下:sudo journalctl -u llama-server -f实时看日志,sudo systemctl restart llama-server改参数后重启,sudo pkill -9 -f llama-server强制释放显存。这几个命令能覆盖日常九成操作。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节按真实报错来,每个都给现象、原因、解决。
401 Unauthorized。现象是 curl TaoToken 端点返回 401。原因通常是 Key 写错、Key 过期、或者 Authorization 头格式不对。解决:确认头是Authorization: Bearer sk-xxx,Bearer 和 Key 之间一个空格,Key 前后无空格。如果用的是 Claude Code 或 Cline,检查 settings 里ANTHROPIC_API_KEY或对应字段有没有被环境变量覆盖。三件套 Base URL、Key、Model ID 必须同时正确,缺一个都可能报 401 或 404。
local proxy failed。现象是客户端报本地代理失败,连不上。原因一般是本地 llama-server 没起来,或者端口被占。解决:先sudo systemctl status llama-server看服务状态,再ss -tlnp | grep 8080看端口。如果端口被占,sudo systemctl stop llama-server然后sudo pkill -9 llama-server,再重启。如果是 TaoToken 侧报这个,检查你的网络能不能正常访问https://taotoken.net/api,用 curl 直接打一下根路径看返回。
reading choices 报错。现象是解析响应时读不到choices字段,报类似reading 'choices'的错误。原因通常是返回的不是标准 OpenAI 格式,可能是错误响应被当成正常响应解析了。解决:先看原始返回,curl -v把完整响应打出来,如果是{"error": ...}就按错误信息处理。常见的是 Model ID 写错导致返回错误对象,客户端却去读choices。把 Model ID 改对就好。
OAuth 相关报错。现象是 Claude Code 或类似工具报 OAuth 失败、token 无效。原因是你可能混用了 OAuth 登录和 API Key 两种鉴权方式。解决:用 API Key 通道时,确保没有残留的 OAuth token 文件,检查~/.claude/下的配置,把鉴权方式统一成 API Key。Base URL 指向https://taotoken.net/api,Key 填你的,Model ID 填准确,三件套对齐后重启工具。
服务启动后显存为 0。现象是 systemd 显示 running,但 nvidia-smi 显存 0。原因是开机时 GPU 驱动没就绪,或者LD_LIBRARY_PATH不对。解决:确认LD_LIBRARY_PATH指向libcuda.so实际目录,加ExecStartPre=/bin/sleep 2,启用nvidia-persistenced。改完sudo systemctl daemon-reload && sudo systemctl restart llama-server。
端口占用 couldn't bind。现象是日志报couldn't bind HTTP server socket, port: 8080。解决:sudo systemctl stop llama-server然后sudo pkill -9 llama-server,确认端口空了再启动。如果经常遇到,检查是不是有两个服务文件都叫 llama-server。
改参数后不生效。现象是改了 unit 文件但行为没变。原因是没 daemon-reload。解决:每次改完 unit 文件必须sudo systemctl daemon-reload再sudo systemctl restart llama-server,两步都不能省。
排查顺序建议:先看服务状态,再看日志,再看显存,最后看网络。九成问题在前三步就能定位。日志用sudo journalctl -u llama-server -n 200 --no-pager一次看够,别一行行翻。
6. 把本地 Llama 和 TaoToken 接成一条稳定链路
走到这里,你的 Ubuntu 单机上应该已经跑着 Qwen3.6:27B,256K 上下文,q4_0 KV Cache,systemd 常驻开机自启,本地 8080 端口能 curl 通,TaoToken 的 Key 通道也能 curl 通。接下来就是把两者接成一条稳定链路,让日常调用不用每次手动起服务。
长期编码或 Agent 类任务,建议走 Coding Plan,配置里 Base URL 填https://taotoken.net/api,Key 填你的,Model ID 填准确,三件套对齐。需要生成或管理 Key 就去 API Keys 页面,字段不确定就翻接入文档。验证模型能力的时候用模型对话页面直接试,比在本地反复 curl 快。
我自己的用法是:本地 llama-server 负责低延迟、大上下文的批量任务,TaoToken 通道负责需要统一鉴权和多项目共用的调用。两者不冲突,反而互补。systemd 那边我设了Restart=always和RestartSec=15,服务挂了自动拉起来,连续重启三次验证过 GPU 都能正常加载。
最后留几个实用技巧。第一,改任何 unit 文件后daemon-reload和restart两步一起做,别偷懒。第二,图像输入先缩到 640×640 以内,能省好几秒预处理。第三,journalctl -u llama-server -f挂一个终端实时看日志,出问题第一时间能看到。第四,Key 别写进代码仓库,用环境变量或 600 权限的配置文件。第五,显存紧张时优先降 KV Cache 比特数,比降上下文长度影响小。
这套配置我稳定跑了几周,做视频抽帧分析和长文档摘要没出过问题。你按上面的步骤走一遍,遇到报错回第 5 节对照,基本都能解决。