ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

本地大模型部署实战:Ollama、llama.cpp与transformers全解析

本地大模型部署实战:Ollama、llama.cpp与transformers全解析 先讲一个我前几天遇到的场景。有位朋友兴冲冲跟我说他按某篇教程跑ollama run qwen2.5:7b结果等了十分钟只吐出来几个字显卡风扇倒是转得跟起飞一样。我问他你什么显卡他说GTX 16606GB显存。这个案例几乎概括了所有本地大模型萌新的第一个认知差能装下模型和能流畅跑模型是两码事。要让大模型在消费级显卡上真正可用核心不在于下载一个多大的模型文件而在于你是否理解显存占用模型、量化如何参与计算、推理引擎在背后替你做了哪些决策。这篇内容准备把Ollama、transformers、llama.cpp这三条本地部署路径完整走一遍。它们不是替代关系而是分别服务于不同的人群Ollama 适合随手起一个服务、快速验证llama.cpp 适合在有限硬件上把性能压榨到极致同时把量化等级、上下文窗口、算子调度全部握在自己手里transformers 则是研究者、微调玩家、以及需要写 Python 代码深度控制模型行为的首选。三个工具配合起来可以覆盖从下载模型、量化、推理、微调到对外开放 API 的完整链路。这篇文章会告诉你每一步背后的原理、我实测过的参数、以及那些踩完才明白的坑。1. 本地部署前必须算清的账显存、量化与预期管理1.1 一张显卡到底能跑多大模型先学会估算显存先说结论能不能跑一个模型不只看模型文件多大而要看推理过程中显存峰值有多高。模型推理的显存占用主要由三部分构成权重本身、KV cache键值缓存、以及激活值activations。权重是最容易估算的部分。假设一个 7B 参数模型用 FP16半精度每个参数占 2 字节加载那么权重大约是7 × 10^9 × 2 / 1024^3 ≈ 13.1GB。也就是说一张 16GB 显存的显卡理论上只够塞下 FP16 的 7B 模型而且这还没算 KV cache 和激活值所以 16GB 跑 7B FP16 实际会非常勉强。换成 4-bit 量化之后每个参数约占 0.5 字节权重直接压缩到 3.5GB 左右立刻就能在 8GB 甚至 6GB 的显卡上运行。这就是量化在本地部署中价值最直观的体现。我自己的经验是本地部署前先做一道简单的算术题可用显存 - 系统/驱动预留约500MB~1GB 模型可用的真实显存然后根据目标模型参数量和量化精度对照权重大小 × 1.15 ~ 1.3的经验系数多出来的部分就是 KV cache 和激活值的预估判断你的显卡属于完全跑不动勉强能跑但速度感人还是顺畅运行。这一步做好后面能省很多来回折腾的时间。1.2 FP16、INT8、INT4量化到底在做什么量化本质上是在做一件事用更少的比特去近似一个浮点数代价是精度损失收益是更小的显存占用和更快的访存速度。大模型的权重经过训练后数值分布通常集中在某个较小的区间内并且带有一定的冗余这给量化提供了空间。常见的量化格式需要区分清楚格式精度显存占用7B模型约应用场景FP1616bit约14GB精度优先有富余显存时使用INT8 / W8A88bit约7GB速度和精度均衡INT4 / W4A164bit约4GB消费级显卡主力选择GGUF Q4_K_M4bit 混合约4.4GBllama.cpp / Ollama 常用W8A8 和 W4A16 是两个容易被忽视的概念。W 指权重WeightA 指激活Activation。W8A8 表示权重和激活都用 8bit推理速度更快但量化难度高W4A16 是权重用 4bit、激活保留 16bit精度损失小且实现简单目前 GGUF 主力量化大多是这种思路。AWQ、GPTQ 则属于另一种量化路线它们和 GGUF 的区别可以简单理解成GPTQ/AWQ 用的是离线校准数据集来寻找最优量化参数适合用 transformers 这类框架加载GGUF 是 llama.cpp 生态的格式兼容性最好Ollama 直接吃 GGUF。1.3 为什么把 Ollama、transformers、llama.cpp 放在一起讲三个工具我都在生产环境里用过它们各自解决的问题并不相同。llama.cpp是底层引擎用 C/C 实现针对 CPU、Apple Silicon、NVIDIA GPU 都做了优化它定义了 GGUF 格式是在有限硬件上跑模型这件事做得最极致的一个。Ollama则是在 llama.cpp 之上包了一层更友好的壳把模型管理、API 服务、命令行交互统一起来解决了我要以最快速度把模型跑起来对外提供服务的需求但对内部参数的暴露有限。transformers则是 Hugging Face 生态的核心库它是 Python 世界里加载、推理、微调大模型的工业标准灵活性最高代价是上手门槛和资源开销也最高。对普通用户来说三者可以这样定位Ollama 负责跑起来llama.cpp 负责榨干性能transformers 负责深度定制与训练。但三者不是孤立的比如我经常把 Hugging Face 上的模型转换成 GGUF 后喂给 Ollama 用也会用 transformers 做微调实验再把微调产物转给 llama.cpp 做推理部署。接下来的内容就按这条链路逐个拆开讲。2. Ollama五分钟跑通全流程但别忽略它的边界2.1 安装与首次启动看起来简单里面藏着几个关键设置Ollama 的安装确实简单官方提供了 Windows、macOS、Linux 的安装包装完即用。但真正影响使用体验的往往是安装之后的几个环境变量。第一个是模型存储路径。Windows 下默认装到 C 盘而大模型动辄几个 GBC 盘很快就会被塞满。我习惯把模型文件迁移到其他盘做法是新建一个OLLAMA_MODELS环境变量指向专门存放模型的目录比如D:\ollama\models然后重启 Ollama。Linux 下同理export OLLAMA_MODELS/data/ollama/models可以写进~/.bashrc。macOS 由于应用沙箱机制环境变量需要在launchctl setenv OLLAMA_MODELS /path/to/models里设置每次开机后要重新执行或者做成 LaunchAgent。第二个是服务监听地址。默认 Ollama 只监听127.0.0.1需要远程访问时设置OLLAMA_HOST0.0.0.0即可。这个变量在 Docker 部署场景尤其重要我见过不少人因为在容器里没设置它导致宿主机始终连不上 11434 端口。第三个是模型下载慢的问题。很多人卡在ollama pull这一步进度条跟蜗牛一样。这个问题的根源是默认模型仓库服务器位于海外网络链路不佳。解决思路是配置镜像源加速把OLLAMA_HOST相关的镜像地址写到环境变量里具体的镜像地址各社区都有维护建议选择延迟低的那个。这里提一句部分网上的镜像源会失效如果你配置后发现依然很慢可以用curl测试一下镜像仓库连通性和回源速度再决定是否换一个。不要把大量时间耗在反复重试同一个不稳定的源上。2.2 从拉模型到跑模型一条命令背后的工程细节Ollama 的核心命令只有几条ollama list查看本地已有模型ollama pull拉取模型ollama run启动交互对话ollama rm删除模型。一次完整的启动过程是这样的# 拉取 Qwen2.5 7B 指令微调版 ollama pull qwen2.5:7b # 启动交互式对话 ollama run qwen2.5:7b跑起来之后你会看到 Ollama 默认分配了很大的上下文窗口通常是 2048 或更高不同版本策略不同并且会自动把可用的 GPU 层数加载到显存里。这里有个值得留意的现象如果你看到模型部分层跑在 CPU、部分跑在 GPU说明显存已经不够了Ollama 在做 layer offload 的权衡。此时提升性能的思路不是去调整 Ollama 的隐藏参数它暴露出来的参数很有限而是换一个量化更低的模型版本或者改用 llama.cpp 手动指定层数。Ollama 还支持通过 Modelfile 定制模型行为比如修改温度、系统提示词、上下文长度。一个典型的 Modelfile 长这样FROM qwen2.5:7b PARAMETER temperature 0.7 PARAMETER num_ctx 8192 SYSTEM You are a helpful coding assistant.然后用ollama create my-qwen -f Modelfile生成一个新模型。这个机制很适合团队内部统一模型配置。2.3 Ollama 的 API 与生态对接它不只是命令行玩具Ollama 真正让我愿意长期使用的原因是它的 API 设计足够简单。启动服务后http://127.0.0.1:11434/api/generate和http://127.0.0.1:11434/api/chat提供了流式与非流式的接口并且从 0.1.x 版本开始兼容 OpenAI 的/v1/chat/completions格式。这意味着如果你原本对接的是 OpenAI SDK只需要把base_url改成http://127.0.0.1:11434/v1再把 API key 填一个任意值代码就可以直接跑通。from openai import OpenAI client OpenAI( base_urlhttp://127.0.0.1:11434/v1, api_keyollama ) resp client.chat.completions.create( modelqwen2.5:7b, messages[{role: user, content: 用一句话解释量化}] ) print(resp.choices[0].message.content)我在本地做知识库类工具时也经常用 Ollama 配合 embedding 模型。比如拉一个bge-m3或nomic-embed-text然后通过 API 获取向量再接上向量数据库。目前不少第三方客户端比如 Cherry Studio 这类可视化工具也原生支持对接 Ollama安装后填上服务地址就能直接当 ChatGPT 客户端用这类组合非常适合没有编程经验的用户。2.4 什么时候该换掉 OllamaOllama 的缺点是它把大量细节封装掉了。这意味着当你遇到以下场景时它就不够用了你需要精确控制 GPU 层数、线程数、KV cache 量化方式Ollama 提供的参数很有限新增的OLLAMA_KV_CACHE_TYPE这类环境变量也只是部分控制。你想研究不同量化级别对生成质量的实际影响Ollama 只能选择别人已经量化好的现成 GGUF无法自己从 HF 模型做转换与对比。你需要在同一模型上用不同上下文长度反复做 benchmarkOllama 会在加载策略上做很多智能但不可控的决策。遇到这些情况往底层走一步就到了 llama.cpp 的领域。3. llama.cpp把每一兆显存都计算在内的量化实践3.1 为什么 llama.cpp 能跑出更低的显存占用llama.cpp 的核心思路是把一切能控制的参数都暴露给你同时针对不同硬件做极致优化。它的显存占用之所以能比很多框架更低主要有几个原因一是它自带的 GGUF 格式内嵌了分词器、超参数、量化权重模型加载后不需要额外维护一套 Python 运行时和 CUDA 上下文显著节省了内存开销。二是它支持--no-mmap、--mlock这些内存策略能控制模型文件是否直接映射到内存、是否需要锁定物理内存防止被换出。三是它支持-ngl参数num_gpu_layers让你手动指定把多少层放到 GPU而不是自动判断。对于显存吃紧的场景这种精细控制非常重要。我用一张 8GB 显卡做过对比同一个 Qwen2.5 7B 模型Ollama 默认启动后显存占用约 7.5GB接近极限用 llama.cpp 把层数手动调整到 30/32 层并将上下文窗口压到 4096显存占用可以控制在 5.8GB 左右剩余空间足够给系统和其他程序使用整个系统不会因为显存打满而出现窗口卡死。3.2 标准量化流程从 Hugging Face 到 GGUF要自己量化模型核心工具是 llama.cpp 仓库里的convert_hf_to_gguf.py脚本。流程如下# 1. 克隆 llama.cpp 并安装依赖 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp pip install -r requirements.txt # 2. 从 Hugging Face 下载原始模型以 Qwen2.5-7B-Instruct 为例 git lfs install git clone https://huggingface.co/Qwen/Qwen2.5-7B-Instruct # 3. 转换成 f16 的 GGUF 文件 python convert_hf_to_gguf.py Qwen2.5-7B-Instruct --outfile qwen2.5-7b-f16.gguf --outtype f16 # 4. 执行 k-quant 量化 ./build/bin/llama-quantize qwen2.5-7b-f16.gguf qwen2.5-7b-q4_k_m.gguf q4_k_m这里的q4_k_m是量化级别的名字。K-quant 系列是 llama.cpp 引入的一组混合量化策略它会对模型的不同部分采用不同的量化位数注意力机制中的关键部分保留更高精度普通前馈层用更激进的压缩。常见的几个级别如下量化级别特点7B 模型大小约q2_k极端压缩质量损失明显约 2.8GBq3_k_m质量开始可用约 3.3GBq4_k_m平衡之选本地部署主力约 4.4GBq5_k_m质量接近原版约 5.1GBq8_0高质量显存许可选它约 7.2GB我日常用得最多的是q4_k_m它的特点是速度快、显存占用可控生成质量在大多数任务上感知不到和原版的差距。但如果跑代码生成、数学推理这类对精度敏感的任务我会升到q5_k_m多消耗 1GB 显存换更稳定的正确率这笔交易是划算的。3.3 推理参数实测ctx、threads、ngl、mmap 的真实影响llama.cpp 编译好后通过llama-cli旧版本叫main来跑模型。我先给一个常用的完整命令再逐项解释参数含义./build/bin/llama-cli \ -m qwen2.5-7b-q4_k_m.gguf \ -n 512 \ --ctx-size 8192 \ --threads 8 \ -ngl 32 \ --temp 0.7 \ --repeat-penalty 1.1 \ -p 写一份Python快速排序代码--ctx-size是上下文长度。很多人忽略了这个参数对显存的影响。KV cache 的显存占用是层数 × 注意力头数 × 头维度 × 上下文长度 × 字节数一个 7B 模型在 8K 上下文下的 KV cache 大约需要 1~2GB在 32K 上下文下可能直接吃掉 6GB 以上。所以上下文长度不能盲目调大必须在模型能力与硬件资源之间找平衡。--threads控制 CPU 线程数。对纯 CPU 推理这个参数几乎直接决定速度但要注意超线程hyper-threading场景下并不是线程越多越好我实测很多机器用物理核心数反而更快。对 GPU 推理线程数影响相对较小因为主要计算都在 GPU 上。-ngl是 GPU 层数。这个参数最值得花时间调。显存够用时全部层都塞进 GPU-ngl 32假设模型共 32 层。显存不够时我一般用二分法试比如 24 层、20 层、16 层观察显存占用和生成速度的拐点。有一次我在 6GB 显卡上跑 13B 模型-ngl 20时生成速度还有 8 tokens/s降到-ngl 12时直接掉到 2 tokens/s因为大量层在 CPU 和 GPU 之间频繁搬运数据瓶颈立刻显现。--no-mmap与--mlock是容易被忽略的内存策略。默认 mmap 模式下模型文件直接从磁盘映射到内存优点是加载快、启动快缺点是内存不足时可能被系统换出。--mlock强制锁定物理内存适合追求稳定延迟的服务器部署场景。3.4 不得不说的坑K-quant 格式、旧格式与上下文窗口显存波动llama.cpp 的坑主要集中在历史版本兼容上。早期 GGML 时代的q4_0、q4_1格式现在已经被 K-quant 系列取代但网上仍然有大量教程引用的老格式模型文件。如果你下载的模型文件名里只有q4_0而没有k它大概率是旧格式尽早换成新版本重新量化质量差距在复杂任务上很明显。另一个常见坑是上下文窗口导致的显存波动。很多人用llama-server启动服务后看到初始显存占用不高就以为安全了结果请求一多、上下文一长直接 OOM显存溢出。原因就是 KV cache 是随实际生成的 token 逐渐增长的而不是一次性分配好。解决方法是提前在启动参数里规定好--ctx-size的上限让服务按最大值预分配或者明确告诉自己在什么并发下会触发瓶颈。4. transformers PyTorch开发者的精细调校现场4.1 环境配置里最容易翻车的环节如果说 Ollama 是即插即用的懒人方案transformers 就是需要自己动手装修的精装房。环境配置本身不算难但有几个细节经常翻车。第一个是 CUDA 版本和 PyTorch 的匹配。很多人装完 PyTorch 之后发现torch.cuda.is_available()返回 False排查半天发现是 PyTorch 的 CUDA 运行时和驱动不匹配。我的建议是先看nvidia-smi右上角的 CUDA Version那个是驱动支持的最高版本PyTorch 安装时只要求驱动版本足够新即可不要求完全一致。比如你的驱动支持 CUDA 12.4那么装pip install torch --index-url https://download.pytorch.org/whl/cu124或更高版本都可以。报错信息里如果出现NVIDIA-SMI has failed之类的字样问题基本都出在驱动上而不是 PyTorch 上。第二个是 transformers 和 tokenizers 的版本锁定。常见场景是各种第三方库依赖的 transformers 版本冲突如果你装了 4.4x 版本的 transformers有些老项目可能因为 API 变化直接报错。我习惯用虚拟环境隔离开并把 transformers、accelerate、torch 的版本号写进 requirements 文件里避免能用和能复现之间有巨大鸿沟。第三个是显存不足时的环境变量设置。transformers 在 4.20 之后对显存管理做了一些改进但如果你遇到 CUDA OOM可以先试试设置CUDA_VISIBLE_DEVICES0强制指定显卡再配合torch.cuda.set_per_process_memory_fraction(0.9)限制 PyTorch 的显存使用上限避免某个进程把显存吃满导致其他程序崩溃。4.2 用 load_in_4bit / load_in_8bit 加载量化模型在 transformers 里做量化最直接的入口是BitsAndBytesConfig。它可以在加载模型时自动把权重量化到 4-bit 或 8-bit并且把量化后的权重分散加载到 GPU 和 CPU 上。一个标准的 4-bit 加载代码如下from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig import torch quant_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.float16, bnb_4bit_use_double_quantTrue, ) model AutoModelForCausalLM.from_pretrained( Qwen/Qwen2.5-7B-Instruct, quantization_configquant_config, device_mapauto, ) tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2.5-7B-Instruct)这里几个参数值得解释一下。bnb_4bit_quant_type有fp4和nf4两种选择nf4 是 bitsandbytes 专为 LLM 设计的归一化浮点数格式精度保留比 fp4 更好默认选它就对了。bnb_4bit_compute_dtype是计算时用的精度这里设成torch.float16意思是权重存储在 4-bit但参与矩阵乘法时会反量化到 FP16 计算。这样做的原因是 GPU 的 FP16 算力远高于 INT4 算力直接让 4-bit 权重参与计算反而不划算这件事也解释了为什么模型文件是 4GB但显存占用却不只是 4GB。device_mapauto让 accelerate 自动决定每层放哪里显存小的时候它会自动把部分层放在 CPU 上。如果生成的模型跑得太慢可以改成device_map{: 0}强制全部放 GPU前提是显存够用。4.3 结合 LoRA 做本地微调量化不是终点transformers 生态最核心的能力不是推理而是微调。如果你是学术研究者或者需要让模型适配特定领域那量化加载只是第一步接下来大概率要接 LoRA。LoRA 的思路是冻结原模型权重只训练一小部分低秩矩阵这跟量化并不冲突可以先 4-bit 量化加载原模型再用 LoRA 在量化后的模型上做训练这种组合被称为 QLoRA。我在本地方言翻译任务上试过一次训练参数量从 7B 缩小到约 2000 万单张 12GB 显卡就能跑完整个训练流程。大致的流程是from peft import LoraConfig, get_peft_model lora_config LoraConfig( r16, lora_alpha32, target_modules[q_proj, k_proj, v_proj, o_proj], lora_dropout0.05, ) model get_peft_model(model, lora_config) # 然后正常用 Trainer 训练训练完成后LoRA 适配器只有几十到几百 MB可以单独保存推理时动态加载。这种做法非常适合同一个底座模型多个领域适配器的生产架构底座不动每个业务一个适配器切换成本极低。4.4 与部署工具的配合transformers 管实验、llama.cpp 管上线很多人在 transformers 里调好了模型却不知道如何高效上线。我的建议是transformers 只负责实验和验证正式部署用 GGUF llama.cpp 或者 Ollama。原因在于transformers 加载模型时依赖 Python 环境和 GPU 内存管理策略在并发、热加载、多模型切换方面做得不够极致而且如果你是用 Web 服务的方式封装每次启动加载模型都要几秒钟甚至几分钟资源浪费很大。把模型转成 GGUF 后llama.cpp 的 server 模式可以提供 OpenAI 兼容的 API启动速度快模型切换更灵活还天然支持流式输出。所以在我的工作流中transformers 做微调和量化验证llama.cpp 做最终性能调优Ollama 做对外交付。三者不是互斥选项而是由实验到产线的流水线关系。5. 一条连贯的落地链路量化、转换、部署与质量校验5.1 从 HF 模型到 GGUF 再到 Ollama我常用的标准流水线如果说前面的内容偏工具讲解这一节是一条完整的实操流水线可以直接照搬。整体链路是Hugging Face 原始模型 → 转换 GGUF → 用 llama.cpp 量化 → 验证效果 → 生成 Ollama Modelfile → 布到 Ollama 服务里。第一步到第三步在上文已经详细写过了转换和量化的命令可以直接复用。验证效果时我会先用llama-cli跑几个固定测试用例包括代码生成、文本摘要、多轮对话观察输出质量和生成速度确认量化级别合适后再往 Ollama 迁移。把 GGUF 导入 Ollama 的方式有两种。一种是把 GGUF 文件放进Ollama/models/blobs目录再手动创建 manifest这种方式容易被目录结构变化影响不推荐。更稳妥的方式是用 Modelfile 从 GGUF 创建FROM ./qwen2.5-7b-q4_k_m.gguf PARAMETER temperature 0.7 PARAMETER num_ctx 8192 TEMPLATE {{- if .System }}|im_start|system {{ .System }}|im_end| {{ end }}|im_start|user {{ .Prompt }}|im_end| |im_start|assistant 然后执行ollama create qwen2.5-7b-local -f Modelfile这样ollama run qwen2.5-7b-local就能直接使用你亲手量化的模型。这里的 TEMPLATE 就是 ChatML 模板不同模型的聊天模板不一样如果没写对对话时模型可能会把 system 提示当普通文本回复。5.2 量化后模型的精度与速度验证方法量化完成后不能只看文件大小就认为大功告成。我总结了一套轻量级的验证方案不需要复杂的评测集几分钟就能知道量化是否可接受。精度验证上我会准备三组固定问题一组数学计算题如计算 1.8 乘以 4.2 再减 3.5一组中文知识问答考察常识表述是否稳定一组代码任务如写一个读取 CSV 文件并计算平均值的 Python 函数。把原模型和量化模型放在一起对比重点检查数值型任务答案是否一致、逻辑型任务是否出现语法崩溃、多轮对话是否有重复或断层。如果你的任务类型更垂直最好准备业务侧的真实 prompt 来做回归。速度验证上看两个指标tokens/s和首 token 延迟。llama.cpp 的--verbose会输出详细性能统计llama-bench工具也可以自动做 benchmark。这里放一组我在 RTX 3060 12GB 上的实测数据供参考模型量化上下文生成速度Qwen2.5-7Bq4_k_m4096约 55 tokens/sQwen2.5-7Bq8_04096约 45 tokens/sQwen2.5-13Bq4_k_m4096约 25 tokens/s需要注意的是速度测试结果跟 CUDA 版本、llama.cpp 编译时的优化标志比如是否开启 CUDA Graph都有关系不用追求极致的参数记录自己的基线方便后续调整时对比即可。5.3 显存不足时的降级策略就算做了量化依然有可能在 4GB、6GB 这类显卡上翻车。我按优先级整理过一套降级策略供参考降低上下文长度。这是成本最低的方式。把 8192 改成 4096KV cache 直接少一半如果任务用不到长上下文这是最佳选择。换更低一级的量化。比如从 q5_k_m 降到 q4_k_m显存节省约 1GB质量损失在多数场景可感知但不致命。从 q4_k_m 降到 q3_k_m 就要谨慎了回答质量下降非常明显。减少 GPU 层数让更多层跑在 CPU 上。这个方式可以运行但速度会断崖式下降只适合不需要实时响应的批量任务。换更小的模型。比如 7B 换成 3B、1.5B。这是最伤筋动骨的降级方式但总比跑不起来好。从跑得动到跑得好中间需要大量像这样的小幅调整每一档调整都是一次权衡。5.4 API 安全与并发经验本地部署模型虽然是在内网运行但不代表不需要考虑安全问题。我在对外开放 Ollama 或 llama.cpp 服务时通常会做三件事一是设置监听地址和访问控制。如果只需要本机使用保持默认127.0.0.1即可。如果需要局域网内其他设备访问最好在防火墙层面限制来源 IP而不是简单地把监听地址改成0.0.0.0。二是加一层反向代理做鉴权比如用 nginx 转发到 Ollama 端口并在 nginx 层加 API Key 校验这样即使端口暴露了没有 key 也无法调用。三是设置并发上限。本地 GPU 的并发能力远不如云端 API我遇到过多个客户端同时请求导致显存溢出的情况解决办法是限制进程级并发比如 Ollama 的OLLAMA_NUM_PARALLEL环境变量或者 nginx 层的limit_req。6. 实测下来我建议你这样选择工具组合三个工具都深度用过之后我的选择逻辑基本稳定下来了最后分享给你。如果你是纯本地用户电脑上想装个 AI 助手不愿意写代码直接从Ollama开始找一个量化好的 7B 或 8B 模型配合 Cherry Studio 这类客户端体验已经足够好。你的关注点应该是选什么模型而不是纠结底层参数。如果你是开发人员需要集成到自己的服务里同时有相对固定的硬件首选llama.cpp。它的llama-server提供了兼容 OpenAI 的 API性能上限高参数可控排错路径清晰。前期多花一点时间编译和调参后面部署和运维会轻松很多。如果你是做研究或者模型微调transformers是绕不开的主战场。量化加载、LoRA 微调、评估实验、数据集的构造这些能力在 transformers 生态里最成熟。当你要把成果部署上线时再转成 GGUF 交给 llama.cpp 托管。三个工具之间的关系我习惯用一条流水线来理解transformers 负责把模型调好llama.cpp 负责把模型跑顺Ollama 负责把模型交出去。它们不冲突而是一层层递进的关系。最后再分享一个小技巧无论你选择哪条路径把每次实验的模型版本、量化级别、上下文长度、实测速度记下来。我在本地目录里建了一个简单的 CSV 表每次调参后更新一行时间久了你会发现自己对这些模型的理解完全不一样了——从听说它能跑变成我明确知道它在我的硬件上能跑多快、回答成什么样。这种掌控感才是本地部署大模型真正让人上瘾的地方。
返回列表