Ollama 本地 CPU 部署开源大模型实战
Ollama 是一个用于在本地运行大型语言模型的开源工具,支持在 CPU 环境下高效推理。它基于 llama.cpp 实现,兼容 OpenAI API 接口,使得开发者可以方便地在本地部署如 Llama3、Gemma、Phi3、Qwen2 等开源模型。
本文介绍了 Ollama 在本地 CPU 环境下部署开源大模型的方法。内容包括系统安装与配置、常用命令行操作、Python 官方 SDK 与 OpenAI 兼容接口的调用方式,以及在 Jupyter Notebook 中自定义魔法命令实现多轮对话的技术细节。此外,还涵盖了性能调优、安全配置及常见问题的排查指南,帮助开发者高效利用本地算力运行 Llama3、Qwen2 等模型。

Ollama 是一个用于在本地运行大型语言模型的开源工具,支持在 CPU 环境下高效推理。它基于 llama.cpp 实现,兼容 OpenAI API 接口,使得开发者可以方便地在本地部署如 Llama3、Gemma、Phi3、Qwen2 等开源模型。
本文将详细介绍 Ollama 的安装、命令行交互、Python 接口调用以及 Jupyter Notebook 中的魔法命令集成,并提供最佳实践建议。
Ollama 支持 macOS、Linux 和 Windows 操作系统。用户可以直接从官网下载对应平台的安装包进行安装。
对于容器化环境,也可以使用 Docker 运行:
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
安装完成后,在终端输入以下命令检查版本:
ollama --version
Ollama 提供了丰富的 CLI 命令来管理模型和服务。
| 命令 | 描述 |
|---|---|
ollama run <model> | 运行指定模型,若未下载则自动拉取 |
ollama pull <model> | 从仓库拉取模型到本地 |
ollama list | 查看已下载的模型列表 |
ollama rm <model> | 删除指定的模型 |
ollama serve | 启动服务进程(通常安装后自动后台运行) |
ollama help | 查看所有可用命令及参数 |
示例:
# 下载并运行 Qwen2 模型
ollama run qwen2
# 下载 Llama3 模型
ollama pull llama3
# 查看本地模型
ollama list
通过命令行直接运行模型,可以快速测试对话效果。Ollama 默认监听 11434 端口,并在后台提供服务。
ollama run qwen2
> 你好,请介绍一下你自己。
> 我是一个人工智能助手...
此模式适合快速验证模型能力,但不适合程序化集成。
Ollama 支持两种 Python 交互方式:官方 SDK 和 OpenAI 兼容接口。这使得现有的 AI 应用可以轻松迁移到本地模型。
首先安装依赖:
pip install ollama
代码示例:
import ollama
response = ollama.chat(
model='qwen2',
messages=[{
'role': 'user',
'content': '请赏析这段文字:我已经不是那个当年的穷小子了,我是今年的那个穷小子。'
}]
)
print(response['message']['content'])
Ollama 模拟了 OpenAI Chat Completions API,允许使用 openai 库连接本地服务。
from openai import OpenAI
client = OpenAI(
base_url='http://localhost:11434/v1/',
api_key='ollama' # 本地部署无需真实 Key
)
completion = client.chat.completions.create(
model='qwen2',
messages=[{
'role': 'user',
'content': '爱一个人的眼神是藏不住的,爱两个人就一定要藏住。'
}],
stream=True
)
for chunk in completion:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end='', flush=True)
错误处理建议: 在实际开发中,应增加异常捕获机制以应对网络波动或服务不可用情况:
try:
response = ollama.chat(model='qwen2', messages=[...])
except Exception as e:
print(f"请求失败:{e}")
在 Jupyter 环境中,可以通过自定义魔法命令实现多轮对话上下文管理,提升调试效率。
以下代码定义了一个 Ollama 类,支持自动维护对话历史:
import sys
from IPython.core.magic import magics_class, line_cell_magic
from IPython.display import display, clear_output
from openai import OpenAI
class Ollama:
def __init__(self, model='qwen2', max_chat_rounds=20, stream=True):
self.model = model
self.history = []
self.max_chat_rounds = max_chat_rounds
self.stream = stream
self.register_magic()
def build_messages(self, query=None, history=None, system=None):
messages = []
if system:
messages.append({'role': 'system', 'content': system})
for prompt, response in (history or []):
messages.extend([{'role': 'user', 'content': prompt},
{'role': 'assistant', 'content': response}])
if query:
messages.append({'role': 'user', 'content': query})
return messages
def chat(self, messages, stream=True):
client = OpenAI(base_url='http://localhost:11434/v1/', api_key='ollama')
return client.chat.completions.create(messages=messages, model=self.model, stream=stream)
def __call__(self, query):
if len(self.history) >= self.max_chat_rounds + 1:
self.history = self.history[-self.max_chat_rounds:]
messages = self.build_messages(query=query, history=self.history)
if not self.stream:
completion = self.chat(messages, stream=False)
response = completion.choices[0].message.content
self.history.append((query, response))
return response
completion = self.chat(messages, stream=True)
response = ""
for chunk in completion:
content = chunk.choices[0].delta.content
if content:
response += content
clear_output(wait=True)
print(response)
self.history.append((query, response))
return response
def register_magic(self):
from IPython.core.magic import Magics, magics_class, line_cell_magic
@magics_class
class ChatMagics(Magics):
def __init__(self, shell, pipe):
super().__init__(shell)
self.pipe = pipe
@line_cell_magic
def chat(self, line, cell=None):
if cell is None:
return self.pipe(line)
else:
return self.pipe(cell)
ipython = get_ipython()
magic = ChatMagics(ipython, self)
ipython.register_magics(magic)
初始化后,即可在 Notebook 中使用 %chat 魔法命令:
%chat 你好,我们来聊聊编程。
该实现会自动将当前对话加入上下文,支持多轮交流,直到达到最大轮数限制。
OLLAMA_NUM_THREADS 调整 CPU 推理线程数,避免占用过多资源。num_ctx 参数,平衡长文本处理能力与响应速度。pull 至本地。Ollama 为本地运行开源大模型提供了便捷方案,尤其适合 CPU 环境下的开发与测试。通过 Python 接口和 Jupyter 集成,开发者可以灵活构建 AI 应用原型。结合 Modelfile 自定义配置,还能进一步优化模型行为以满足特定业务需求。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online