在 RTX 4090 上跑 Qwen 27B + 128K Context

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。

记录一下过程。

1. 环境

电脑配置:

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 可以觊觎的奢华。

2. 显存都去哪了

先把模型运行起来,发现速度超慢,一看,显存没装下,一部分模型层被加载到 CPU 了。

4090 有 24GB 显存,按说挺能装才对。具体看了看显存占用的情况。

模型本体

Qwen3.8 27B 的模型文件是 15.65GiB,实际加载到 CUDA 后 Model Buffer 大约:

15339 MiB

这部分没什么好说的,已经先拿走了 15GB。

KV Cache

真正开始让事情紧张起来的是 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,感觉比较不爽。

3. 解决方案

现在可以揭晓上面电脑配置列表里那个【隐藏配件】了:

我的 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。

平时跑本地模型就切到集成显卡。需要独显输出的时候再切回来。

4. 成果

最后的配置是:

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