@sachindetrax: 262K 上下文长度,运行于 16GB RTX 5070 Ti 显卡上。Qwen 3.8 27B Q3 模型达到约 25 tok/s,同时一个自适应 llama.cpp 分支在 RAM 和 VRAM 之间流式传输 KV 缓存…
摘要
llama.cpp 的一个自适应 KV 缓存流式传输分支,使得在 16GB RTX 5070 Ti GPU 上运行 Qwen 3.8 27B 模型并支持 262K 上下文成为可能,通过在内存与显存间高效管理,实现了约 25 tok/s 的速度。
查看缓存全文
缓存时间: 2026/08/29 16:06
262K 上下文。在 16GB RTX 5070 Ti 上运行。Qwen 3.8 27B Q3 约达 25 token/s,而一个自适应 llama.cpp 分支能在 RAM 与 VRAM 之间流式传输 KV 缓存。原版 llama.cpp 在约 120K 上下文时开始出现内存抖动。使用相同消费级 GPU,可用上下文扩大了 2 倍以上。这对本地 LLM 运行可能意义重大。配置如下:
.\llama-server.exe ^
--model "Qwen3.8-27B-UD-Q3_K_XL.gguf" ^
--ctx-size 262144 ^
-fa on ^
-ctk q8_0 ^
-ctv q4_0 ^
-ngl all ^
-np 1 ^
-b 256 ^
-ub 256 ^
--kv-stream-stage-mib 2304
我正在进一步探索极限。关注后续基准测试,或告诉我你接下来想测试什么。
GitHub: https://github.com/sachin-detrax/llama.cpp-adaptive-kv-streaming
sachin-detrax/llama.cpp-adaptive-kv-streaming
来源: https://github.com/sachin-detrax/llama.cpp-adaptive-kv-streaming
用于 llama.cpp 的自适应 KV 流式传输
此分支为 CUDA 版 llama-server 添加了实验性的、块粒度的 KV 缓存流式传输路径。它旨在运行长上下文场景,当模型权重占用后导致 VRAM 无法容纳完整的 KV 缓存时使用。
通过 --kv-stream-stage-mib N 参数,权威的 KV 张量存储在固定主机内存中,而一个有限的 CUDA 内存池由常驻 KV 页和传输环共享。运行时会随着上下文的增长自适应调整分配比例:在预算允许的情况下保持尽可能多的常驻页,当需要更多流式传输时回收常驻空间用于暂存,并在当前层计算时预取后续层。这避免了对不受控的统一内存页面抖动的依赖,并确保了在完整上下文上的精确注意力计算。
详细的项目故事、设计、实现和基准测试结果,请参阅:《在 16GB 显存上运行 Qwen 27B 的完整上下文长度:为 llama.cpp 构建自适应 KV 缓存流式传输》(https://medium.com/@raymond860909/running-qwen-27b-on-16g-vram-with-full-context-length-building-adaptive-kv-cache-streaming-for-bf1e819116e9)。
这是针对我们当前 NVIDIA CUDA 配置(RTX 5070 Ti,16 GB VRAM,
unsloth/Qwen3.8-27B-GGUFUD-Q3_K_XL,262144 token 上下文,Flash Attention,Q8_0 K 缓存,Q4_0 V 缓存,以及单个服务器槽位)量身定制的研究代码。尚不支持或未验证其他模型、KV 缓存量化组合、并行槽位及非 CUDA 后端。扩展模型和 KV 量化支持是后续工作。
构建修改后的服务器
安装 C++ 编译器、CMake 和 CUDA 工具包,然后从仓库根目录运行以下命令:
cmake -S . -B build -DGGML_CUDA=ON -DGGML_CUDA_FA_ALL_QUANTS=ON -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release --target llama-server -j
可执行文件将生成在 build/bin/llama-server。
使用已测试缓存配置的示例:
./build/bin/llama-server \
--model /path/to/model.gguf \
--ctx-size 262144 \
-fa on \
-ctk q8_0 \
-ctv q4_0 \
-ngl all \
-np 1 \
--kv-stream-stage-mib 2304
--kv-stream-stage-mib 的最佳值取决于模型、上下文容量、GPU 及其他 VRAM 消耗情况。请保守设置初始值,并在检查启动和峰值 VRAM 使用情况后逐步增加。
可选的统一内存用于模型权重
自适应 KV 流式传输可与或不与统一内存一起工作。不设置 GGML_CUDA_ENABLE_UNIFIED_MEMORY 即可使用普通的 CUDA 设备分配。若要让 GPU 卸载的模型缓冲区使用 CUDA 托管分配,可通过启用环境变量来启动相同的服务器:
GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 \
./build/bin/llama-server \
--model /path/to/model.gguf \
--ctx-size 262144 \
-fa on \
-ctk q8_0 \
-ctv q4_0 \
-ngl all \
-np 1 \
--kv-stream-stage-mib 2304
使用此标志后,CUDA 支持的模型缓冲区(包括 GPU 卸载的权重)将使用 cudaMallocManaged 分配,其页面可在 VRAM 和主机内存之间迁移。自适应的常驻页和传输环池有意设计不同:它仍然使用 cudaMalloc 分配,因此该固定大小的池保持物理分配在 VRAM 中,而不会成为托管内存。因此,统一内存对于此分支是可选的,不会将 KV 流式传输池变为可分页存储。
重现基准测试图表
基准测试驱动程序会自动为每个配置的上下文容量选择最大的实用自适应 KV 池,从 8K 扫描到请求的最大值,并生成 CSV、PNG 和 SVG 结果:
python3 -m pip install matplotlib
python3 benchmarks/benchmark_kv_stream.py \
--model /path/to/model.gguf \
--max-context 192K
唯一必需的参数是模型 GGUF 和最大上下文。有关池探测算法、生成的文件、可选设置和可恢复的输出目录,请参见 benchmarks/README.md。
上游 llama.cpp README
llama.cpp
用 C/C++ 实现的 LLM 推理
许可证: MIT (https://opensource.org/licenses/MIT)
发布 (https://github.com/ggml-org/llama.cpp/releases)
服务器 (https://github.com/ggml-org/llama.cpp/actions/workflows/server.yml)
Docker (https://github.com/ggml-org/llama.cpp/actions/workflows/docker.yml)
Winget (https://github.com/ggml-org/llama.cpp/actions/workflows/winget.yml)
manifesto (https://github.com/ggml-org/llama.cpp/discussions/205) / ggml (https://github.com/ggml-org/ggml) / ops (https://github.com/ggml-org/llama.cpp/blob/master/docs/ops.md) / 维护者 PRs (https://github.com/ggml-org/llama.cpp/issues?q=is%3Apr%20is%3Aopen%20draft%3AFalse%20(author%3Argerganov%20OR%20author%3AKitaitiMakoto%20OR%20author%3Adanbev%20OR%20author%3Aaldehir%20OR%20author%3Amax-krasnyansky%20OR%20author%3ACISC%20OR%20author%3Aggerganov%20OR%20author%3Aam17an%20OR%20author%3Abartowski1182%20OR%20author%3Ahipudding%20OR%20author%3AServeurpersoCom%20OR%20author%3Apwilkin%20OR%20author%3Areeselevine%20OR%20author%3Angxson%20OR%20author%3Ajeffbolznv%20OR%20author%3A0cc4m%20OR%20author%3Aangt%20OR%20author%3AIMbackK%20OR%20author%3Aarthw%20OR%20author%3AJohannesGaessler%20OR%20author%3AORippler%20OR%20author%3Aruixiang63%20OR%20author%3Axctan%20OR%20author%3Aallozaur%20OR%20author%3Ayomaytk%20OR%20author%3Aaendk%20OR%20author%3Agaugarg-nv%20OR%20author%3Ataronaeo%20OR%20author%3Aforforever73%20OR%20author%3Alhez%20OR%20author%3Anetrunnereve%20OR%20author%3Afairydreaming)%20sort%3Aupdated-desc) / 编译时间 (https://github.com/ggml-org/llama.cpp-dev/blob/master/README-compile-times.md) / lib llama API (https://github.com/ggml-org/llama.cpp/issues/9289) / llama-server REST API (https://github.com/ggml-org/llama.cpp/issues/9291)
快速开始
几种将 llama.cpp 安装到您机器上的方式:
- 访问 https://llama.app 并按照说明操作
- 使用 Docker 运行 - 参见我们的 Docker 文档
- 从发布页面 (https://github.com/ggml-org/llama.cpp/releases) 下载预构建的二进制文件
- 通过克隆此仓库从源代码构建 - 请查看我们的构建指南
安装完成后:
# 直接从 Hugging Face 下载并运行模型
llama cli -hf ggml-org/Qwen3.5-0.8B-GGUF
# 启动 OpenAI 兼容的 API 服务器
llama serve -hf ggml-org/Qwen3.5-0.8B-GGUF
使用 llama cli 的 VLM 会话
针对 llama serve 的内置 Web UI
描述
llama.cpp 的主要目标是以最少的设置和在广泛硬件(本地及云端)上的最先进性能来实现 LLM(和 VLM)推理。
- 纯 C/C++ 实现,无任何依赖
- Apple 芯片是首要支持平台 - 通过 ARM NEON、Accelerate 和 Metal 框架优化
- 支持 x86 架构的 AVX、AVX2、AVX512 和 AMX
- 支持 RISC-V 架构的 RVV、ZVFH、ZFH、ZICBOP 和 ZIHINTPAUSE
- 支持 1.5 位、2 位、3 位、4 位、5 位、6 位和 8 位整数量化,以实现更快的推理和减少内存使用
- 用于在 NVIDIA GPU 上运行 LLM 的自定义 CUDA 内核(通过 HIP 支持 AMD GPU,通过 MUSA 支持 Moore Threads GPU)
- Vulkan 和 SYCL 后端支持
- CPU+GPU 混合推理,可部分加速总 VRAM 容量不足的大型模型
llama.cpp 项目建立在 ggml (https://github.com/ggml-org/ggml) 库之上。
支持的后端
| 后端 | 目标设备 |
|---|---|
| BLAS | 所有 |
| BLIS | 所有 |
| CANN | 昇腾 NPU |
| CUDA | NVIDIA GPU |
| HIP | AMD GPU |
| Hexagon [进行中] | 骁龙 |
| IBM zDNN | IBM Z & LinuxONE |
| MUSA | Moore Threads GPU |
| Metal | Apple 芯片 |
| OpenCL | Adreno GPU |
| OpenVINO [进行中] | Intel CPU、GPU 和 NPU |
| RPC (https://github.com/ggml-org/llama.cpp/tree/master/tools/rpc) | 所有 |
| SYCL | Intel GPU |
| VirtGPU | VirtGPU APIR |
| Vulkan | GPU |
| WebGPU | 所有 |
| ZenDNN | AMD CPU |
文档
工具
开发
- 如何构建
- 在 Docker 上运行
- 在 Android 上构建
- 多 GPU 使用
- 性能问题排查
- GGML 提示与技巧 (https://github.com/ggml-org/llama.cpp/wiki/GGML-Tips-&-Tricks)
- XCFramework
- 补全
- 模型
- 发布流程
贡献
- 贡献者可以提交 PR
- 基于贡献情况将邀请协作者
- 维护者可以将代码推送到
llama.cpp仓库的分支,并将 PR 合并到master分支 - 任何关于管理 issues、PRs 和项目的帮助都非常感谢!
- 阅读 CONTRIBUTING.md 了解更多信息
致谢
- yhirose/cpp-httplib (https://github.com/yhirose/cpp-httplib) - 单文件头 HTTP 服务器,被
llama-server使用 - MIT 许可证 - stb-image (https://github.com/nothing/stb) - 单文件头图像格式解码器,被多模态子系统使用 - 公共领域
- nlohmann/json (https://github.com/nlohmann/json) - 单文件头 JSON 库,被各种工具/示例使用 - MIT 许可证
- miniaudio.h (https://github.com/mackron/miniaudio) - 单文件头音频格式解码器,被多模态子系统使用 - 公共领域
- subprocess.h (https://github.com/sheredom/subprocess.h) - 用于 C 和 C++ 的单文件头进程启动方案 - 公共领域
相似文章
在 8GB 显存和 32GB 内存上运行 Qwen3.6 35b a3b,~190k 上下文
作者分享了一种高性能的本地推理配置,使用支持 TurboQuant 的修改版 llama.cpp,在硬件受限(8GB 显存、32GB 内存)的情况下运行 Qwen3.6 35B A3B,实现了 ~37-51 tok/sec 的生成速度,并支持 ~190k 上下文。
在32GB显存上以Q8量化使用Qwen3.6-27,接近100K上下文
用户分享了他们在拥有32GB显存的RTX 5090上,使用Q8量化的Qwen3.6-27B模型尝试达到115K上下文长度的配置与实验过程,并给出了基准测试结果,以及上下文长度与kv-cache量化之间的权衡。
Qwen3.6-35B-A3B Q4 262k上下文,8GB 3070 Ti上可达+30tps
作者分享了在8GB RTX 3070 Ti上使用llama.cpp运行Qwen3.6-35B-A3B MoE模型,实现高达262k上下文、30+tps的详细调优技巧,并指出从Windows切换到Ubuntu Server后速度提升了25%。
单卡 RTX 5090:Qwen3.8-27B NVFP4 在 vLLM 中实现真实 262K 上下文长度 — 短上下文速度达 77 tok/s,128K 上下文时为 64.7 tok/s
本文展示了在NVIDIA RTX 5090显卡上使用vLLM框架运行Qwen3.8-27B模型的实际部署流程与性能基准测试,涵盖262K令牌上下文窗口的配置细节与各项关键指标。
两块旧款RTX 2080 Ti,每块22GB显存,运行Qwen3.6 27B,使用f16 KV缓存达到38 token/s
一位用户分享其配置:使用两块改装版RTX 2080 Ti GPU(每块22GB显存)通过llama.cpp以38 token/s运行Qwen 3.6 27B,并包含关于功耗限制、张量分割模式和KV缓存设置的技巧。