去年团队决定把核心AI能力从云端迁回本地,理由很朴素:数据不能出去,成本扛不住了。选型时对比了vLLM、llama.cpp、text-generation-inference,最后留下了Ollama。原因不是它性能最强,而是运维成本最低——一行命令装完,自带API服务,兼容OpenAI格式,连SDK都不用改。

这篇文章把整个部署过程整理出来,从环境准备到生产调优,踩过的坑都写在里面了。

为什么要在本地跑大模型

先说结论:不是所有场景都适合本地部署。如果你每天的调用量在几千次以下,直接用API更省心。但以下几种情况,本地部署几乎是唯一选择:

数据隐私是第一驱动力。金融、医疗、法律这些行业的数据不能离开公司网络,这是合规红线,没有商量余地。我之前服务的一家保险公司,他们的核保数据连内部邮件都不能传,更别说调第三方API了;

成本控制在高频场景下效果显著。以7B模型为例,OpenAI的GPT-4o-mini每百万token大约0.15美元,如果你每天处理1000万token就是1.5美元/天。本地部署的边际成本只有电费,一台RTX 4090满载功耗约450W,一天电费大概3块钱人民币,但可以处理远超1000万token的量;

离线和弱网环境在国内其实很常见。偏远地区的工厂、移动作业车、安全管控区域,网络不稳定甚至完全没有外网,本地部署是刚需;

定制自由是很多技术团队选择本地的核心原因。你可以换模型、调参数、做微调、接入内部系统,不受任何平台限制。这种自由度在API服务商那里是买不到的;

硬件选型

部署前先评估一下你的硬件够不够用。这里给一个实用的参考表:

内存需求和模型参数量直接挂钩。7B模型加载到内存大约需要8-14GB(取决于量化方式);13B需要16-28GB;32B需要32-64GB;70B需要64-140GB。如果只用CPU推理,内存要翻倍,因为还需要额外空间做计算缓存;

显卡方面,NVIDIA是首选,CUDA生态最成熟。显存8GB能跑7B模型的Q4量化;16GB能跑13B的Q4量化或7B的FP16;24GB(RTX 4090)能跑32B的Q4量化。AMD显卡也能用,但支持不如NVIDIA成熟,可能会遇到一些兼容性问题;

存储方面,模型文件从几百MB到几十GB不等。建议用SSD,模型加载速度差距很明显。一个7B的Q4量化模型大约4GB,70B的Q4大约40GB;

安装过程

Linux(推荐)

一行命令搞定:

curl -fsSL https://ollama.com/install.sh | sh

这个脚本做了几件事:检测系统架构(x86_64还是ARM)、下载Ollama二进制文件到/usr/local/bin/、创建systemd服务并设置开机自启、配置模型存储目录在/usr/share/ollama/.ollama/;

装完后可以用systemctl status ollama检查服务状态,journalctl -u ollama -f看日志;

macOS

两种方式:官网下载dmg安装包,或者用Homebrew:

brew install ollama

macOS上Ollama会利用Apple Silicon的Metal加速,M1/M2/M3芯片跑大模型的体验其实不错。M3 Max跑7B模型的速度接近入门级NVIDIA显卡。

Windows

官网下载安装程序,双击运行即可。安装完成后Ollama驻留在系统托盘,右键可以查看日志和重启服务;

Windows上有个常见问题:防火墙会阻止Ollama的11434端口。如果其他机器连不上你的Ollama服务,检查一下防火墙规则;

下载和运行模型

# 下载并运行模型(首次运行会自动下载)
ollama run deepseek-r1:7b

# 只下载不运行
ollama pull qwen2.5:7b

# 查看已下载的模型
ollama list

模型推荐方面,说几个我实际用过的感受。DeepSeek-R1系列的推理能力很强,适合需要逻辑推理的场景,比如数学计算、代码分析。但它的中文输出有时会夹杂英文,需要注意。Qwen2.5系列中文能力是我用过的开源模型里最好的,语感自然,几乎没有翻译腔。Llama3.3系列英文能力一流,社区生态最丰富,但中文比Qwen差一截。CodeLlama专门针对代码优化,如果你的场景主要是代码生成和审查,它的性价比最高。

对外提供API

Ollama最实用的特性之一就是内置了OpenAI兼容的API。这意味着你已有的OpenAI SDK代码,只需要改一行base_url就能直接用;

# 原生API
curl http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:7b",
  "prompt": "解释一下什么是PagedAttention",
  "stream": false
}'

# OpenAI兼容格式
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-r1:7b",
    "messages": [{"role": "user", "content": "解释一下什么是PagedAttention"}]
  }'

Python代码几乎零修改迁移:

from openai import OpenAI

# 原来用OpenAI的代码,只改这一行
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"
)

response = client.chat.completions.create(
    model="deepseek-r1:7b",
    messages=[
        {"role": "system", "content": "你是一个专业的技术写作助手"},
        {"role": "user", "content": "帮我写一个Redis连接池的封装"}
    ]
)

性能调优

并发处理是生产环境的刚需。Ollama默认串行处理请求,一个请求处理完才接下一个。要支持并发,设置环境变量:

# 方法1:环境变量
export OLLAMA_NUM_PARALLEL=4
ollama serve

# 方法2:systemd服务文件中添加
# /etc/systemd/system/ollama.service
[Service]
Environment="OLLAMA_NUM_PARALLEL=4"

注意:并发数不是越大越好,每个并发请求都需要显存/内存,设太高会OOM。7B模型在24GB显存的卡上,建议并发2-4;

KV Cache管理方面,OLLAMA_KV_CACHE_TYPE可以设置KV Cache的精度。设为f16精度最高但显存占用大,设为q8_0显存减半精度略有损失。大多数场景下q8_0完全够用;

模型预加载可以避免首次请求的冷启动。在服务启动时预加载常用模型:

# 在systemd的ExecStartPost中添加
ollama run deepseek-r1:7b --keepalive 24h

这样模型会常驻内存,首次请求不需要等待加载。

踩坑记录

模型下载慢是国内用户的普遍痛点。Ollama的模型仓库在国内没有镜像,直接下载速度经常只有几十KB/s。解决办法是用代理,或者从HuggingFace下载GGUF格式的模型文件,然后用Modelfile导入Ollama;

显存碎片化是长时间运行后容易遇到的问题。频繁加载卸载不同模型会导致显存碎片,最终即使显存总量够用也会OOM。定期重启Ollama服务可以解决,或者用OLLAMA_MAX_LOADED_MODELS限制同时驻留的模型数量;

跨机器访问不通多半是防火墙或绑定地址的问题。Ollama默认只监听127.0.0.1,要让其他机器访问需要设置OLLAMA_HOST=0.0.0.0

写在最后

Ollama不是性能最强的本地推理方案,但它是性价比最高的。如果你的目标是"在本地跑起来、对外提供API、能用就行",Ollama就是最短路径。等业务跑通了、量上来了,再考虑迁移到vLLM也不迟。