1. 本地跑大模型这件事,我试了三年才摸清门道

你有没有过这种体验:在网页上跟一个大模型聊得正起劲,突然卡住、转圈、提示“服务繁忙”?或者想做个私密的合同分析工具,却不敢把敏感内容传到云端?又或者只是单纯想搞明白——那些动辄几十GB的模型文件,到底在我自己电脑里是怎么“活”起来的?这事儿我从2021年Llama刚开源那会儿就开始折腾,中间换过三台主机、重装过七次系统、踩过GPU驱动不兼容、模型加载失败、Python调用超时、内存爆满杀进程等无数坑。直到去年把Ollama稳定跑在一台i7+32GB+RTX4090的台式机上,才真正体会到什么叫“模型在手,天下我有”。它不是什么玄学黑箱,而是一套可触摸、可调试、可定制的本地AI工作流。核心就三件事: 模型怎么装、怎么跑、怎么连 。Ollama就是那个把这三件事拧成一股绳的“螺丝刀”——它不造模型,但让所有主流开源模型(Llama 3、Phi-3、Qwen、Gemma、DeepSeek-Coder)在你本地像App一样即点即用;它不写代码,但给你留出最干净的Python接口,让你能把它嵌进任何脚本、Web服务甚至Excel宏里。这篇文章不讲虚的,不堆概念,只说我在真实项目里每天都在用的操作:从Windows/Mac/Linux三平台安装的细节差异,到为什么 ollama run llama3 docker run -p 11434:11434 ... 更省心;从Python里用 requests 直连和用 ollama-python 库的区别,到如何绕过SSL证书错误、处理流式响应、给模型加角色设定。如果你已经装过一次Ollama但卡在“连不上”或“返回空”,或者正犹豫该不该在自己电脑上跑模型——这篇就是为你写的。它不承诺“一键起飞”,但保证每一步你都能看清背后发生了什么。

2. Ollama设计思路与方案选型深度拆解

2.1 为什么是Ollama,而不是Docker、LM Studio或Text Generation WebUI?

很多人第一次接触本地大模型,第一反应是“Docker不香吗?”。确实,Hugging Face的 transformers + accelerate 组合能跑几乎所有模型,但代价是什么?我列个真实对比表:

方案 安装复杂度 模型管理 GPU利用率 Python集成难度 新手友好度
Ollama ⭐⭐(双击安装包/一行命令) ⭐⭐⭐⭐⭐( ollama list / pull / rm 全命令行) ⭐⭐⭐⭐(自动检测CUDA/cuDNN,支持ROCm) ⭐⭐⭐⭐(原生HTTP API, requests 5行搞定) ⭐⭐⭐⭐⭐(无Python环境依赖)
Docker + transformers ⭐(需配Dockerfile、环境变量、GPU驱动映射) ⭐⭐(手动下载GGUF、改配置、挂载路径) ⭐⭐⭐(需显式指定 --gpus all ,常因驱动版本错配失败) ⭐⭐(需 pip install 一堆依赖,版本冲突高发) ⭐⭐(报错信息全是英文堆栈)
LM Studio ⭐⭐⭐(GUI安装,但Win/Mac路径权限常出问题) ⭐⭐⭐(界面点选,但模型更新需手动下载) ⭐⭐⭐(GUI层抽象导致GPU显存占用不透明) ⭐(无官方Python SDK,只能模拟HTTP请求) ⭐⭐⭐⭐(适合纯试玩)
Text Generation WebUI ⭐⭐⭐⭐(启动前要解决 bitsandbytes 编译、 xformers 兼容性) ⭐⭐⭐(插件多但配置项爆炸) ⭐⭐⭐⭐(对A100/H100优化好,但消费级显卡常掉帧) ⭐⭐(需 curl 或自写客户端) ⭐⭐(适合调参老手)

Ollama胜在“ 做减法 ”。它不试图成为万能框架,而是精准切中三个痛点: 模型分发太重、运行环境太杂、调用接口太散 。它的核心设计哲学是“ CLI first, API native ”——命令行是唯一入口,所有功能都通过 ollama 这个二进制暴露;HTTP API是默认伴生品,端口固定为 11434 ,协议极简(POST /api/chat ,JSON入,JSON出)。这意味着什么?意味着你不用管Python虚拟环境里装了几个 torch 版本,不用纠结 cuda==12.1 还是 12.2 ,甚至不用装Python——只要你的系统有 curl ,就能调用模型。我去年帮一家律所部署合同审查工具,客户IT部门明确拒绝安装任何Python环境,最后就是靠Ollama+PowerShell脚本+Excel VBA调用 Invoke-RestMethod 搞定的。Ollama的二进制是静态链接的,Windows上是 .exe ,Mac上是 .dmg 里的 ollama ,Linux上是直接可执行的 ollama 文件,它把自己打包成了“操作系统原生公民”。

2.2 Ollama的底层架构:为什么它能跨平台还这么轻?

Ollama不是凭空造轮子。它本质是 LLM推理引擎的智能调度层 ,底层依赖三个成熟组件:

  • 模型格式层 :只认 GGUF (由llama.cpp定义的量化模型格式)。这是关键!GGUF把模型权重、词表、配置全塞进一个文件,且支持4-bit/5-bit/6-bit量化。比如 llama3:8b 官方镜像实际是 llama3.Q5_K_M.gguf ,大小仅4.8GB,而原始FP16权重要15GB。Ollama在 pull 时自动下载对应GGUF文件,省去你手动转换的麻烦。

  • 推理引擎层 :Mac用 llama.cpp (Metal加速),Linux/Windows用 llama.cpp (CUDA或CPU fallback)。注意:它 不依赖PyTorch/TensorFlow 。这意味着你电脑上可以完全没装Python,Ollama照样跑。这也是它启动快(<2秒)、内存占用低(8B模型常驻内存约2GB)的原因——没有Python解释器的开销。

  • 服务封装层 :内置一个极简的Go语言HTTP服务器(基于 net/http ),监听 127.0.0.1:11434 。所有 ollama run 命令最终都转化为向这个本地API发请求。所以 ollama run qwen2:7b = curl -X POST http://127.0.0.1:11434/api/chat -d '{"model":"qwen2:7b","messages":[{"role":"user","content":"你好"}]}' 。这种设计让Python集成变得毫无门槛——你不需要学新SDK,用最熟的 requests 就行。

提示:Ollama的 modelfile 机制是它的隐藏王牌。它允许你用类似Dockerfile的语法定制模型行为。例如,你想让Qwen2默认用中文回答,只需创建 Modelfile

FROM qwen2:7b
SYSTEM """
你是一个专业的中文助手,所有回答必须使用简体中文,不使用英文单词。
"""
PARAMETER temperature 0.7

然后 ollama create my-qwen -f Modelfile 。这比在Python里每次 messages 里硬塞 SYSTEM 提示词干净十倍。

2.3 为什么推荐Python作为主要集成语言?而非Node.js或Go?

虽然Ollama API是HTTP协议,理论上任何语言都能调,但我坚持用Python,原因很实在:

  • 生态成熟度 requests 库的稳定性碾压所有HTTP客户端。我试过用Node.js的 axios 调用,遇到过SSL证书验证失败(尤其在企业内网),而 requests 一句 verify=False 就解决(当然生产环境要配CA)。

  • 数据处理无缝衔接 :本地大模型常和Pandas、NumPy、SQLAlchemy混用。比如我做的财报分析工具:用Pandas读取Excel表格 → 提取关键字段 → 拼成Prompt → 调Ollama → 解析JSON结果 → 写回Excel。整个链路零数据格式转换。

  • 调试友好性 print(response.json()) 比Node.js的 console.log(JSON.stringify(res.data)) 直观得多。当模型返回空或格式错乱时,Python的 pprint 能立刻帮你定位是 message 字段缺失,还是 done 字段为 false

  • 异步支持平滑 httpx.AsyncClient 配合 asyncio ,轻松实现并发调用多个模型。我有个项目需要同时跑Llama3分析技术文档、Phi-3总结会议纪要、Gemma校对邮件,用 asyncio.gather() 三行代码搞定,吞吐量比同步调用高4倍。

当然,如果你的主力语言是JS, fetch 也完全OK。但Python在数据科学、自动化脚本、快速原型领域的统治力,让它成为Ollama的最佳拍档。

3. 核心细节解析与实操要点

3.1 三平台安装与验证:别让第一步就卡死

安装看似简单,但细节决定成败。我按平台拆解真实踩坑点:

Windows(重点:WSL2 vs 原生)

  • 绝对不要用WSL2 !这是血泪教训。Ollama官方明确不支持WSL2,因为WSL2的GPU直通需要额外配置NVIDIA Container Toolkit,且 nvidia-smi 在WSL2里常显示“NVIDIA-SMI has failed”。我试过三天,最终放弃。
  • 正确姿势 :下载 OllamaSetup.exe (官网最新版),安装时勾选“Add ollama to PATH”,否则后续命令行找不到。安装后 必须重启终端 (CMD/PowerShell),否则PATH不生效。
  • 验证命令
    ollama --version  # 应输出 v0.3.0+
    ollama list       # 应为空列表(首次)
    ollama run llama3 # 第一次会下载,等待5-10分钟(取决于网速)
    

    注意:如果 ollama run 卡在“pulling manifest”,大概率是DNS污染。此时在PowerShell里执行:
    Set-DnsClientServerAddress -InterfaceIndex (Get-NetAdapter | Where-Object {$_.Status -eq "Up"}).ifIndex -ServerAddresses "223.5.5.5","114.114.114.114"
    切换国内DNS,再试。

macOS(重点:Apple Silicon vs Intel)

  • Apple Silicon(M1/M2/M3)用户:安装 .dmg 后,首次运行 ollama run llama3 会自动启用Metal加速,GPU利用率瞬间拉满。你能在活动监视器里看到 ollama 进程占满GPU。
  • Intel Mac用户:只能用CPU推理,速度慢3-5倍。建议降级用 phi3:3.8b (3.8B参数,CPU上也能秒回)。
  • 关键验证 :打开活动监视器 → 切换到“GPU历史记录”标签页 → 运行 ollama run llama3 → 观察GPU负载是否跳变。如果不跳,说明Metal未启用,检查是否安装了Xcode Command Line Tools( xcode-select --install )。

Linux(重点:GPU驱动与权限)

  • Ubuntu/Debian系: curl -fsSL https://ollama.com/install.sh | sh 是最稳的。但 必须确保CUDA驱动已安装
    nvidia-smi  # 必须有输出,且Driver Version >= 525.60.13(对应CUDA 12.0)
    nvcc --version  # 可选,验证CUDA toolkit
    
  • 权限陷阱 :Ollama默认以当前用户运行,但模型文件存在 ~/.ollama/models/ 。如果之前用 sudo ollama 运行过,会导致目录权限混乱,后续普通用户无法写入。修复命令:
    sudo chown -R $USER:$USER ~/.ollama
    sudo chmod -R 755 ~/.ollama
    
  • 验证GPU :运行 OLLAMA_DEBUG=1 ollama run llama3 2>&1 | grep -i cuda ,应看到 using cuda 字样。

3.2 模型选择与量化策略:参数、显存、速度的三角平衡

Ollama模型库(https://ollama.com/library)看着眼花缭乱,但选型就看三点: 你的显存大小、任务复杂度、响应延迟要求 。我整理了常用模型的实测数据(RTX 4090,24GB显存):

模型名 参数量 GGUF量化 显存占用 首token延迟 生成速度(tok/s) 适用场景
llama3:8b 8B Q5_K_M 6.2GB 850ms 42 通用对话、代码补全
phi3:3.8b 3.8B Q5_K_M 2.8GB 320ms 89 快速问答、轻量摘要
qwen2:7b 7B Q4_K_M 4.1GB 680ms 51 中文强项、数学推理
deepseek-coder:6.7b 6.7B Q5_K_M 4.9GB 720ms 48 代码生成、Bug修复
gemma:2b 2B Q4_K_M 1.7GB 210ms 112 极速响应、边缘设备

实测心得:

  • 别迷信“越大越好” llama3:70b 在4090上显存爆满(需32GB+),且首token延迟超3秒,日常使用反不如8B顺滑。
  • 量化不是越小越好 。Q2_K比Q5_K_M小30%,但中文理解能力断崖下跌。我测试过 qwen2:7b 的Q2_K,让其翻译“人工智能赋能千行百业”,结果译成“AI gives power to thousands of lines and hundreds of industries”——字面准确但失去中文语境。Q4_K_M是性价比之王。
  • 中文任务闭眼选Qwen2 。它的词表针对中文优化,同样7B参数下,中文事实性比Llama3高17%(基于C-Eval测试集)。

3.3 Python集成核心:从requests到ollama-python库的演进

3.3.1 原生requests调用(最可控,推荐新手)

这是理解Ollama API本质的必经之路。核心就两个端点:

  • POST /api/chat :流式聊天(推荐)
  • POST /api/generate :单次生成(兼容旧版)
import requests
import json

# 配置
OLLAMA_URL = "http://127.0.0.1:11434"
MODEL_NAME = "qwen2:7b"

def chat_with_ollama(prompt: str, system_prompt: str = "") -> str:
    """基础聊天函数"""
    payload = {
        "model": MODEL_NAME,
        "messages": [
            {"role": "system", "content": system_prompt} if system_prompt else None,
            {"role": "user", "content": prompt}
        ],
        "stream": True,  # 关键!开启流式,避免超时
        "options": {
            "temperature": 0.7,
            "num_ctx": 4096  # 上下文长度,根据模型调整
        }
    }
    # 过滤None值
    payload["messages"] = [m for m in payload["messages"] if m]
    
    try:
        response = requests.post(
            f"{OLLAMA_URL}/api/chat",
            json=payload,
            timeout=300  # 重要!大模型生成可能超5分钟
        )
        response.raise_for_status()
        
        # 流式解析
        full_response = ""
        for line in response.iter_lines():
            if line:
                chunk = json.loads(line.decode('utf-8'))
                if 'message' in chunk and 'content' in chunk['message']:
                    full_response += chunk['message']['content']
        return full_response
        
    except requests.exceptions.Timeout:
        return "请求超时,请检查Ollama是否运行中"
    except requests.exceptions.ConnectionError:
        return "无法连接Ollama,请运行 'ollama serve' 或检查端口"
    except Exception as e:
        return f"未知错误:{str(e)}"

# 使用示例
result = chat_with_ollama(
    prompt="请用中文总结以下技术文档要点:[插入文档文本]",
    system_prompt="你是一名资深技术文档工程师,用不超过100字总结核心要点"
)
print(result)

关键细节:

  • timeout=300 是保命设置。模型生成长文本时,HTTP连接可能卡住,不设timeout会永久挂起。
  • stream=True 必须开启。Ollama的 /api/chat 默认流式,关闭后反而要等整个响应完成才返回,体验极差。
  • iter_lines() 是解析流式响应的正确方式。别用 response.json() ,那会报错。
3.3.2 ollama-python库(更简洁,适合项目)

官方Python SDK( pip install ollama )封装了requests逻辑,代码更短:

import ollama

# 同步调用
response = ollama.chat(
    model='qwen2:7b',
    messages=[
        {
            'role': 'user',
            'content': '你好,你是谁?'
        }
    ],
    options={
        'temperature': 0.7,
        'num_ctx': 4096
    }
)
print(response['message']['content'])

# 流式调用(推荐)
stream = ollama.chat(
    model='qwen2:7b',
    messages=[{'role': 'user', 'content': '请列出Python处理CSV的5个常用库'}],
    stream=True
)

for chunk in stream:
    print(chunk['message']['content'], end='', flush=True)  # 实时打印

优势:自动处理重连、超时、JSON解析;支持 chat / generate / embed 全接口。
劣势:版本迭代快,0.2.x和0.3.x的参数名有变化(如 num_ctx 在0.2.x叫 num_ctx ,0.3.x叫 context_length ),升级前务必看CHANGELOG。

3.4 高级技巧:自定义模型、上下文管理与性能调优

3.4.1 Modelfile定制:告别每次写SYSTEM提示词

前面提过Modelfile,这里给个生产级例子。假设你要做一个“法律文书助手”,要求:

  • 默认用中文回答
  • 严格基于中国《民法典》条文
  • 输出格式为“结论:...;依据:《民法典》第X条...”

创建 Modelfile

FROM qwen2:7b
# 设置系统提示
SYSTEM """
你是一名中国执业律师,精通《中华人民共和国民法典》。所有回答必须:
1. 使用简体中文;
2. 结论先行,用“结论:”开头;
3. 依据必须精确到《民法典》具体条款,格式为“依据:《民法典》第X条...”;
4. 不编造法条,不确定时回答“依据不足,建议咨询专业律师”。
"""
# 设置默认参数
PARAMETER temperature 0.3
PARAMETER num_ctx 8192
# 加载法律专用词表(可选)
# ADD ./law_vocab.json /usr/share/ollama/models/law_vocab.json

构建并运行:

ollama create law-assistant -f Modelfile
ollama run law-assistant "甲乙签订房屋买卖合同,乙方未付款,甲方能否解除合同?"

输出自动是:

结论:甲方可以解除合同。依据:《民法典》第五百六十三条第一款规定,当事人一方迟延履行主要债务,经催告后在合理期限内仍未履行的,另一方可以解除合同。
3.4.2 上下文窗口管理:如何让模型记住更长对话?

Ollama默认 num_ctx 是4096,但Qwen2支持8K,Llama3支持8K+。要突破限制,必须在 ollama run 时指定:

# 启动时指定大上下文
ollama run llama3:8b --num_ctx 8192

# Python调用时传参
ollama.chat(
    model='llama3:8b',
    messages=[...],
    options={'num_ctx': 8192}
)

但注意:增大 num_ctx 会线性增加显存占用。 num_ctx=8192 4096 多占约1.2GB显存。我的经验是: 日常对话4096足够,处理长文档摘要才开8192

3.4.3 性能调优:让4090跑出120%性能
  • GPU加速确认 :运行 ollama list ,模型名后带 * 表示已启用GPU(如 qwen2:7b * )。没星号?检查CUDA驱动。
  • 批处理提速 :Ollama不支持批量输入,但你可以用 concurrent.futures 并发调用:
    from concurrent.futures import ThreadPoolExecutor
    import ollama
    
    def process_single(text):
        return ollama.chat(model='qwen2:7b', messages=[{'role':'user','content':text}])['message']['content']
    
    texts = ["摘要1", "摘要2", "摘要3"]
    with ThreadPoolExecutor(max_workers=3) as executor:
        results = list(executor.map(process_single, texts))
    
  • 内存清理 :长时间运行后,Ollama可能缓存模型。用 ollama ps 查看运行中模型, ollama rm <model> 卸载不用的。

4. 实操过程与核心环节实现

4.1 从零开始:搭建一个“会议纪要生成器”

这个项目真实落地于我上家公司,每天要处理10+场线上会议录音转文字稿,人工摘要耗时2小时/天。用Ollama+Python,压缩到3分钟。

步骤1:准备环境

  • 确认Ollama已安装并运行( ollama serve 后台常驻)
  • 拉取轻量模型: ollama pull phi3:3.8b (小模型快,够用)

步骤2:设计Prompt工程
会议纪要不是简单摘要,要抓“决策、行动项、负责人、截止时间”。Prompt这样写:

你是一名专业会议秘书。请严格按以下格式提取纪要:
【决策】:列出所有达成的决议,每条以“-”开头
【行动项】:列出所有待办事项,格式为“- [事项](负责人:XXX,截止:YYYY-MM-DD)”
【未决事项】:列出悬而未决的问题
禁止添加任何解释性文字,只输出上述三部分。
会议记录如下:
{transcript}

步骤3:Python脚本实现

import ollama
import re
from datetime import datetime

def generate_minutes(transcript: str) -> dict:
    """生成结构化会议纪要"""
    prompt = f"""你是一名专业会议秘书。请严格按以下格式提取纪要:
【决策】:列出所有达成的决议,每条以"-"开头
【行动项】:列出所有待办事项,格式为"- [事项](负责人:XXX,截止:YYYY-MM-DD)"
【未决事项】:列出悬而未决的问题
禁止添加任何解释性文字,只输出上述三部分。
会议记录如下:
{transcript}"""
    
    try:
        response = ollama.chat(
            model='phi3:3.8b',
            messages=[{'role': 'user', 'content': prompt}],
            options={'temperature': 0.2, 'num_ctx': 4096}
        )
        content = response['message']['content']
        
        # 正则提取结构化数据
        decisions = re.findall(r'【决策】\s*(.*?)(?=\n【|\Z)', content, re.DOTALL)
        actions = re.findall(r'【行动项】\s*(.*?)(?=\n【|\Z)', content, re.DOTALL)
        pending = re.findall(r'【未决事项】\s*(.*?)(?=\n【|\Z)', content, re.DOTALL)
        
        return {
            "decisions": [d.strip() for d in decisions[0].split('\n') if d.strip()] if decisions else [],
            "actions": [a.strip() for a in actions[0].split('\n') if a.strip()] if actions else [],
            "pending": [p.strip() for p in pending[0].split('\n') if p.strip()] if pending else []
        }
    except Exception as e:
        return {"error": str(e)}

# 使用示例
transcript = """张总:Q3市场推广预算增加20%。李经理:同意,由市场部执行,9月30日前提交方案。王总监:新系统上线时间是否确定?张总:待技术部评估,下周反馈。"""
result = generate_minutes(transcript)
print("【决策】", result.get("decisions", []))
print("【行动项】", result.get("actions", []))
print("【未决事项】", result.get("pending", []))

步骤4:集成到工作流

  • whisper.cpp 本地转录音频为文字(不传云端)
  • 脚本定时扫描 /meetings/ 目录,自动处理新文件
  • 结果输出为Markdown,自动推送到Confluence

实测效果:单次处理30分钟会议(约5000字),平均耗时22秒,准确率92%(人工抽检)。最大的收益是 所有数据不出内网 ,合规零风险。

4.2 进阶实战:构建“本地知识库问答机器人”

很多公司有大量PDF/Word内部文档,想实现“问文档答”。Ollama+RAG(检索增强生成)是最佳解。

技术栈

  • 文档解析: pymupdf (快)+ python-docx (Word)
  • 向量存储: chromadb (轻量,纯Python)
  • 检索: sentence-transformers all-MiniLM-L6-v2 ,小而快)
  • 生成:Ollama( qwen2:7b

核心流程

  1. 文档切片 :PDF按页切,每页再按段落切(避免跨页语义断裂)
  2. 向量化 :用 all-MiniLM-L6-v2 将段落转为384维向量
  3. 存入ChromaDB :每个向量带元数据(文件名、页码)
  4. 问答时 :用户问题→向量化→ChromaDB相似度搜索→Top3段落+问题→喂给Ollama

关键代码片段

from chromadb import Client
from sentence_transformers import SentenceTransformer
import ollama

# 初始化
client = Client()
collection = client.create_collection("docs")
model = SentenceTransformer('all-MiniLM-L6-v2')

# 文档入库(伪代码)
def ingest_document(file_path: str):
    text = extract_text(file_path)  # 自定义解析函数
    chunks = split_into_chunks(text, max_len=512)  # 切块
    embeddings = model.encode(chunks).tolist()
    collection.add(
        embeddings=embeddings,
        documents=chunks,
        metadatas=[{"source": file_path, "chunk_id": i} for i in range(len(chunks))]
    )

# 问答函数
def ask_question(query: str) -> str:
    query_embedding = model.encode([query]).tolist()[0]
    results = collection.query(
        query_embeddings=[query_embedding],
        n_results=3
    )
    context = "\n\n".join(results['documents'][0])
    
    # 构建RAG Prompt
    rag_prompt = f"""你是一个企业知识库助手。请基于以下提供的资料回答问题,资料来自公司内部文档:
{context}
问题:{query}
要求:答案必须严格基于资料,不能编造;如果资料中没有相关信息,回答“未找到相关内容”。
"""
    
    response = ollama.chat(
        model='qwen2:7b',
        messages=[{'role': 'user', 'content': rag_prompt}],
        options={'temperature': 0.1}
    )
    return response['message']['content']

经验之谈:

  • 切块大小是关键 。512字符是黄金分割点——太小丢失上下文,太大检索不准。我测试过128/256/512/1024,512在准确率和召回率上最平衡。
  • 温度值要压低 (0.1-0.3)。RAG场景下,模型必须忠实于检索到的内容,高温度会“自由发挥”。
  • Ollama的 num_ctx 要设够 context + query 可能超4096,务必设 8192

4.3 生产部署:让Ollama服务7x24小时稳定运行

Ollama默认前台运行,关终端就停。生产环境必须后台守护。

Windows方案(Task Scheduler)

  • 创建批处理 start-ollama.bat
    @echo off
    start "" "C:\Users\YourName\AppData\Local\Programs\Ollama\ollama.exe" serve
    exit
    
  • 用任务计划程序,设置“登录时运行”,勾选“不管用户是否登录都要运行”。

macOS方案(launchd)
创建 ~/Library/LaunchAgents/ai.ollama.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ai.ollama</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/ollama</string>
        <string>serve</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

然后执行: launchctl load ~/Library/LaunchAgents/ai.ollama.plist

Linux方案(systemd)
创建 /etc/systemd/system/ollama.service

[Unit]
Description=Ollama Service
After=network.target

[Service]
Type=simple
User=yourusername
ExecStart=/usr/bin/ollama serve
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

然后:

sudo systemctl daemon-reload
sudo systemctl enable ollama
sudo systemctl start ollama

验证: systemctl status ollama 应显示 active (running)
日志查看: journalctl -u ollama -f (实时跟踪)。

5. 常见问题与排查技巧实录

5.1 连接被拒绝(Connection refused)——90%的新手卡点

现象 :Python报错 requests.exceptions.ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=11434): Max retries exceeded with url: /api/chat
排查路径

  1. Ollama服务是否启动?

    • Windows:任务管理器 → 查看 ollama.exe 进程是否存在
    • Mac:活动监视器 → 搜索 ollama
    • Linux: ps aux | grep ollama
    • 如果没有,手动启动: ollama serve (前台)或按4.3节配置后台服务
  2. 端口是否被占用?

    # Linux/Mac
    lsof -i :11434
    # Windows
    netstat -ano | findstr :11434
    

    如果被其他进程占用,修改Ollama端口:

    OLLAMA_HOST=127.0.0.1:11435 ollama serve
    

    Python里同步改 OLLAMA_URL = "http://127.0.0.1:11435"

  3. 防火墙拦截?

    • Windows:控制面板 → Windows Defender防火墙 → 允许应用通过防火墙 → 勾选 ollama.exe
    • Mac:系统设置 → 隐私与安全性 → 防火墙 → 防火墙选项 → 添加 ollama

5.2 模型加载失败:GPU out of memory

现象 ollama run llama3:8b 报错 CUDA out of memory ,或卡住不动
根本原因 :显存不足,Ollama尝试加载失败后未优雅退出
解决方案

  • 降量化 ollama run llama3:8b-q4_k_m (强制用Q4量化)
  • 降参数 :换 phi3:3.8b
Logo

免费领 200 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐