@sachindetrax: 262K 上下文长度,运行于 16GB RTX 5070 Ti 显卡上。Qwen 3.8 27B Q3 模型达到约 25 tok/s,同时一个自适应 llama.cpp 分支在 RAM 和 VRAM 之间流式传输 KV 缓存…

X AI KOLs Timeline 工具

摘要

llama.cpp 的一个自适应 KV 缓存流式传输分支,使得在 16GB RTX 5070 Ti GPU 上运行 Qwen 3.8 27B 模型并支持 262K 上下文成为可能,通过在内存与显存间高效管理,实现了约 25 tok/s 的速度。

262K 上下文长度。运行于 16GB RTX 5070 Ti 显卡上。 Qwen 3.8 27B Q3 模型达到约 25 tok/s,而一个自适应 llama.cpp 分支在 RAM 与 VRAM 之间流式传输 KV 缓存。 原版 llama.cpp 在约 120K 上下文时开始出现严重卡顿。 相同的消费级 GPU,可用上下文长度提升超过两倍。 这对于本地运行大语言模型来说可能是个重大突破。 配置如下: .\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…
查看原文
查看缓存全文

缓存时间: 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-GGUF UD-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
CUDANVIDIA GPU
HIPAMD GPU
Hexagon [进行中]骁龙
IBM zDNNIBM Z & LinuxONE
MUSAMoore Threads GPU
MetalApple 芯片
OpenCLAdreno GPU
OpenVINO [进行中]Intel CPU、GPU 和 NPU
RPC (https://github.com/ggml-org/llama.cpp/tree/master/tools/rpc)所有
SYCLIntel GPU
VirtGPUVirtGPU APIR
VulkanGPU
WebGPU所有
ZenDNNAMD CPU

文档

工具

开发

贡献

  • 贡献者可以提交 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++ 的单文件头进程启动方案 - 公共领域

相似文章

在32GB显存上以Q8量化使用Qwen3.6-27,接近100K上下文

Reddit r/LocalLLaMA

用户分享了他们在拥有32GB显存的RTX 5090上,使用Q8量化的Qwen3.6-27B模型尝试达到115K上下文长度的配置与实验过程,并给出了基准测试结果,以及上下文长度与kv-cache量化之间的权衡。