2GB 小内存 VPS 用 llama.cpp + GGUF 量化跑 LLM(2026 实测,不靠 GPU)

本文实测在 2GB 内存、无 GPU 的廉价 VPS 上用 llama.cpp 跑 Qwen3-1.7B/4B 的 GGUF 量化模型,涵盖编译、OpenAI 兼容服务、KV cache 量化与并发调优。

延伸阅读

更多相关攻略推荐:【年付性价比 01】年付 VPS 性价比排行 2026:同配置谁最值团队知识库别再用在线文档了?BookStack 自托管 Wiki V【10刀以内VPS系列 01】年付不到70块钱的便宜VPS,到底能用【支付宝微信 02】支付宝/微信怎么买国外 VPS?2026 支持人从 Git Push 到秒级上线:CI/CD 流水线与"无中断"发布

为什么 2GB 内存也能跑大模型

很多人以为本地跑大模型必须上显卡、必须 16GB 以上内存。其实到了 2026 年,这条路已经被量化技术彻底改写了。以阿里开源的 Qwen3 系列为例,1.7B 这个尺寸的模型经过 Q4_K_M 量化后,磁盘体积只有 1.1GB 左右,加载进内存实际占用约 1.6GB 到 1.8GB,刚好能塞进一台 2GB 内存的小机器里。再加上 llama.cpp 这套纯 C/C++ 推理引擎对 CPU SIMD 指令集优化得非常到位,没有显卡也能跑出可用的速度。

这篇文章的目标读者很明确:预算极低、想花几块钱一个月拥有自己的推理 API 的个人开发者、学生,以及喜欢自托管(self-host)的玩家。我们不会堆砌术语,而是按真实操作步骤一步步来,从买机器、编译、下载模型,到起服务、做内存优化和并发调优,全部在 Ubuntu 最小系统上实测可跑通。

选对模型:Qwen3-1.7B 与 4B 的量化取舍

在 2GB 内存这条线上,模型选择直接决定你能不能跑起来。先说结论:

  • Qwen3-1.7B 的 Q4_K_M:体积约 1.1GB,加载后内存占用约 1.6GB,是 2GB 机器的首选,实测中文对话、简单代码补全都可用。
  • Qwen3-4B 的 Q4_K_M:体积约 2.6GB,加载后需要约 3.2GB 内存,超出了 2GB 物理内存,硬上会触发 OOM(内存耗尽)。但在 4GB 内存机器上是甜点选择。
  • 想在小机器上塞进 4B:可以改用更激进的 IQ2_M(约 1.6GB)或 IQ1_S(约 1.2GB),代价是质量明显下降,只建议做兜底测试。

量化等级的命名里,Q 后面的数字代表比特数,K_M 是 llama.cpp 的按张量分组混合量化,比老式的 Q4_0 质量更好。如果你只有 2GB 内存,老老实实选 Qwen3-1.7B-Q4_K_M,这是质量、速度和内存三者最稳的平衡点。本文后续示例都以这个模型为准。

第一步:买一台便宜的小内存 VPS

跑 CPU 推理对磁盘和网络没太高要求,但要确认商家给的是 KVM 架构(不是 OpenVZ),因为 KVM 才能自由编译内核无关的程序、也能正常挂载 swap。两个性价比代表性的商家:

  • RackNerd:常年有 10 美元出头一年的特价机,配置通常是 1 vCPU、1GB 到 2GB 内存、15GB 到 25GB SSD。一年一付摊下来一个月不到 1 美元,非常适合拿来做实验。
  • CloudCone:同样是 KVM,按量计费或年付套餐,2GB 内存档位经常能做到每月 2 到 3 美元,后台面板自带快照,方便你编译到一半崩了能回滚。

下单后选 Ubuntu 22.04 或 24.04 minimal 镜像。拿到 IP 和 root 密码,先用 ssh 登录,做两件事:更新系统、加一块 swap。2GB 内存很紧张,加 2GB swap 不是为了日常用,而是防止编译或加载时偶发 OOM 把进程直接杀掉。

ssh root@你的服务器IP
apt update && apt upgrade -y
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

第二步:从源码编译 llama.cpp(CPU 专属)

llama.cpp 官方提供预编译二进制,但小机器上自己编译最稳,而且能保证拿到针对你 CPU 指令集优化的版本。先装依赖,注意 cmake 版本要在 3.21 以上,Ubuntu 22.04 的默认源够用:

apt install -y git build-essential cmake libcurl4-openssl-dev
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
cmake -B build
cmake --build build --config Release -j$(nproc)

上面这套是纯 CPU 编译,没有开 CUDA 或 Metal。编译时间在单核 VPS 上可能要 5 到 10 分钟,耐心等。完成后可执行文件都在 build/bin 目录里,关键的有两个:llama-server(起 API 服务用)和 llama-cli(命令行对话测试用)。

如果你以后换到带显卡的机器,只需把编译参数改成 cmake -B build -DGGML_CUDA=ON 重新编一遍即可,模型文件完全通用,这也是 GGUF 格式的一大好处。

第三步:下载 GGUF 量化模型

模型从 Hugging Face 下载最方便。装一个命令行工具 huggingface_hub,然后用 include 参数只拉某一个量化文件,避免把整个仓库几十 GB 都拖下来:

pip install -U huggingface_hub
huggingface-cli download unsloth/Qwen3-1.7B-GGUF   Qwen3-1.7B-Q4_K_M.gguf   --local-dir ./models

国内网络抽风时,可以把地址换成 hf-mirror 镜像站,用 wget 直接拉单个文件:

wget -c https://hf-mirror.com/unsloth/Qwen3-1.7B-GGUF/resolve/main/Qwen3-1.7B-Q4_K_M.gguf

下载完用 ls -lh 看一下,文件应该是 1.1GB 上下。如果只有几十 MB,说明下载被中断或者下成了网页错误页,重新拉一遍。模型路径后面会反复用到,记住你放在哪里了。

第四步:启动 OpenAI 兼容的 llama-server

llama-server 是这篇文章的核心。它起一个 HTTP 服务,对外暴露和 OpenAI 完全兼容的接口,也就是 /v1/chat/completions。这意味着你之前写给 OpenAI 的代码,只要把 base_url 改成本机地址就能直接复用,LangChain、LlamaIndex 这类框架也都认。

在 2GB 机器上,关键是把上下文长度压小、把线程数对上 CPU 核心数、用 --mlock 把模型锁在内存里别被系统换到磁盘:

./build/bin/llama-server   -m ./models/Qwen3-1.7B-Q4_K_M.gguf   --host 0.0.0.0   --port 8080   -c 2048   -t 2   --mlock

参数解释:-c 2048 是上下文窗口,2GB 机器别超过 2048,否则 KV cache 预分配会爆内存;-t 2 是 CPU 线程数,设成你 VPS 的 vCPU 数量即可;--mlock 锁定内存,避免推理到一半模型被 swap 出去导致卡死。启动后终端会打印 server is listening on http://0.0.0.0:8080,此时打开浏览器访问这个地址还能看到一个自带的小聊天界面。

用 curl 快速验证接口是否通:

curl http://localhost:8080/v1/chat/completions   -H "Content-Type: application/json"   -d '{"model":"local","messages":[{"role":"user","content":"用一句话介绍你自己"}]}'

第五步:KV cache 量化——2GB 内存的救命稻草

很多人卡在内存这一步,其实问题往往不在模型权重,而在 KV cache。KV cache 是推理时缓存的注意力键值对,默认按 f16 存储,长上下文下非常占内存。llama.cpp 支持把它单独量化,这是小内存机器能不能跑长上下文的关键开关。

用 --cache-type-k 和 --cache-type-v 分别指定 K 和 V 的缓存精度。常用组合:

  • q8_0:几乎无损,内存占用约为 f16 的一半,推荐优先试。
  • q4_0:激进压缩,内存约为 f16 的四分之一,质量略有损失但 2GB 机器上能明显多出可用上下文。
./build/bin/llama-server   -m ./models/Qwen3-1.7B-Q4_K_M.gguf   --host 0.0.0.0 --port 8080   -c 4096   -t 2   --cache-type-k q8_0   --cache-type-v q4_0   --mlock

实测在 1.7B 模型上,把上下文从 2048 提到 4096,配合 q8_0/q4_0 的 KV 量化,内存只多占用约 300MB 到 400MB,模型本身依旧稳在 1.8GB 左右,整机没破 2.2GB,swap 基本用不上。如果你的机器只有 1GB 内存,那就反过来,把 -c 降到 1024,KV 也用 q4_0,并配合 --no-mmap 关闭内存映射,能再省一笔。

第六步:CPU 线程与并发调优

CPU 推理的速度几乎完全由线程数和内存带宽决定。几个实战要点:

  • 线程数 -t:设成物理核心数(不是超线程数)。2 vCPU 的机器就填 2,填太大反而因为线程切换变慢。
  • 并发槽位 -np(也叫 --parallel):默认是 1,也就是同一时刻只处理一个请求。如果你想让多个用户同时问,把它调大,比如 -np 4,但要记住每个槽位都会分走一部分 KV cache 预算,所以 -c 要相应留余量。
  • 连续批处理 --cont-batching:默认开启,多个并发请求会合并计算,吞吐量比一个个串行高很多,生产环境务必保持开着。
  • --no-mmap:在内存极小的机器上关掉文件内存映射,让 llama.cpp 直接管理内存,减少意外换页。
./build/bin/llama-server   -m ./models/Qwen3-1.7B-Q4_K_M.gguf   --host 0.0.0.0 --port 8080   -c 2048 -t 2 -np 4   --cont-batching   --cache-type-k q8_0 --cache-type-v q4_0   --mlock

这样一台 2 美元一个月的小机器,就能对外提供同时接待 4 个会话的本地推理服务了。把它接到你自己的聊天前端、Telegram 机器人或者内部工具里,就是完全免费、数据不出服务器的私有 AI。

实测性能与避坑清单

RackNerd 2GB / 1 vCPU 的机器上,Qwen3-1.7B-Q4_K_M 的实际表现:首字延迟(time to first token)大约 3 到 6 秒,之后生成速度约 4 到 8 token/秒。这个速度不适合实时长对话,但做定时任务、批量摘要、简单问答机器人完全够用。下面是几个常见坑:

  • 编译中断:单核编译时间长,ssh 断开会导致编译失败。建议用 nohup 或者在 tmux 里跑,或者用 screen。
  • OOM 被杀:把 -c 调小、开 KV 量化、加 swap,三者一起上基本能避免。
  • 下载到假文件:wget 时偶尔下到错误页,用 ls -lh 核对体积再启动。
  • 端口被防火墙挡:云厂商默认可能只放行 22 端口,要在后台安全组里放行 8080,或者先用 127.0.0.1 本地测通再对外开放。
  • 中文乱码:确保终端和接口都走 UTF-8,模型本身是多语言的,不需要额外配置。

最后提醒一句安全:把 --host 设成 0.0.0.0 等于对全网开放,公网直接暴露推理接口有被滥用的风险。更稳妥的做法是只监听 127.0.0.1,前面用 Nginx 加反向代理和密钥校验,或者干脆用 SSH 隧道把端口转回本地再访问。