2026 年聊本地部署,绕不开的一个名字仍然是 Ollama。它把“下载模型、装运行环境、启动服务、调用 API”这一整套流程压缩到了几条命令里,是目前个人电脑上跑开源大模型最直接的入口。以前想本地体验 DeepSeek、Qwen、Llama 这类模型,往往要先折腾 Python 环境、CUDA 版本、模型权重转换,很多人还没开始跑模型就先被环境劝退了。Ollama 解决的就是这个最后一公里问题。
这篇教程不做空泛的理论铺垫,直接按真实使用顺序展开:先讲 Ollama 的核心能力、硬件门槛和适用边界;然后依次完成下载安装、模型目录修改、模型拉取、命令行对话、API 调用和批量任务测试;最后给出资源占用观察方法和一张高频问题排查表。零基础可以完全顺着走一遍,已经装过 Ollama 但没玩明白的同学,可以重点看第四、七、八、九节。
全文实验不依赖顶级显卡。只要有一台能联网的电脑,可以先从 CPU 推理的小尺寸模型开始,跑通了再考虑 GPU 加速。关于显存占用、GPU 是否加载、响应速度这些观察,都会给出具体查看方法,不会让你对着黑窗口瞎猜。
1. Ollama 核心能力速览
| 维度 | 说明 |
|---|---|
| 项目类型 | 本地大模型运行与管理工具,开源 |
| 核心功能 | 模型拉取、命令行对话、后台服务、HTTP API、模型包管理 |
| 默认服务端口 | 11434 |
| 支持平台 | Windows、Linux、macOS |
| 启动方式 | 安装后自动后台运行,也可用ollama serve前台启动 |
| 推理硬件 | CPU 可运行;NVIDIA/AMD 显卡与 Apple Silicon 会尝试调用 GPU 加速 |
| 是否支持 API | 支持,REST API 默认开放于 11434 端口 |
| 上层生态 | Open WebUI、Dify、AnythingLLM、各类 OpenAI 兼容客户端均可对接 |
| 硬件门槛 | 门槛较低,小尺寸模型 CPU 也能跑,大模型才需要大显存 |
| 适合场景 | 本地模型体验、学习大模型应用开发、隐私敏感数据处理、接口联调 |
这里重点说清楚一件事:Ollama 本身不是模型,它是一个“模型运行时 + 模型管理工具”。它负责把模型权重下载下来、加载进内存或显存、提供命令行交互和 HTTP 接口。你向它提问,它负责推理;你换模型,只需要换一个名称和参数,不用重新搭环境。这恰恰是大模型应用开发最需要的基础能力。
2. Ollama 适用场景与使用边界
2.1 适合谁用
本地部署 Ollama 的第一类用户是 AI 应用开发者和学习大模型应用开发的人。他们不想每写一个 Demo 就调用云端付费 API,也不希望在调试提示词时反复等待网络请求,Ollama 提供了一个本地 API,完全兼容 REST 调用思路,方便和 Python、Node.js 等后端代码集成。
第二类用户是数据敏感场景的技术人员。把模型跑在本机,文本内容不需要上传到外部服务,不存在“数据经过云端接口”的链路。在涉及内部代码、个人文档或保密实验数据时,本地推理是一个值得考虑的方案。
第三类用户是普通大模型爱好者。不管有没有 NVIDIA 显卡,都可以先拉一个 7B 或 8B 级别的小模型,在命令行里体验开源模型能力。低成本做一轮横向对比后,再决定是否升级硬件。
2.2 不适合什么场景
Ollama 不适合直接承担高并发生产服务。它没有内置完整的用户鉴权、限流、多租户隔离等能力,单机场景下并发能力也很有限。如果目标是给几百上千用户提供在线对话服务,需要把它放在应用层之后,做网关、负载均衡和推理集群。
Ollama 也不适合那些必须要最大参数规模模型的场景。CPU 推理会明显偏慢,显卡显存不足时模型加载会失败或者退回 CPU。想舒服地跑 70B 级别模型,需要几十 GB 显存或内存,这已经超出了普通家用电脑的接受范围。
2.3 合规与安全边界
本地部署不意味着可以随意使用模型和素材。下载开源模型前,建议确认模型自身许可证是否允许商用、是否有附加条款。如果要把模型接入外部工具或开放给局域网访问,必须确认接入方的服务条款和数据安全要求。涉及他人代码、隐私文本、人脸声音等素材时,需要提前获得授权,不能因为模型在本机运行就忽视版权和隐私边界。
3. 环境准备与前置条件
Ollama 的安装本身并不复杂,但环境检查做得好,后面能省很多排查时间。建议按下面的顺序逐项确认。
3.1 操作系统和终端
Ollama 官方支持 Windows、Linux、macOS。Windows 用户推荐 Windows 10/11 的 64 位系统,终端可以用 cmd、PowerShell 或 Windows Terminal;Linux 用户建议使用常见发行版并确保 curl、tar 等基础工具存在;macOS 用户需要注意芯片型号,Apple Silicon 和 Intel 在 GPU 加速上有差异,性能表现以实际为准。
3.2 显卡驱动和 CUDA 检查
如果你用的是 NVIDIA 显卡,可以先打开终端执行:
nvidia-smi能正常输出显卡型号和驱动版本,说明 NVIDIA 驱动可被系统识别。nvidia-smi输出中的“Memory-Usage”就是实时显存占用,后面观察 Ollama 推理时的显存变化会经常用到。
如果执行nvidia-smi提示找不到命令,需要先安装或更新 NVIDIA 显卡驱动。新一代显卡用户特别注意版本跨度问题,驱动太老可能不被新版本 PyTorch 或推理程序识别。AMD 显卡和 Apple Silicon 用户不一定需要nvidia-smi,可以查看“关于本机-图形卡”或系统设备管理器来确定硬件型号。
3.3 磁盘空间和模型目录规划
模型文件体积比较可观。一个常见的中等尺寸开源模型,下载后可能占用 4GB 到 10GB 甚至更多。建议在安装 Ollama 之前先规划好一个空间充足的磁盘目录,尤其是 Windows 用户,系统盘往往比较紧张。
假设你想把模型存到 D 盘,可以在系统环境变量中新建:
OLLAMA_MODELS=D:\ollama_models这是一个预先减少麻烦的操作。虽然安装后再改也能生效,但已经下载好的模型需要手动迁移,不如一开始就设置好。
3.4 可选:Docker 环境
如果本机已经熟悉 Docker,也可以直接用容器方式运行 Ollama。这对之后的换机迁移和隔离测试更方便。但如果你只是想快速体验,不必先装 Docker,官方桌面安装包是最省事的路径。
3.5 端口检查
Ollama 默认监听 11434 端口。如果本机有其他服务占用了这个端口,启动后访问会出现异常。可以先检查:
netstat -ano | findstr 11434Linux/macOS 可以换用:
ss -lntp | grep 11434如果端口被占用,优先释放占用进程,或者修改 Ollama 监听地址。
4. Ollama 下载安装与服务启动
4.1 官方安装包安装
Ollama 官网提供了各平台安装包。下载后按照普通软件流程安装即可。Windows 用户也可以尝试使用 winget:
winget install Ollama.Ollama如果 winget 搜索不到,不要纠结命令方式,直接去官网下载安装包更可靠。macOS 用户下载对应.zip文件解压即可。Linux 用户更推荐在终端安装,常见方式是执行官方安装脚本:
curl -fsSL https://ollama.com/install.sh | sh对一条命令管道交给sh执行不放心,可以先下载脚本文件,检查后手动执行。执行完成后,安装脚本通常会尝试把 Ollama 注册成后台服务。
4.2 修改模型存储目录到 D 盘
Windows 用户如果希望把模型装到 D 盘而不是系统盘,建议在第一次拉取模型前就完成环境变量配置。具体步骤如下:
- 右键“此电脑”,进入“属性”。
- 点击“高级系统设置”。
- 打开“环境变量”。
- 在用户变量或系统变量中点击“新建”。
- 变量名填
OLLAMA_MODELS。 - 变量值填一个实际存在的目录,例如
D:\ollama_models。 - 保存后关闭所有终端窗口,再重新打开。
注意,环境变量修改后需要重启正在运行的服务或重新打开终端,否则不会生效。Linux/macOS 可以在 shell 配置文件中设置同样的变量:
export OLLAMA_MODELS="/data/ollama_models"设置完可以先执行ollama list,再确认模型目录是否已经切换。
4.3 验证服务是否启动
安装完成后,Ollama 通常会自动在后台运行。浏览器访问:
http://127.0.0.1:11434如果页面返回类似Ollama is running的文本,说明服务正常。如果不方便打开浏览器,也可以在终端执行:
ollama list没有报错且能看到空列表或已有模型列表,代表服务可用。若提示“connection refused”,说明服务没起来,手动启动前台服务:
ollama serve前台运行会占用当前终端,适合用来观察日志。一旦确认服务正常,可以再回到后台模式使用。
4.4 Docker 方式启动
已经把 Docker 作为主力环境的同学,可以用镜像启动,省去本地环境变量配置的麻烦。以下是一个容器启动模板:
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama这个命令把模型数据存放在名为ollama的 Docker 卷中,并将容器 11434 端口映射到宿主机。接下来拉取模型时可以进入容器执行:
docker exec -it ollama ollama run deepseek-r1:7b如果这些命令因为镜像源或网络原因失败,请先确认本机网络情况,再回到桌面安装方式。
4.5 下载慢的常规处理思路
很多初学者卡在模型下载环节。如果你在拉取模型时一直卡进度条或频繁超时,首先不要反复删掉进程重试,Ollama 通常会从断点继续。其次是考虑网络环境差异:可以尝试错峰下载、切换更稳定的网络,或者检查是否需要配置国内可访问的镜像源。Ollama 支持通过环境变量切换模型下载源,例如OLLAMA_BASE_URL,但不同镜像源地址更新频繁,使用时请以对应镜像服务的文档为准,不要盲目照抄旧帖。
5. 模型下载与命令行实战
5.1 选一个适合起步的模型
Ollama 模型命名规则是“模型名:标签”。标签通常表示参数量或量化版本,例如deepseek-r1:7b、qwen2.5:7b这类。具体有哪些可用模型,以 Ollama 模型库页面为准。第一次尝试,建议选 7B/8B 级别的模型,CPU 运行压力小,下载体积也相对可控。
不是所有模型都叫“最新最强”,也不是显存越大就一定跑得越快。对零基础用户来说,先用小模型跑通整条链路,比直接挑战大模型更重要。
5.2 拉取模型
打开终端执行:
ollama pull deepseek-r1:7b首次拉取会显示进度条。因为模型体积通常有几个 GB,下载时间取决于网速。下载过程中不要强制关闭窗口,耐心等待。
已下载的模型可以在终端里输入:
ollama list看到 NAME、ID、SIZE、MODIFIED 等列,就说明本地已经有可用模型了。
5.3 启动命令行对话
拉取完成后,直接执行:
ollama run deepseek-r1:7b第一次运行会加载模型,可能等待几秒到几十秒,在终端出现提示符后就可以输入问题。例如输入:
用三句话介绍你自己模型回答后,可以继续追问,实现多轮对话。输入/bye退出会话。如果忘了有哪些指令,输入/help查看。
Windows 的 cmd 下如果中文显示乱码,可以先执行:
chcp 65001把代码页切到 UTF-8,再启动对话。
5.4 一次性文本输入
除了交互模式,Ollama 也支持通过管道传入单轮文本。这种方式在 Linux/macOS 终端和脚本测试中比较常用:
echo "用一句话解释什么是 HTTP" | ollama run deepseek-r1:7bWindows PowerShell 的管道处理中文可能需要注意编码,也可以直接用交互模式或者后面的 Python API 调用。
5.5 理解模型加载状态
运行模型时,可以打开另一个终端执行:
ollama ps这个命令会列出当前加载进内存或显存的模型。能看到模型名、进程 ID、模型大小和处理器类型。当 Ollama 服务空闲一段时间后,模型可能被自动释放,ollama ps就不再显示对应条目。
6. Ollama 功能测试与效果验证
6.1 基础能力测试
模型能跑起来后,建议做一轮基础功能验证,不要只问一次“你是谁”就结束。推荐用几个固定问题测试不同方向:
- 中文理解:“给我解释一下‘塞翁失马’这个故事的含义,控制在 100 字以内。”
- 代码生成:“用 Python 写一个函数,判断一个字符串是否为回文,并解释思路。”
- 结构化输出:“把下面这段话概括成三条要点,用 Markdown 列表输出。”
- 长文本稳定性:“连续写 500 字的产品介绍,内容围绕开源社区协作工具。”
判断模型是否好用的标准不是每句话都完美,而是回答是否通顺、是否围绕主题、是否能输出指定格式。如果你让模型生成 Python 代码,建议把代码复制到本地 Python 环境实际跑一遍,这是验证代码类能力最可靠的方法。
6.2 多轮对话能力测试
在ollama run交互模式中连续提问,观察模型是否记住上下文。例如先问:
帮我给一只柴犬取名字,要三个候选。它给出候选后,再问:
从里面选一个最符合“活泼”这个性格的名字。如果它能从前一轮候选里选择,说明上下文窗口工作正常;如果答非所问,可能触发了上下文长度限制,也可能是模型本身小、理解能力有限。
6.3 批量问题验证
交互模式下一个个输入问题比较慢。想快速验证模型在一组问题上的表现,可以写一个简单的 Python 脚本,循环请求 Ollama API。这个脚本对后续大模型应用开发也有直接参考价值,先放在这里用:
import requests import time questions = [ "1+1等于几?只回答数字。", "用一句话解释什么是 API。", "用 Python 写一个快速排序函数,越短越好。", "把'Ollama is running'翻译成中文。", ] for i, question in enumerate(questions, start=1): response = requests.post( "http://127.0.0.1:11434/api/chat", json={ "model": "deepseek-r1:7b", "messages": [{"role": "user", "content": question}], "stream": False, }, timeout=120, ) if response.status_code == 200: result = response.json() print(f"[问题{i}] {question}") print(f"[回答] {result['message']['content']}") else: print(f"[问题{i}] 请求失败: {response.status_code}") time.sleep(1)运行这个脚本前,保证 Ollama 服务已经启动,且本机已安装了 Python 和requests库。没有requests可以在终端执行pip install requests。
7. Ollama 接口 API 与批量任务
7.1 为什么 API 很关键
命令行适合人工测试,但真正的价值在于调用 API。本地大模型一旦通过 HTTP 接口暴露出来,就可以接到 Python 脚本、Node.js 服务、Open WebUI、Dify 工作流以及其他 AI 编程工具里。这也是从“能用一个模型”到“能做一次大模型应用开发”的分水岭。
7.2 检查服务与本地模型列表
先用 curl 确认服务可以访问。在终端执行:
curl http://127.0.0.1:11434正常情况下会返回服务标识文本。接着查看本地已经拉取过的模型:
curl http://127.0.0.1:11434/api/tags返回结果是 JSON,包含已下载模型的名称、模型 ID、大小和修改时间。这一步可以确认 API 调用路径正确。
7.3 对话接口调用示例
使用/api/chat接口发送对话请求:
curl http://127.0.0.1:11434/api/chat -d "{\"model\":\"deepseek-r1:7b\",\"messages\":[{\"role\":\"user\",\"content\":\"用一句话解释什么是Ollama\"}],\"stream\":false}"在 Windows cmd 里直接写 JSON 转义比较痛苦,建议直接用下面的 Python 请求。Python 在构造 JSON 时天然可读:
import requests payload = { "model": "deepseek-r1:7b", "messages": [ {"role": "user", "content": "用 Python 写一个读取本地文本文件并统计词频的脚本"} ], "stream": False, } response = requests.post( "http://127.0.0.1:11434/api/chat", json=payload, timeout=120, ) data = response.json() print(data["message"]["content"])stream: False表示等完整回复生成后再返回,适合第一次调通接口。流式输出可以减少等待,但对编码和解析的要求更高,前期测试先关闭流式更稳妥。
如果请求失败,先检查返回的具体错误信息。例如模型名写错会提示 manifest 不存在;模型正在加载时请求会较慢;超时则可能需要调大timeout参数。
7.4 生成接口调用示例
如果只想做单轮文本补全,不关心多轮消息结构,也可以使用生成接口:
import requests response = requests.post( "http://127.0.0.1:11434/api/generate", json={ "model": "deepseek-r1:7b", "prompt": "写一句欢迎语,欢迎开发者学习本地大模型部署。", "stream": False, }, timeout=120, ) print(response.json()["response"])这个接口适合简单测试,日常更推荐使用带messages结构的对话接口,因为它更直观地表达多轮上下文。
7.5 OpenAI 兼容端点与上层工具接入
Ollama 还提供了一个 OpenAI 兼容端点,地址是:
http://127.0.0.1:11434/v1很多编程工具和开源框架默认支持 OpenAI 协议,只需要把 base URL 改成这个地址,再把模型名改成你本地已下载的模型即可。例如使用 Python 的openai库:
from openai import OpenAI client = OpenAI( base_url="http://127.0.0.1:11434/v1", api_key="ollama", # 本地服务不校验真实key,但字段必须存在 ) completion = client.chat.completions.create( model="deepseek-r1:7b", messages=[{"role": "user", "content": "你好,介绍一下你自己"}], ) print(completion.choices[0].message.content)这个思路非常重要。当前很多终端编程助手或命令行的 AI 工具都支持类似配置,你把 base URL 指向 Ollama 后,上层工具就可以调用本地模型。具体到某个工具,例如 Opencode 或带 Skill 机制的编辑器插件,它们的字段名可能不同,有的通过OPENAI_BASE_URL环境变量读取,有的写在配置文件中,安装哪个版本、用哪个参数,建议以该工具的官方 README 为准。本文的价值是帮你先把模型服务跑起来,剩下的对接本质上是换一个客户端。
7.6 批量任务设计
批量任务最怕的不是满不慢,而是失败后不知道断在哪里。推荐写一个带日志、计数和延迟的批量脚本。以下是一个可参考的模板:
import requests import time import json questions = [ "Python 中 list 和 tuple 的区别是什么?", "写一段代码删除列表中的重复元素。", "解释一下 Git 的 rebase 和 merge 区别。", ] output_file = "inference_results.jsonl" model_name = "deepseek-r1:7b" success_count = 0 fail_count = 0 for index, question in enumerate(questions, start=1): try: response = requests.post( "http://127.0.0.1:11434/api/chat", json={ "model": model_name, "messages": [{"role": "user", "content": question}], "stream": False, }, timeout=150, ) if response.status_code != 200: fail_count += 1 with open(output_file, "a", encoding="utf-8") as f: f.write(json.dumps({"index": index, "error": response.text}, ensure_ascii=False) + "\n") continue answer = response.json()["message"]["content"] with open(output_file, "a", encoding="utf-8") as f: f.write(json.dumps({"index": index, "question": question, "answer": answer}, ensure_ascii=False) + "\n") success_count += 1 print(f"[完成] {index}/{len(questions)}") except Exception as exc: fail_count += 1 print(f"[失败] {index}, 原因: {exc}") time.sleep(1) print(f"统计:成功 {success_count} 条,失败 {fail_count} 条") print(f"结果已写入 {output_file}")批量任务注意三点:第一,不要太快地连续请求小模型,避免触发资源峰值;第二,每条请求之间保留轻微间隔;第三,每条结果单独写入日志文件,避免程序中断后全部结果丢失。能断点续跑比一次跑完更重要。
8. 资源占用与性能观察
8.1 如何观察显存和内存占用
观察 Ollama 资源占用,最直接的工具是ollama ps。它会告诉你模型当前是否已加载、使用多大体积、主要跑在 CPU 还是 GPU 上。
如果你想看显卡实时利用率,在终端执行nvidia-smi,观察 Ollama 相关进程的显存占用。Windows 的任务管理器也能看到 GPU 显存曲线,但有时多个进程共享显存不易区分,还是nvidia-smi更清楚。
8.2 CPU 推理和 GPU 推理的差异
同一台机器上,CPU 推理和 GPU 推理的差别非常大。7B 级别的小模型在 CPU 上也能生成回答,但速度会明显慢于显卡加载的情况。在ollama ps的 PROCESSOR 列可以看到到底使用了 CPU 还是 GPU。如果你的显卡没有参与推理但机器有独立显卡,通常要先更新驱动,然后重启 Ollama 服务,再重新pull一个模型并测试。
8.3 上下文长度对资源的影响
模型加载后占用的资源并不是固定不变的,上下文越长,占用的显存和内存越高。如果发现模型能加载但生成一段时间后速度下降,往往是上下文缓存增长导致资源不足。通过 API 调用时,可以在请求中临时指定上下文长度参数。实际上你可以创建一个 Modelfile 来固定运行参数:
FROM deepseek-r1:7b PARAMETER num_ctx 2048然后执行:
ollama create my-model -f Modelfilenum_ctx设置得越小,显存压力越小,但能记住的对话内容也越少。在实际项目中需要根据场景权衡,没有固定答案。
8.4 降低资源占用的常见方法
如果资源紧张,优先做四件事:换小参数模型、换量化更低的版本、缩短上下文长度、避免同时加载多个模型。不要一边在浏览器开着大模型对话页面,一边又用脚本批量请求,这会让内存和显存都被叠满。每次只运行一个实验任务,能显著降低报错概率。
9. Ollama 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
ollama list提示 connection refused | Ollama 服务未启动 | 检查服务进程与日志 | 执行ollama serve启动或重启服务 |
| 模型下载速度很慢或卡住 | 网络波动或源不稳定 | 观察进度条是否还在变化 | 重新执行ollama pull,必要时配置镜像源或错峰下载 |
ollama run提示 manifest not found | 模型名或 tag 写错 | 用ollama list查看本地模型 | 到模型库确认正确名称后重新运行 |
| 模型已经下载但响应速度极慢 | CPU 模式运行或模型被反复加载 | 执行ollama ps查看处理器 | 更新显卡驱动或使用更小模型 |
| GPU 显存不增长 | 驱动不兼容或 Ollama 未识别 GPU | 执行nvidia-smi确认显卡 | 更新驱动、重启服务,必要时升级 Ollama |
| 页面或终端中文乱码 | 终端编码不是 UTF-8 | 查看系统代码页 | Windows 执行chcp 65001后重开窗口 |
| API 请求超时 | 模型首次加载耗时过长或负载过高 | 检查ollama ps和日志 | 增加请求 timeout;先手动ollama run预热一次 |
| 11434 端口被占用 | 其他程序占用端口 | 使用 netstat 排查端口 | 修改OLLAMA_HOST为其他端口 |
| 修改模型路径后不生效 | 环境变量未刷新或服务未重启 | 检查ollama list是否有原模型 | 重启 Ollama 或重启终端 |
排查时记住一个思路:先看服务在不在,再看模型在不在,最后看请求参数对不对。绝大多数新手问题都集中在这三层中的第一层和第二层,尤其要留意终端窗口没有刷新导致新环境变量没生效。
10. 从 Ollama 到大模型应用开发
跑通命令行和 API 后,你已经拥有一个本地模型服务。接下来往应用层面走,通常会经历三个阶段。
10.1 用代码把本地模型封装成助手
写一个 Python 模块,把模型对话这一动作封装成函数。这样业务代码里不会到处出现 HTTP 细节,后续要替换成云端模型服务时只需要改配置。核心思路很简单,就是把模型名、请求地址、超时时间这些参数抽出来。
import requests class LocalLLMClient: def __init__(self, base_url="http://127.0.0.1:11434", model="deepseek-r1:7b"): self.base_url = base_url self.model = model def chat(self, user_message: str) -> str: response = requests.post( f"{self.base_url}/api/chat", json={ "model": self.model, "messages": [{"role": "user", "content": user_message}], "stream": False, }, timeout=120, ) response.raise_for_status() return response.json()["message"]["content"] if __name__ == "__main__": client = LocalLLMClient() print(client.chat("你好,请用一句话介绍本地大模型"))这类封装是入门大模型应用开发非常自然的一步。以后你可以在类里扩展history参数来维护上下文,也可以加入超时重试和日志记录。
10.2 接可视化界面和 AI 开发工具
本地模型通过 API 暴露后,Open WebUI、Dify、AnythingLLM 这类