把大模型跑在本地,这件事最近这两年已经从少数人的“实验室玩具”变成了越来越多团队和个人必须掌握的基本功。无论是做公司内部的私有化知识库,还是想在完全离线或内网环境里稳定跑对话、总结、代码生成,绕不开的核心操作就两个:本地部署和量化。而我日常用得最顺的三套工具,刚好对应三种不同的诉求——Ollama 负责开箱即用地拉起服务和 API,transformers 负责研究、评测和微调,llama.cpp 负责在资源紧张时把性能和量化空间压到极限。这三样配合起来,基本能覆盖从“随便玩玩”到“生产可用”的所有阶段。
这篇文章会把从环境搭建、模型拉取、量化选择,到 transformers 和 llama.cpp 的落地实操,以及我踩过的各种坑完整梳理一遍。适合刚接触本地大模型的新手,也适合已经用 Ollama 或 transformers 跑过一些模型、但还没搞懂量化原理和工具配合的人。
1. 一条管用的技术链路:Ollama、transformers、llama.cpp 到底怎么分工
1.1 三种工具的定位与选型对比
先纠正一个最常见的误区:这三者不是竞争关系,而是合作关系。我见过不少人试图“只用其中一个搞定所有事”,真一跑起来就会发现各有短板。
Ollama 的定位是最轻的部署层。它把模型文件统一封装成 GGUF 格式,后台用类似 llama.cpp 的推理引擎加载模型,对外暴露一个 OpenAI 兼容的 HTTP API。优点就是零配置,装完就能ollama run qwen2.5:7b,特别适合快速验证、私有化部署,以及接各种图形客户端。缺点则是可控性低,你想精准控制某一层的计算精度、想对输出做细粒度的统计,或者在推理中间层插入自定义逻辑,就比较别扭了。
transformers 是 Hugging Face 生态里的主力,几乎所有主流模型都会优先发布在这个平台上。它适合做研究型工作:加载原始 safetensors 权重、跑评测集、做 LoRA 微调、观察中间层输出,全都能干。缺点也很明显,默认按高精度浮点加载,显存占用大,版本依赖复杂,如果直接拿它做生产服务,资源上不太友好。
llama.cpp 是一套纯 C/C++ 实现的推理引擎,主打“在各种硬件上都能跑”。它定义了 GGUF 模型格式,提供了从权重转换、分片、量化到推理、API 服务的完整工具链。它在 CPU 上的表现尤其让人惊喜,普通笔记本跑 7B/8B 模型也能到每秒几个 token,这在很多老设备上已经是“能用了”的程度。
选型逻辑我用一张表总结:
| 工具 | 适合场景 | 部署难度 | 量化支持 | 典型用途 |
|---|---|---|---|---|
| Ollama | 快速部署、内部服务、接客户端 | 低 | GGUF 量化档位现成 | 私有知识库、对话助手 |
| transformers | 研究、评测、微调 | 中高 | bitsandbytes/GPTQ/AWQ/QLoRA | 模型分析、微调、跑测试集 |
| llama.cpp | 低配机器、CPU 推理 | 中 | GGUF 全档位量化、imatrix | 老显卡、内存受限设备 |
实际项目里经常是混用的。我在公司做私有化部署时,会先用 transformers 评测候选模型,选型通过后转成 GGUF,再用 llama.cpp 自测一遍量化损失,确认无误后扔进 Ollama 当服务跑。每个环节都用最顺手的工具,效率才是最高的。
1.2 量化的底层原理:从“高清原图”到“合适压缩比”
量化这个词在热词里出现频率极高,因为大家普遍没有动辄 40GB 以上的显存。一个 7B 模型用 FP16 存,光权重就有 14GB,还要再算上 KV cache 和激活值,16GB 显存其实相当紧张。量化的直接目的就是降低权重在内存里的占用,甚至降低部分计算精度,换来“能跑更大的模型”或者“能支撑更长的上下文”。
先说原理。模型权重原始精度通常是 FP16 或 BF16,每个参数占 2 字节。量化就是把这些连续浮点数映射到有限集合的整数上。比如 4bit 量化,每个参数只占 0.5 字节,体积直接变成原来的四分之一。这个过程保留了每个参数的大致数值,但丢掉了一些精度,所以量化后模型质量会有一定损失。
量化粒度也值得关注。per-tensor 是一整层共用一个缩放系数,实现简单但误差大;per-channel 按每个输出通道分别计算系数,误差小一些;per-group 则是把参数分成小组分别量化,现在主流 4bit 量化基本都是 group 量化。分组越小精度越高,但计算复杂度也越大。
工程里常见的量化方案有这么几类:
- GGUF K-quant:llama.cpp/Ollama 默认方式,只量化权重,激活仍保持浮点。主要目的是省内存,不一定能带来推理速度提升。
- GPTQ:在权重层面做二次规划,最小化量化误差,4bit 效果很好,常用于 transformers 直接加载。
- AWQ:根据激活分布对权重做重要度加权缩放,也是优秀的训练后量化方案。
- W8A8:权重和激活都量化成 INT8,能用上硬件的 INT8 矩阵乘法加速,在部分芯片上有实实在在的速度提升。DeepSeek-R1-Distill 系列里的 w8a8 版本就是走这个路线。
打个比方,FP16 模型像一张无损 PNG 原图,q4_K_M 像是压缩质量 75% 的 JPEG,肉眼看着差不多,但文件小很多;q2_K 则像被压到 30% 的图,能看出大概内容,细节已经糊了。量化选档,本质上就是在文件大小和质量之间,找自己能够接受的交点。
2. 环境地基:版本、路径和下载问题一次解决
2.1 Ollama 安装与把模型目录迁到 D 盘
安装本身没什么技术含量,Windows 去官网拉安装包,装完在终端执行ollama --version确认版本。Linux 可以用官方安装脚本,也可以手动解压安装,macOS 同理。真正让很多人头疼的是模型文件的可放置位置。
Ollama 默认把模型存在 C 盘用户目录下。C 盘本来空间就紧张,一个模型动辄 4GB 到 8GB,几个模型下来很容易爆盘。想把模型放到 D 盘,最稳妥的方案是设置环境变量OLLAMA_MODELS。
具体步骤是这样的:
- 先退出正在运行的 Ollama,托盘图标上右键退出。
- 在“此电脑 → 属性 → 高级系统设置 → 环境变量”里新建系统变量,变量名填
OLLAMA_MODELS,变量值填D:\ollama\models。 - 重新打开 Ollama,之后
ollama pull的模型就会落在 D 盘目录。
如果你不想动环境变量,也可以用目录联接的方式,把 C 盘原来的.ollama目录软链到 D 盘。以管理员身份打开 CMD,执行:
mklink /J C:\Users\你的用户名\.ollama D:\ollama这个方法适合已经下载了不少模型、不想重新拉一遍的情况。实际操作中有一个注意点:执行 mklink 之前,要把.ollama目录里已有的模型文件完整拷贝到 D 盘对应位置,否则系统会报“目录已存在”或者链接建立失败。
Ollama 还有几个环境变量值得一起记住:
OLLAMA_HOST:默认127.0.0.1:11434,想开放局域网访问就改成0.0.0.0:11434。OLLAMA_KEEP_ALIVE:控制模型在内存中的存活时间,默认 5 分钟,改成0可以让模型不常驻显存,不给推理请求时自动卸载。OLLAMA_NUM_PARALLEL:并行请求数,默认每次一个,对并发要求高可以调大,但显存压力也会明显上涨。
2.2 transformers / PyTorch / CUDA 版本兼容速查
热词里有人问“哪个版本的 PyTorch 和 CUDA 支持 transformers==3.4.0”。坦白讲,3.4.0 是 2020 年的老版本,匹配的 PyTorch 大概是 1.4 到 1.7,CUDA 10.1 到 10.2。现在再拿这套玩大模型基本跑不动,因为模型卡普遍要求 transformers 4.x 才能识别新的模型架构。如果你是在做本地大模型部署,建议直接上新的组合。
我推荐的版本矩阵:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Python | 3.10 或 3.11 | 3.12 部分量化库兼容还不完全 |
| PyTorch | 2.1 及以上 | 对编译、量化、注意力实现支持更好 |
| CUDA Toolkit | 11.8 或 12.1 | 具体看显卡驱动版本 |
| transformers | 4.40 及以上 | 支持新模型架构和量化接口 |
| bitsandbytes | 0.43 及以上 | 4bit/8bit 量化核心依赖库 |
安装 PyTorch 时如果不确定自己的 CUDA 环境,最稳的做法是到 PyTorch 官网选择对应参数生成安装命令。装完后用这几行代码快速检查环境:
import torch print(torch.__version__) print(torch.version.cuda) print(torch.cuda.is_available())如果torch.cuda.is_available()返回 False,通常不是显卡坏了,而是 PyTorch 和驱动不匹配。打开终端执行nvidia-smi,看右上角驱动的 CUDA 版本,然后安装不超过该版本的 PyTorch。要特别提醒的是,CUDA Toolkit 版本不是越高越好,驱动太老会直接导致启动报错,像CUDA driver version is insufficient for CUDA runtime version就是典型的版本不一致。
2.3 下载加速与国内镜像
大模型文件动辄几 GB、十几 GB,下载速度直接决定体验。Ollama 官方仓库默认部署在海外,国内网络环境下经常只有几十 KB/s,等半小时连一半都拉不完,还容易中断。
我尝试过的可行路径按优先级排一下:
- 如果官方仓库拉取太慢,先切换网络环境再试,很多时候换到晚间会好很多。
- 还是不行,就绕开 Ollama 的下载链路,从国内可用的 HuggingFace 镜像下载 GGUF 文件,再用
ollama create导入本地。设置镜像环境变量后,下载速度能提升不少。 - 直接在本机搭建私有模型目录,把模型文件用移动硬盘拷过来,内网部署时最省事。
以 HF 镜像为例,设置环境变量的方式:
export HF_ENDPOINT=https://hf-mirror.com huggingface-cli download TheBloke/Qwen2.5-7B-Instruct-GGUF qwen2.5-7b-instruct-q4_k_m.gguf --local-dir ./下载完本地导入需要写一个 Modelfile:
FROM ./qwen2.5-7b-instruct-q4_k_m.gguf TEMPLATE "{{ if .System }}<|im_start|>system {{ .System }}<|im_end|> {{ end }}<|im_start|>user {{ .Prompt }}<|im_end|> <|im_start|>assistant "然后执行ollama create qwen2.5-local -f ./Modelfile,模型会注册到本地库,之后ollama run qwen2.5-local就能用,和官方拉下来的体验一致。
这里要提醒一句:手动导入时聊天模板必须和模型原生的模板一致。如果模板写错,模型能跑但对话会变得很奇怪,甚至会输出一堆不完整的占位符。最好的做法是去模型官方仓库找现成的 Modelfile 模板,直接复制修改。
3. Ollama 实操:拉模型、量化选型与对接客户端
3.1 第一条命令跑通对话和 API
安装好 Ollama 后,最直接的验证是执行:
ollama run qwen2.5:7b第一次运行会自动下载模型。默认拉取的是 Qwen2.5 7B 的 q4_K_M 量化版本,体积约 4.7GB,下载完成后进入交互模式,可以直接打字对话。这套交互模式和应用端的体验很接近,适合快速测试。
我实测下来,在 16GB 内存的笔记本上跑 qwen2.5:7b,CPU 推理速度大约每秒 8 到 10 个 token,已经可用了。在有独立显卡的机器上会更快,生成速度能到每秒几十 token。
如果想把它当服务用,后台执行:
ollama serve默认监听127.0.0.1:11434,接口兼容 OpenAI 格式。用 curl 可以直接调用:
curl http://localhost:11434/api/chat \ -d '{"model": "qwen2.5:7b", "messages": [{"role": "user", "content": "你好"}], "stream": false}'返回结果里的response字段就是模型生成的文本。因为接口足够标准,CherryStudio、Open WebUI、ChatGPT-Next-Web 这类客户端都能直接接入,不需要额外开发。
如果想让对话更符合自己的场景,可以用 Modelfile 定制。比如设置系统提示词,让模型始终用中文精炼回答:
FROM qwen2.5:7b SYSTEM "你是一名严谨的工程师,回答尽量精炼,不要客套。" PARAMETER temperature 0.2 PARAMETER num_ctx 8192保存为Modelfile,执行ollama create my-assistant -f Modelfile,之后ollama run my-assistant就是一套带定制人设的服务了。
3.2 量化档位怎么选:显存、体积与质量的三角平衡
Ollama 仓库里不带后缀的标签,默认就是官方推荐的量化版,通常质量/体积比较平衡。但如果你想手动控制精度,就必须理解标签体系。以 Qwen2.5-7B 为例,常见标签和体积大约如下:
| 标签 | 每权重占位 | 约体积 | 推荐显存 |
|---|---|---|---|
| qwen2.5:7b(q4_K_M) | 4bit | 4.7GB | 6GB 以上 |
| qwen2.5:7b-q5_K_M | 5bit | 5.4GB | 8GB 以上 |
| qwen2.5:7b-q8_0 | 8bit | 7.8GB | 12GB 以上 |
| qwen2.5:7b-fp16 | 16bit | 15GB | 24GB 以上 |
选档位的核心思路是:实际可用显存减去 20% 余量,剩下的空间给模型权重和 KV cache。如果你只有 8GB 显卡,7B 模型就选 q4_K_M,上下文长度控制在 8k 以内,基本稳。12GB 显卡可以尝试 q5_K_M,或者上 14B 模型的 q4。24GB 显卡就比较自由,7B 直接 fp16,或者 32B 模型 q4 也可以跑。
容易被忽略的是 W8A8 这类量化格式。权重和激活都量化成 INT8,能利用硬件的 INT8 加速单元,在部分 GPU 上推理速度比同体积的常规 GGUF 量化要快。DeepSeek-R1-Distill 系列里有专门的 w8a8 版本,这类模型对部署场景更友好,尤其是批量生成需求比较高的工程。
不过 Ollama 官方仓库不一定收录每种 w8a8 变体。如果你的需求很明确,建议去 HF 镜像下载对应的 GGUF 文件,再手动导入。这样可以精确控制要做哪种量化,而不是被默认标签限制。
3.3 CherryStudio 这类客户端怎么和 Ollama 对接
本地模型只有后端还不够,日常用起来还是希望有界面、会话管理、多轮记忆。我目前在用的 CherryStudio 可以直接对接 Ollama,配置起来不用写代码。
步骤非常简单:
- 确保 Ollama 服务在跑,
ollama serve或让它后台自动运行。 - 打开 CherryStudio,进入“设置”里的“模型服务”。
- 新增一个 Provider,类型选 Ollama,API 地址填
http://127.0.0.1:11434。 - 在模型列表里填上本地已有的模型名,比如
qwen2.5:7b。 - 保存后新建会话,选择这个模型,直接对话。
这样做的价值在于,对话记录都存在于客户端本地,模型完全离线,数据安全可控。如果是团队使用,还可以把OLLAMA_HOST改成局域网 IP,让团队成员共享同一台服务器。但要注意:Ollama 的鉴权很弱,基本是裸奔状态,公网部署必须加网关或认证,否则很容易被任意调用。
4. transformers 深度实践:加载、推理与显存控制
4.1 三行代码加载量化模型
transformers 更适合研究型实验,比如想测试原始 safetensors 权重在 4bit 下的效果,或者想看模型不同层的输出分布。加载一个 7B 指令模型并做量化推理的代码模板如下:
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig import torch bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, ) model = AutoModelForCausalLM.from_pretrained( "Qwen/Qwen2.5-7B-Instruct", quantization_config=bnb_config, device_map="auto", torch_dtype=torch.float16, ) tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")生成时记得加torch.no_grad(),能省不少显存:
prompt = "用一句话解释什么是量化。" messages = [{"role": "user", "content": prompt}] text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) with torch.no_grad(): inputs = tokenizer(text, return_tensors="pt").to("cuda") outputs = model.generate(**inputs, max_new_tokens=256, do_sample=True, temperature=0.7) print(tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True))这段代码跑 7B q4,8GB 显存也能带得动,但速度偏慢。如果显存不够,device_map="auto"会自动把一部分层切到 CPU,用时间换空间。要注意的是,CPU offload 的层如果太多,速度可能低到不可用,还是尽量让模型主体留在 GPU 上。
4.2 显存占用到底怎么算
很多人在这一步吃亏,装完模型一跑就 OOM。显存占用可以拆成三块:模型权重、KV cache、激活值。权重最容易算,FP16 每个参数占 2 字节,4bit 每个参数占 0.5 字节。7B 模型 fp16 约 14GB,4bit 约 3.8GB 到 4.7GB。
KV cache 是生成时的“工作记忆”,它的大小和模型结构、上下文长度强相关。粗略公式是:2(K 和 V 两组 tensor)× 层数 × 每个 token 的 KV 参数数量 × 上下文长度。以 Llama 3 8B 为例,8k 上下文大概需要 1GB 左右,16k 就是 2GB,增长几乎是线性的,所以很多人说上下文比模型本身更吃显存,并不是夸张。
激活值在长序列下也不可小看,尤其是用 attention 的序列长度比较大时。如果显存持续吃紧,我最常用的几招:
- 减小上下文长度:8k 改 4k,KV cache 直接减半。
- 控制
max_new_tokens:默认太长,手动设成 512 或 1024,能避免生成阶段持续占用大块显存。 - 把
num_beams设成 1:beam search 的显存开销几乎随 beam 数线性增长,不是必要场景别开。 - 推理前执行
torch.cuda.empty_cache(),有时显存碎片化不会自动释放,清理一下能救回来一点余量。
4.3 在量化基础上微调:QLoRA 快速上手指南
本地部署到一定阶段,你会发现需要让模型懂一点自己的业务数据。直接全量微调 7B 模型需要至少 40GB 显存,对绝大多数人来说不现实。更实际的路子是 QLoRA:把基座模型固定在 4bit 量化态,冻结所有原参数,只训练一小批注入的低秩 adapter。
我在 16GB 显存的卡上跑过 Qwen2.5-7B 的 QLoRA 微调,经验是 4bit 量化加 LoRA rank=8,大概需要 14GB 到 15GB 显存,非常勉强。把 rank 降到 4 能更宽裕一些。数据格式必须和模型原生的 chat template 对齐,否则微调后对话反而变傻,这是最隐蔽的坑。
最小微调代码片段:
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training model = prepare_model_for_kbit_training(model) lora_config = LoraConfig( r=8, lora_alpha=16, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", ) model = get_peft_model(model, lora_config)注意,这里只展示 adapter 构建,实际训练还需要数据加载、优化器配置、保存合并权重等步骤。我的建议是:微调完把 adapter 合并回原始模型,再走 GGUF 转换。这样整个部署链路统一到 GGUF 格式,后续喂给 Ollama 或 llama.cpp 都很顺。
5. llama.cpp 实战:CPU 也能跑,GGUF 量化随心控
5.1 从 transformers 权重转换成 GGUF 并量化
当你手里只有 HuggingFace 原版权重,或者想把微调后的模型部署到没有 Python 环境的机器上,llama.cpp 就是答案。
先把工具编译出来。Linux/macOS 下直接:
git clone https://github.com/ggml-org/llama.cpp cd llama.cpp cmake -B build cmake --build build --config ReleaseWindows 用户可以用 CMake + MSVC 编译,也可以直接去 GitHub Release 页面下载预编译的二进制文件,省去编译时间。
然后准备一份原版权重,用官方脚本转成 GGUF:
python convert_hf_to_gguf.py /path/to/Qwen2.5-7B-Instruct --outfile qwen2.5-7b-f16.gguf --outtype f16接着量化。量化档位非常多,我常用的有这几个:
| 档位 | 平均每权重占位 | 特点 |
|---|---|---|
| q2_K | 2bit | 体积小但质量明显下降,只适合低资源应急 |
| q4_K_M | 4bit | 甜点档,质量和体积平衡最好 |
| q5_K_M | 5bit | 质量更稳,体积略大 |
| q6_K | 6bit | 接近原版水平,显存要求中等 |
| q8_0 | 8bit | 几乎无损,体积已经和 fp16 差别不大 |
一条量化命令:
./llama-quantize qwen2.5-7b-f16.gguf qwen2.5-7b-q4_K_M.gguf q4_K_M这一步就是把 f16 模型按 q4_K_M 档位量化。其实 Ollama 官网很多现成的模型就是从这一步来的,只是别人替你跑完了。如果你不在乎转换过程,直接去 HF 镜像下载别人转好的 GGUF 文件,能省不少事。
5.2 内存预算、GPU offload 与运行参数
推理命令的常用参数我拆解一下:
./llama-cli -m qwen2.5-7b-q4_K_M.gguf \ -p "你好,向我介绍你自己" \ -n 512 \ -t 8 \ -c 8192 \ -ngl 35-m指定模型文件;-p是提示词;-n是最多生成的 token 数;-t是 CPU 线程数,建议设为核心数的一半到全量之间,设太高反而可能因为调度开销下降;-c是上下文长度,直接影响 KV cache 大小;-ngl决定把多少层放到 GPU,0 表示纯 CPU 推理,显存允许就尽量多放,剩余层留在 CPU。
内存预算的经验公式是:7B q4 权重约 4.7GB,8k 上下文的 KV cache 约 1GB,合计 6GB 左右。如果机器只有 8GB 内存,跑起来会非常紧张;16GB 内存就能流畅些;32GB 内存就相当舒服了。纯 CPU 场景下,7B q4 的生成速度主要受内存带宽限制,笔记本大概每秒 3 到 6 个 token,桌面高频内存能到 8 到 10 个 token,虽然不快,但作为离线私有服务够用。
llama.cpp 还提供llama-server子命令,能启动一个 OpenAI 兼容的 HTTP 服务:
./llama-server -m qwen2.5-7b-q4_K_M.gguf -c 8192 --host 0.0.0.0 --port 8080启动后,CherryStudio 这类工具也能直接把它当标准 API 使用。相比 Ollama,这种方式更底层、可控性更强,适合想精细调度每个层和参数的场景。
6. 常见问题速查与坑点实录
6.1 Ollama 下载太慢或断连
现象很典型:执行ollama pull后,进度条卡在某个百分比不动,或者提示pull model manifest: context deadline exceeded。
我的排查顺序:
- 先确认磁盘剩余空间足够大。下载前至少要预留模型体积两倍的空间,因为临时文件和解压文件同时存在。
- 如果下载源不理想,直接放弃官方拉取,改用 HF 国内镜像下载 GGUF,然后本地导入。
- Windows 上还要注意安全软件拦截大文件写入,给 Ollama 的模型目录加白名单能避免很多莫名中断。
- 网络环境波动时,可以换个时间段再试,大文件下载经常是晚上更顺畅。
6.2 transformers 和 CUDA 版本打架
最常见报错是CUDA error: no kernel image is available for execution on the device,或者加载新架构模型时出现KeyError、model_type不支持。前者多半是 PyTorch 的 CUDA 版本比驱动支持的版本高,要么升级驱动,要么降级 PyTorch 到匹配版本。后者基本是 transformers 太老,识别不了新模型。遇到这种问题,先pip install -U transformers,同时升级到推荐版本的 PyTorch,绝大多数情况都能解决。
6.3 显存不足和 OOM
OOM 分两种:加载模型时爆,生成时爆。加载阶段爆显存,就把device_map设成"auto",让部分层跑到 CPU;或者换更小的量化档位,比如 q5 降 q4。生成阶段爆,先减max_new_tokens,再减上下文长度,再把num_beams设成 1,这三招几乎百试百灵。平时建议开着nvidia-smi -l 1监控显存变化,早知道早处理,别等报错了才回头查。
6.4 Win7 老环境还能不能玩本地大模型
热词里有“ollama win7”,这里明确说:Ollama 官方最低支持 Windows 10 1809 以上,Win7 装不了。如果只有 Win7 老机器,更现实的路子是去 llama.cpp 的 Release 页面下载 Windows 版二进制,直接跑 GGUF 模型。老显卡驱动对新卡支持差,干脆纯 CPU 跑 7B q4 的小模型,当个离线问答工具还是可行的。
6.5 量化后模型突然“变傻”
如果量化后模型输出的逻辑混乱、数学计算错误明显,大概率是量化档位压得太狠。q2_K 在极端低资源下才考虑,数学、代码这类任务基本不可用。我的建议是至少用 q4_K_M,涉及代码或数学直接上 q5_K_M。另外,手动转换时也要注意 embedding 和 lm_head 这些敏感层,llama.cpp 默认会保留这些层为较高精度,不要强行量化。
结尾
最后分享一点我自己总结的做事习惯。新模型到手,不要上来就压最低量化档去测试,先拿 fp16 或 q8 验证模型本身的能力,再逐步降档找到质量掉点明显的临界值,这样出了问题能分清是模型的锅还是量化的锅。日常部署我用 Ollama,但会把模型来源、量化参数、Modelfile 全部记录到项目文档里,团队里任何一台机器都能复现出一样的服务。资源紧张时优先砍上下文长度,不要优先砍量化精度,KV cache 占的显存往往比想象中大得多。本地大模型这条路,工具熟悉之后拼的就是这些细节,希望这篇能让你少走一些弯路。