Qwen3.8-27B 的 KV 量化矩阵,让 Codex 跑 nvidia-smi 复查:Key 走 TaoToken
2026/9/18 14:13:32 网站建设 项目流程

Qwen3.8-27B 在 256K 上下文下,Q8 权重加 KV q8_0 的显存余量只剩约 7.8G。这个数字不是“还能跑”的安慰,而是长输出、双并发、远距 recall 一拥而上时最容易踩穿的边界。想验证它,不能只截一张 nvidia-smi 图;更靠谱的做法是让 Codex 当复核员,帮你生成 NIAH 脚本、采集双卡显存、对照 2×2 矩阵。TaoToken 在这里只承担一件事:给 Codex 一条模型通道。Key 从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建,Base URL 填 https://taotoken.net/api,本地量化和 Ollama 推理仍按原文逻辑走。

1. 256K 下那 7.8G 余量:Qwen3.8-27B 的 OOM 边界到底窄在哪

1.1 Q8+KVq8 不是安全牌,只是还没跑到长输出

原文里最值得盯住的数字,是 Qwen3.8-27B 在 256K 上下文、Q8 权重、KV q8_0 时只剩约 7.8G 显存余量。很多人看到“还剩 7.8G”会默认安全,但这是静态加载后的余量。模型一旦开始生成,KV cache 会随着 token 增长继续占用;如果同时来两个长上下文请求,每个请求都按 256K 预留或增长,余量会被拆得很快。

更麻烦的是,Ollama 的显存分配和 CUDA 缓存并不总是线性。你会遇到一种情况:单请求 256K 能跑,NIAH 也能勉强答对,但一开长输出,或者两个 128K 并发,nvidia-smi 里的 free 就从 7.8G 掉到 2G 以下,随后直接 OOM。所以原文的 2×2 矩阵不是四组跑分,而是四种不同的失败模式。

1.2 2×2 矩阵要复现的四个组合

这一轮复核的目标很明确:把权重和 KV 量化拆开,不要混在一起看。

组合权重KV cache主要观察
Aq4_K_Mq4_0最省显存,recall 是否掉点
Bq4_K_Mq8_0省权重、保 KV 精度,长输出余量
Cq8_0q4_0保权重、压 KV,256K 是否更稳
Dq8_0q8_0原文参考:余量约 7.8G,OOM 风险最高

这里的重点是复查,不是背结论。你机器上的卡型、驱动、Ollama 版本、是否开启 Flash Attention,都会改变显存曲线。Codex 的价值在于把脚本、表格、报错解释串起来;真正执行 nvidia-smi 和 Ollama 的,仍然是你本地终端。

2. 让 Codex 做复核员:Key 走 TaoToken,Base URL 填 https://taotoken.net/api

2.1 打开官网创建 Key,并确认模型 ID

先打开 TaoToken 注册并创建 API Key。Key 只用来让 Codex 对话通道能调模型,不参与 Ollama 本地推理。创建完成后,把 Key 放进环境变量,不要硬编码进脚本:

export TAOTOKEN_API_KEY=YOUR_API_KEY

模型 ID 不要凭记忆写。打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 的模型广场,看当时列表里可用的 ID,再填到 Codex 配置里。本文里统一写成YOUR_MODEL_ID,你按模型广场替换。

2.2 ~/.codex/config.toml 里加一条自定义 provider

Codex 的配置文件通常在~/.codex/config.toml。不要把它和 Claude Code 的 ANTHROPIC_* 环境变量混在一起,Codex 走的是自己的 provider 配置。最小可用结构像这样:

model = "YOUR_MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"

保存后回到终端,确认TAOTOKEN_API_KEY已经 export,再启动 Codex。Base URL 结尾不要加/v1,这里填的是https://taotoken.net/api。如果你把官网地址错填进base_url,Codex 会报 404 或 model not found;官网地址只用来注册、创建 Key、看模型广场和看用量。

2.3 给 Codex 的复核任务书:只生成命令,执行留在本机

Codex 不能直接替你连本地 Ollama 跑压测,也不应该替你在生产机器上执行命令。正确姿势是:让 Codex 生成脚本和命令,你在本地终端执行,再把输出贴回对话。例如可以这样发第一段任务:

我要复核 Qwen3.8-27B 在 256K 上下文下的 2×2 量化矩阵。 请帮我生成三样东西,不要执行: 1. 一个 nvidia-smi 双卡采样脚本,每秒记录 used/free,并输出双卡合计; 2. 一个 NIAH 压测脚本,调用本机 Ollama 的 /api/generate; 3. 一张 CSV 表头,字段包含权重量化、KV 量化、上下文长度、recall、耗时、加载后 free、长输出后 free。 脚本里模型名用环境变量 OLLAMA_MODEL,不要写死。

这样 Codex 产出的是可复核材料,而不是替你“远程执行”。你拿到脚本后,本地跑、本地看显存、本地复现 OOM,再把结果贴回去让它分析。

3. Ollama 侧把 KV 量化拆开:OLLAMA_KV_CACHE_TYPE 的四个组合

3.1 权重 q4_K_M 与 q8_0 的本地准备

权重量化按原文思路来,Ollama 侧通常是通过不同 tag 或 Modelfile 指定。下面命令里的qwen3.8:27b-q4_K_M只是示例位置,你要换成自己实际拉取的 tag:

ollama pull qwen3.8:27b-q4_K_M ollama pull qwen3.8:27b-q8_0 ollama list

拉完后不要急着跑 256K。先确认模型确实加载到双卡,并且 Ollama 版本支持你要用的 KV cache 类型。OLLAMA_KV_CACHE_TYPE控制的是 KV cache 的量化类型,常见值是q4_0q8_0;旧版本 Ollama 可能不识别q4_0,先看版本再动手。

3.2 256K 上下文的 Modelfile 与启动命令

Ollama 的num_ctx是上下文长度,256K 大约写 262144。KV 量化类型要在ollama serve启动时通过环境变量指定,不是ollama run里临时 export 就能生效。先停掉旧服务,再带变量启动:

pkill ollama OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q4_0 ollama serve

另开一个终端,用 Modelfile 固定上下文和 GPU 层数:

FROM qwen3.8:27b-q4_K_M PARAMETER num_ctx 262144 PARAMETER num_gpu 99 PARAMETER num_thread 16
ollama create qwen38-27b-q4km-kvq4 -f Modelfile ollama run qwen38-27b-q4km-kvq4

要测 KV q8_0,就把OLLAMA_KV_CACHE_TYPE=q8_0重启一遍 serve,再建一个对应 Modelfile。四个组合要分别重启服务,不能只改 run 时参数,否则你看到的可能还是上一轮 KV 类型。

3.3 NIAH 与远距 recall 的轻量压测脚本

NIAH 不需要一上来就跑论文级规模。先让 Codex 生成一个最小脚本,覆盖 32K、64K、128K、196K、262K 五档长度,在 10%、50%、90% 深度插入一个 UUID 针,让模型只回答 UUID。提示词可以这样写:

请生成 Python 脚本 /tmp/niah_qwen38.py: - 调用本机 http://127.0.0.1:11434/api/generate; - 模型从环境变量 OLLAMA_MODEL 读取; - 上下文长度列表 [32768, 65536, 131072, 196608, 262144]; - 每个长度在 10%、50%、90% 位置插入 UUID; - prompt 要求模型只输出 UUID; - 记录 total_duration、prompt_eval_count、eval_count; - 输出 /tmp/niah_result.csv。 不要执行,先把代码给我。

你本地运行后,把 CSV 贴回 Codex。它帮你判断哪一档 recall 开始掉、哪一档耗时突然抬升。远距 recall 差,不一定是权重 q4_K_M 的锅,也可能是 KV q4_0 在 256K 下把远距离注意力压得太狠。

4. nvidia-smi 双卡余量复查:从单卡数字到并发 OOM

4.1 采样命令:让 Codex 生成,读者本地跑

原文里“双卡合计记显存”这一步,建议改成持续采样。单次 nvidia-smi 只能看到瞬间值,长输出和并发时很容易漏掉峰值。你可以让 Codex 生成一个简单循环:

while true; do nvidia-smi --query-gpu=index,memory.used,memory.free,utilization.gpu \ --format=csv,noheader,nounits sleep 1 done

双卡合计可以用 awk 快速算:

nvidia-smi --query-gpu=memory.used,memory.free \ --format=csv,noheader,nounits | \ awk -F',' '{u+=$1; f+=$2} END {printf "used=%.1f GiB free=%.1f GiB\n", u/1024, f/1024}'

把“模型加载后”“256K 首 token 后”“长输出 8K 后”“双并发 128K 后”四个时间点的 free 都记下来。只记一个总数,你无法判断是权重占走了,还是 KV 在长输出里继续膨胀。

4.2 2×2 矩阵显存与速度记录表

下面这张表可以直接让 Codex 生成 CSV 表头,你本地填。原文给出的 Q8+KVq8 约 7.8G 余量放在 D 组作参考,其他数字以你机器的实测为准,不要照抄别人的卡型。

组合权重KV加载后 free256K 首 token 后 free长输出 8K 后 freeNIAH 256K recall速度备注
Aq4_K_Mq4_0待填待填待填待填待填最省显存
Bq4_K_Mq8_0待填待填待填待填待填KV 精度更高
Cq8_0q4_0待填待填待填待填待填权重精度更高
Dq8_0q8_0原文参考约 7.8G待填待填待填待填长输出/并发易 OOM

速度不要只记 tok/s。把 prompt eval 速度和生成速度分开,长上下文下 prompt 处理时间可能远大于生成时间。你如果只记一个总耗时,会误以为 KV q4_0 一定更快;实际上 KV 量化主要影响显存,速度差异要看后端 kernel 和 Flash Attention 是否开启。

4.3 长输出和双并发下 7.8G 余量怎么被吃完

验证 7.8G 余量是否安全,至少做两个动作。第一,固定 256K 上下文,让模型连续输出 8K token,观察 free 是否持续下降。第二,开两个并发请求,每个 128K 上下文,同时问 NIAH。并发脚本也可以让 Codex 生成,你本地执行:

请生成 /tmp/concurrent_niah.py: - 用 ThreadPoolExecutor 发两个请求; - 每个请求上下文 131072; - 模型从 OLLAMA_MODEL 读取; - 请求间隔 0.5 秒; - 捕获 Ollama 返回的 error 字段; - 输出两个请求的耗时和是否 OOM。

如果 D 组单请求 256K 还有约 7.8G,但双并发 128K 直接 CUDA out of memory,那就说明余量不是按“总上下文”线性切的。Ollama 在并发时可能各自保留 KV 空间,加上 CUDA 缓存碎片,7.8G 很快见底。这时候优先降 KV 到 q4_0,再考虑降 num_ctx。

5. 错填、OOM 与 KV 类型不生效:这一轮最容易撞上的三类报错

5.1 Codex 侧 401、404 与 model not found

Codex 报 401,先看TAOTOKEN_API_KEY是否在当前终端 export,再看~/.codex/config.toml里的env_key是否写成同一个名字。报 404,最常见的是base_url写成了官网地址,或者多加了/v1。正确值只有一个:https://taotoken.net/api。报 model not found,回模型广场确认YOUR_MODEL_ID,不要自己加日期后缀。

5.2 Ollama 侧 KV cache type 不识别与显存碎片

Ollama 报 unknown KV cache type,通常是版本太旧,或者环境变量没有传给ollama serve。用ollama --version确认版本,重启服务后再跑ollama run。另一个坑是旧进程没被杀掉,你以为换了OLLAMA_KV_CACHE_TYPE,实际还是旧服务在响应。OOM 时不要只降num_ctx,可以先换 KV q4_0,再把并发降到 1,最后才动权重 tag。

5.3 NIAH recall 掉点的排查顺序

recall 掉点先看 KV 量化,再看权重量化,最后看上下文长度。q4_0 在 128K 以内可能看不出差异,但到 256K 远距 needle 时容易掉。你可以让 Codex 把 CSV 按长度和深度分组,找出是 90% 深度先掉,还是整体都掉。如果是整体掉,检查 prompt 是否让模型只输出 UUID;如果是 90% 深度掉,优先怀疑 KV q4_0 的远距压缩。

6. 跑完复核后,用同一把 Key 对一次用量

6.1 模型对话里发一条最小请求

脚本和矩阵跑完,不要急着拆环境。先在 TaoToken 模型对话 里用同一把 Key 发一条最小消息,确认模型 ID、Base URL、Key 三件套没有填错。模型对话走的是云端通道,本地 Ollama 的显存数据不会在这里出现,但 Codex 这一轮生成脚本、解释输出消耗的 Token 会记在对应 Key 上。

6.2 回控制台看这次 Codex 复核消耗

如果你准备长期用 Codex 做这类本地压测复核,可以打开 Coding Plan 看套餐是否够用;Key 的管理和新建在 控制台 API Keys。下次再跑 2×2 矩阵,先让 Codex 生成采样脚本,本地执行 nvidia-smi 和 NIAH,把 free 数值贴回对话,让它判断该降 KV 到 q4_0,还是该把 256K 拆成两段 128K。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询