开始之前
安装 Visual Studio 2022,勾选「使用 C++ 的桌面开发」工作负载 —— 这一个勾选项会一并装好 CMake 和 MSVC 工具链,不需要再单独下载什么。再装 CUDA Toolkit,以及与之匹配的较新驱动。还有一个最省时间的习惯:下面所有命令都要在「VS 2022 开发人员命令提示符」里运行,而不是普通终端,因为普通终端没有设置编译器路径。
# In a Developer Command Prompt / PowerShell for VS 2022
cmake --version
nvcc --version
nvidia-smi开启 CUDA 编译
开关是 `GGML_CUDA`。旧名字会被识别 —— `LLAMA_CUDA` 仍然有效、只是附带弃用警告,`LLAMA_CUBLAS` 会直接报错停止 —— 但拼错的名字不会:CMake 对不认识的 `-D` 只在配置结束时给一条 "Manually-specified variables were not used" 警告,然后照常继续,得到一次干净、成功、却是纯 CPU 的构建。之后你发现不对劲的第一个迹象,就是模型只有预期速度的零头,所以请看完配置输出的结尾。
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
# CMAKE_CUDA_ARCHITECTURES is optional but cuts build time a lot:
# 86 = RTX 30-series, 89 = RTX 40-series, 120 = RTX 50-series
cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="89"
cmake --build build --config Release -j启动服务
生成的可执行文件在 `build\bin\Release\` 目录下,名字是 `llama-server.exe` 和 `llama-cli.exe` —— 旧的 `server.exe`、`main.exe` 已经不存在了,这是另一个会让人去搜索引擎的地方。除非你真的打算把这台机器暴露出去,否则就绑定到本机。
# One line on purpose: ^ continues a line only in cmd, ` only in PowerShell.
.\build\bin\Release\llama-server.exe --model C:\models\Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf --n-gpu-layers 99 --ctx-size 4096 --host 127.0.0.1 --port 8080确认它真的跑在 GPU 上
llama.cpp 在加载时会打印层的分配情况,那一行就是全部答案 —— 如果 offload 的层数少于总层数,剩下的就在 CPU 上,每个 token 都要为此付出代价。纯 CPU 构建则完全不会报告 CUDA 设备,这正是发现上面那个「用错开关」问题的方法。
# What a working CUDA build prints:
ggml_cuda_init: found 1 CUDA devices:
Device 0: NVIDIA GeForce RTX 4060 Ti, compute capability 8.9
load_tensors: offloaded 33/33 layers to GPU
# A CPU-only build never mentions a CUDA device at all.数字大概该是什么样
每生成一个 token 都要把整套权重读一遍,所以显卡的显存带宽就是上限。Llama 3.1 8B 的 Q4_K_M 权重是 4.6 GB:在 288 GB/s 的 RTX 4060 Ti 上,生成速度上限约 62 tok/s;在 1,008 GB/s 的 RTX 4090 上约 218。这些是基于公开规格的算术结果而不是跑分,实际吞吐会低于它们 —— 但如果低了一个数量级,那说明你在用 CPU 跑。
出问题时
找不到 `nvcc`:要么你不在开发人员命令提示符里,要么 CUDA Toolkit 是在 Visual Studio 之后装的,MSBuild 集成没有注册上。编译成功但没有 CUDA 设备:配置步骤根本没收到 `-DGGML_CUDA=ON` —— 要么漏写了,要么拼错了、被列在 "Manually-specified variables were not used" 里 —— 删掉 `build\` 重新配置,因为旧的缓存会保留之前的结论。不报错但莫名很慢:Windows 的 NVIDIA 控制面板默认开启「系统内存回退」,它会把超出的显存溢出到系统内存而不是报 OOM,于是「装不下的模型」变成了「爬着走的模型」。测量时请关掉它。至于 CUDA 头文件深处那种没头没尾的编译错误,通常是工具链版本和 Visual Studio 版本不匹配 —— 先去查该 CUDA 版本支持的 MSVC 区间,再怀疑自己的代码。
常见问题
Windows 上编译出来的 llama.cpp 为什么不用 GPU?
几乎总是编译开关的问题。正确的是 `-DGGML_CUDA=ON`。漏写或拼错,都会得到一次成功的、纯 CPU 的构建 —— CMake 只会在配置结束时把不认识的 `-D` 列在 "Manually-specified variables were not used" 下面。(旧的 `LLAMA_CUDA` 仍然有效,只是附带弃用警告。)重新配置前请删掉 `build` 目录 —— 旧的 CMake 缓存会保留之前的结论。正常的构建会在加载时打印 CUDA 设备和层的 offload 数量。
Windows 上用 CUDA 跑 llama.cpp 需要 WSL 吗?
不需要。llama.cpp 可以直接用 MSVC 加 CUDA Toolkit 原生编译,生成的 `llama-server.exe` 会直接使用 GPU。如果你出于别的原因想要一套 Linux 工具链,用 WSL 是合理的,但它是多加了一层而不是省掉一层,而原生编译还完全绕开了文件系统性能的问题。
「系统内存回退」是什么,要关掉吗?
这是 Windows 上 NVIDIA 驱动的一个特性:当负载装不下时,把超出的显存溢出到系统内存,而不是报显存不足的错误。对游戏来说这是好事;对本地推理来说,它把一个明确的报错变成了一个莫名其妙慢到几分之一的模型。在你测量模型大小的时候把它关掉,让「装不下」明确地失败。
这篇指南用到了什么
- 格式
- GGUF
它真的跑起来了吗?
复制命令并不等于它能用,所以站内只在这里问一次。除了你的这个回答之外,不收集任何东西。
相关指南
12GB 显卡能跑什么(RTX 3060 12G、4070、5070)
12GB NVIDIA 显卡在 8K–32K 上下文下能装下哪些模型、14B 从哪里开始装不下、如何用 Ollama 或 llama.cpp 运行,以及如何确认确实跑在 GPU 上。
将自己的模型量化为 GGUF
用 llama.cpp 的 quantize 工具将任意 HF 模型转为 GGUF Q4_K_M 本地推理。
Windows WSL2 + Ollama GPU 透传
在 WSL2 内用 NVIDIA GPU 加速运行 Ollama — Windows 本地 LLM 最稳妥的路线。