2026-10-09 03:00
最近想在本地跑一个能给 Codex CLI 用的 Coding LLM。
我的电脑有一张 RTX 4090,不拿来跑点本地模型感觉有点浪费。模型选了新出的 Qwen3.8 27B,Q4_K_M 量化,用 Ollama 跑。
本来觉得模型文件只有 15GB 多,24GB 显存怎么也够了。结果当然没有这么简单。
折腾了一圈,最后做到:
Qwen3.8 27B Q4_K_M
128K Context
Q8 KV Cache
Flash Attention
66/66 Layers on GPU
生成速度大约 100 tokens/s。
记录一下过程。
电脑配置:
CPU: Intel Core i9-13900K
RAM: 80 GB
GPU: NVIDIA GeForce RTX 4090 24 GB
【隐藏配件:未解锁】
OS: Windows
Ollama: 0.34.4
Codex CLI: 0.157.1
Terminal: Warp
Qwen3.8 27B 的 GGUF 文件是 Q4_K_M,27.32B 参数,文件大小 15.65GiB。
模型默认的上下文是 32K,这个长度我连一轮对话都完成不了。实际跑 Codex 时,一次请求可以直接塞进来 76000 多 token。所以 64K 也不用想了,96K 勉强可用但留给模型发挥的空间也不多。
所以我建了一个 Ollama Model 把上下文顶到 128K:
FROM qwen3.8:27b
PARAMETER num_ctx 131072
模型原生最高支持 256K,但那不是一台 4090 可以觊觎的奢华。
先把模型运行起来,发现速度超慢,一看,显存没装下,一部分模型层被加载到 CPU 了。
4090 有 24GB 显存,按说挺能装才对。具体看了看显存占用的情况。
Qwen3.8 27B 的模型文件是 15.65GiB,实际加载到 CUDA 后 Model Buffer 大约:
15339 MiB
这部分没什么好说的,已经先拿走了 15GB。
真正开始让事情紧张起来的是 128K Context,使用 Q8 KV Cache 时:
K: 2176 MiB
V: 2176 MiB
Total: 4352 MiB
一下又是 4.35GB。
再加上一些零零碎碎,完整运行这套 Qwen 模型大约需要:
21867 MiB
看着比 24G 少,但是别急。
因为我的显示器接在 4090 上。日常就有 Chrome、VS Code 一堆东西在占着差不多 2GB 显存。
加上这 2G 好像勉强还够。但是最后一根稻草来了:
敢情 Ollama 并不是有多少显存用多少,它还想留出一大块安全余量,默认大小是:
1936 MiB
于是华丽丽地超出了。结果就是 Ollama 分配了 59/66 Layers 在 GPU,剩下都扔到了 CPU。
CPU Offload。
“大部分在 GPU”和“全部在 GPU”完全不是一回事。CPU Offload 之下生成速度大残,只有二十几个 token/s。对 Code Agent 来说几乎没法工作。
那怎么才能把模型全放进 GPU 呢?有几个妥协方案。
第一个办法是减小 Context。
这个最直接,Context 越小 KV Cache 越小。但是前面说了 128K 已经紧巴巴了,不能再省了。
第二个办法是把 KV Cache 精度从 Q8 降成 Q4。
这个其实效果很好。KV 的大小一下就下来了,很容易实现 100% GPU,速度也没问题。实际用下来也没有明显感觉输出质量有什么变化。
但是精度这个东西就很玄学。
既然花了这么长时间折腾 4090,最后因为差一点显存主动把 KV 从 Q8 降到 Q4,感觉比较不爽。
现在可以揭晓上面电脑配置列表里那个【隐藏配件】了:
我的 i9-13900K 自带 Intel UHD Graphics 770。集成显卡。
而且是激活的。打开资源管理器就能看见两个 GPU。
平时这个集成显卡基本没什么存在感。现在终于发现它有一个非常适合的工作:
在 4090 跑模型的时候接管显示器。
我几千块买的 4090 不是用来画 Windows 任务栏的。
问题是主板后面这个集成显卡视频接口一直没用过,上面还插着一个塑料保护塞。塞得贼紧。
抠得我指甲都劈了。最后拿小刀和钳子一点一点撬出来的。
就为了省两 GB 显存。
显示器线从 4090 拔下来,插上集显。运行 nvidia-smi 一看,卡里的显存占用一点没少。
这个时候不要着急。只要 sign out 当前 Windows 用户,重新登录,再 nvidia-smi:
Memory-Usage: 0 MiB / 24564 MiB
Disp.A: Off
No running processes found
4090 清空了。
但是这时候 Ollama 还要留出 1.9 GiB 的安全余量,剩余显存还是不够。
于是,精确计算了剩下的显存空间,设置 LLAMA_ARG_FIT_TARGET 安全余量为 384 GiB。
再运行模型:
offloaded 66/66 layers to GPU
终于把整个模型放进 GPU 了。实际生成速度达到了 100 token/s。
那么,不跑模型的时候,想玩游戏怎么办?
我的显示器本身有多个输入。我又找了根线,把 4090 和集显同时连到同一块显示器。
Windows 会把这两个连接当成两个屏幕,虽然实际上它们对应的是同一台物理显示器。
这样反而很方便。我可以直接用 Windows 的 Project(Win+P)切换:
PC screen only
和:
Second screen only
一个模式走 Intel UHD,一个模式走 RTX 4090。
平时跑本地模型就切到集成显卡。需要独显输出的时候再切回来。
最后的配置是:
Qwen3.8 27B Q4_K_M
128K Context
Q8 KV Cache
Flash Attention
66/66 Layers on RTX 4090
普通请求实测:
Prompt Eval: 1235 tokens/s
Generation: 100 tokens/s
Codex 一次 76000 多 token 的大 Prompt,Prefill 我看到过大约:
2689 tokens/s
对比之前有几个 Layer 在 CPU 时二十几个 token/s,已经不是一个体验。
现在最大的缺点是显存真的塞得很满。Ollama 算出来只剩四百多 MB 安全空间。所以跑模型的时候就不要再让什么程序突然跑去用 4090 了。
好在显示器已经全部交给 Intel UHD。
目前的状态就是,不运行模型时 4090 显存几乎为零;一运行模型就接近全满。
挺好。买都买了,不用也是浪费。
评论 / Comments
登录自己的 GitHub 账号即可发表评论。 / Sign in with your GitHub account to comment.
正在加载评论…… / Loading comments…
GitHub Discussions