文章目录
- 【105.Python+AI】把大模型从云端搬回家:Ollama一行命令跑Llama3、Qwen2
-
- 导入语
- [1 ~> 安装与启动:一行命令跑起大模型](#1 ~> 安装与启动:一行命令跑起大模型)
-
- [1.1 安装](#1.1 安装)
- [1.2 跑起第一个模型](#1.2 跑起第一个模型)
- [1.3 模型怎么选:看显存下菜](#1.3 模型怎么选:看显存下菜)
- [2 ~> Modelfile:把你的角色设定"焊"进模型](#2 ~> Modelfile:把你的角色设定"焊"进模型)
- [3 ~> REST API:从玩具到服务](#3 ~> REST API:从玩具到服务)
-
- [3.1 杀手锏:OpenAI SDK 无缝兼容](#3.1 杀手锏:OpenAI SDK 无缝兼容)
- [3.2 全链路回顾](#3.2 全链路回顾)
- [4 ~> 什么时候该回到云端](#4 ~> 什么时候该回到云端)
- [思考 && 总结](#思考 && 总结)
- 结尾
【105.Python+AI】把大模型从云端搬回家:Ollama一行命令跑Llama3、Qwen2
📖 文章简介: 本文系统讲解Ollama本地大模型部署的完整用法,是"零成本、零泄露风险"玩转开源大模型的最短路径。文章从"为什么要本地跑模型"的三个真实动机切入------数据不出内网的合规要求、调API调到手软的费用账单、没网环境也能用的自由度;随后按上手顺序展开:Ollama安装(Windows/Mac/Linux三平台一分钟装完)、模型拉取(ollama run一行命令跑起Llama3/Qwen2,模型仓库的选型与显存对照表)、Modelfile自定义(基于基础模型定制专属角色的System Prompt、温度等参数的固化方法,相当于"打包一个自己的模型")、REST API调用(localhost:11434标准接口,curl与requests两种调用姿势)、与OpenAI SDK的无缝兼容(改两行代码让既有项目从云端切到本地)。文末附"本地模型什么时候不够用、该回到云端"的判断标准,配以Mermaid流程图展示从安装到API调通的完整链路,适合所有想把大模型部署到自己机器上的开发者阅读参考。

🎬 个人主页: 源码骑士
❄ 专栏传送门: 《Android开发基础》《python基础课程》
⭐️热衷从源码视角拆解技术底层原理,将复杂架构讲得通俗易懂
🎬 源码骑士的简介:
5年Android Framework系统开发经验,曾主导多项系统级性能优化专项
技术栈覆盖Android系统全链路(Binder/Handler/AMS/WMS/启动流程)及Java后端全家桶(Spring + MyBatis + Redis + Oracle)
累计产出原创技术文章100+篇,文章以流程图为特色,被读者评价为"看一篇胜过啃一周源码"
导入语
前面几十篇文章,我们调的大模型都在云端------OpenAI、DeepSeek、通义千问,一个API Key走天下。方便是真方便,但有三类场景,云端方案天然别扭:
bash
场景一:数据不能出门
医疗记录、合同文本、内部代码------公司规定数据不出内网
云端API再方便也一票否决
场景二:账单扛不住
批量处理十万条数据的任务,API费用算下来大几千
而你的4090显卡正躺在机箱里吃灰
场景三:环境没有网
内网开发机、出差路上、 demo现场网络拉胯
云端模型直接失联
这三类场景的答案都是同一个:把模型搬回自己机器跑。 而2024年之后,这件事的门槛低到了一行命令------功臣就是 Ollama。
1 ~> 安装与启动:一行命令跑起大模型
1.1 安装
bash
# Mac / Linux:
curl -fsSL https://ollama.com/install.sh | sh
# Windows:
官网下载 OllamaSetup.exe,一路下一步
# 装完托盘区出现小羊驼图标即成功
1.2 跑起第一个模型
bash
# 拉取并运行 Qwen2.5 7B(首次自动下载约4.7GB,之后秒启)
ollama run qwen2.5:7b
# 或者 Llama3.1 8B
ollama run llama3.1:8b
看到>>>提示符,就可以直接对话了。是的,从安装到和7B模型聊天,总共两条命令------CUDA驱动、Python环境、依赖地狱这些传统部署的拦路虎,Ollama全部替你消化掉了。
1.3 模型怎么选:看显存下菜
| 模型规模 | 量化后体积 | 所需显存/内存 | 能力画像 |
|---|---|---|---|
| 1.5B ~ 3B | 1~2GB | 4GB 内存即可 | 能对话,逻辑弱,适合嵌入式 |
| 7B ~ 8B | 4~5GB | 8GB 显存或16GB内存 | 日常任务够用,性价比甜点 |
| 14B | 8~9GB | 16GB 显存 | 明显更聪明,中高端显卡 |
| 32B+ | 18GB+ | 24GB+ 显存 | 接近商用API水平,发烧友向 |
经验建议:从7B起步。它是对话、摘要、分类等日常任务的性价比甜点;跑出瓶颈再升级,别一上来拉70B把机器跑成幻灯片。
2 ~> Modelfile:把你的角色设定"焊"进模型
每次调用都塞一遍System Prompt太啰嗦,Ollama支持用Modelfile把设定固化成"新模型":
dockerfile
# Modelfile
FROM qwen2.5:7b
# 固化系统角色------之后每次对话都自带这个人设
SYSTEM """
你是"码上Reviews"团队的资深代码评审员。
评审风格:先肯定优点,再指出问题,问题按严重程度排序,
每条问题附带修改建议和示例代码。
"""
# 固化推理参数
PARAMETER temperature 0.3
PARAMETER num_ctx 8192
bash
# 基于Modelfile创建专属模型
ollama create code-reviewer -f Modelfile
# 像普通模型一样使用
ollama run code-reviewer
可以把它理解成**"模型级Dockerfile"**:基础镜像是开源模型,你在上面叠加人设和参数,create出一个团队共享的定制模型。第92篇写的角色Prompt、第88篇的System设计,在这里都能直接固化。
3 ~> REST API:从玩具到服务
Ollama启动后自带HTTP服务(默认localhost:11434),这是它从"聊天玩具"变成"开发基建"的关键:
bash
# curl 直接调
curl http://localhost:11434/api/generate -d '{
"model": "qwen2.5:7b",
"prompt": "用一句话解释什么是向量数据库",
"stream": false
}'
python
import requests
resp = requests.post("http://localhost:11434/api/generate", json={
"model": "qwen2.5:7b",
"prompt": "用一句话解释什么是向量数据库",
"stream": False,
})
print(resp.json()["response"])
3.1 杀手锏:OpenAI SDK 无缝兼容
Ollama内置了OpenAI兼容接口------意味着你之前写的所有调用OpenAI的代码,改两行就能切到本地:
python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1", # ← 改动一:指向本地
api_key="ollama", # ← 改动二:随便填,本地不校验
)
resp = client.chat.completions.create(
model="qwen2.5:7b", # ← 改动三:换模型名
messages=[{"role": "user", "content": "你好"}],
)
这个兼容层的价值巨大:云端和本地可以随意切换------开发调试用本地(免费、快、不泄露),生产上量切云端(强模型、高并发),一套代码两种活法。
3.2 全链路回顾
#mermaid-svg-s7KXw6467IJGitox{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-s7KXw6467IJGitox .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-s7KXw6467IJGitox .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-s7KXw6467IJGitox .error-icon{fill:#552222;}#mermaid-svg-s7KXw6467IJGitox .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-s7KXw6467IJGitox .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-s7KXw6467IJGitox .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-s7KXw6467IJGitox .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-s7KXw6467IJGitox .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-s7KXw6467IJGitox .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-s7KXw6467IJGitox .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-s7KXw6467IJGitox .marker{fill:#333333;stroke:#333333;}#mermaid-svg-s7KXw6467IJGitox .marker.cross{stroke:#333333;}#mermaid-svg-s7KXw6467IJGitox svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-s7KXw6467IJGitox p{margin:0;}#mermaid-svg-s7KXw6467IJGitox .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-s7KXw6467IJGitox .cluster-label text{fill:#333;}#mermaid-svg-s7KXw6467IJGitox .cluster-label span{color:#333;}#mermaid-svg-s7KXw6467IJGitox .cluster-label span p{background-color:transparent;}#mermaid-svg-s7KXw6467IJGitox .label text,#mermaid-svg-s7KXw6467IJGitox span{fill:#333;color:#333;}#mermaid-svg-s7KXw6467IJGitox .node rect,#mermaid-svg-s7KXw6467IJGitox .node circle,#mermaid-svg-s7KXw6467IJGitox .node ellipse,#mermaid-svg-s7KXw6467IJGitox .node polygon,#mermaid-svg-s7KXw6467IJGitox .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-s7KXw6467IJGitox .rough-node .label text,#mermaid-svg-s7KXw6467IJGitox .node .label text,#mermaid-svg-s7KXw6467IJGitox .image-shape .label,#mermaid-svg-s7KXw6467IJGitox .icon-shape .label{text-anchor:middle;}#mermaid-svg-s7KXw6467IJGitox .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-s7KXw6467IJGitox .rough-node .label,#mermaid-svg-s7KXw6467IJGitox .node .label,#mermaid-svg-s7KXw6467IJGitox .image-shape .label,#mermaid-svg-s7KXw6467IJGitox .icon-shape .label{text-align:center;}#mermaid-svg-s7KXw6467IJGitox .node.clickable{cursor:pointer;}#mermaid-svg-s7KXw6467IJGitox .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-s7KXw6467IJGitox .arrowheadPath{fill:#333333;}#mermaid-svg-s7KXw6467IJGitox .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-s7KXw6467IJGitox .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-s7KXw6467IJGitox .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s7KXw6467IJGitox .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-s7KXw6467IJGitox .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s7KXw6467IJGitox .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-s7KXw6467IJGitox .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-s7KXw6467IJGitox .cluster text{fill:#333;}#mermaid-svg-s7KXw6467IJGitox .cluster span{color:#333;}#mermaid-svg-s7KXw6467IJGitox div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-s7KXw6467IJGitox .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-s7KXw6467IJGitox rect.text{fill:none;stroke-width:0;}#mermaid-svg-s7KXw6467IJGitox .icon-shape,#mermaid-svg-s7KXw6467IJGitox .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s7KXw6467IJGitox .icon-shape p,#mermaid-svg-s7KXw6467IJGitox .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-s7KXw6467IJGitox .icon-shape .label rect,#mermaid-svg-s7KXw6467IJGitox .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s7KXw6467IJGitox .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-s7KXw6467IJGitox .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-s7KXw6467IJGitox :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
命令行对话
程序集成
安装Ollama
ollama run 拉取模型
按显存选规模
需要定制人设?
编写 Modelfile
SYSTEM+参数固化
ollama create
生成专属模型
基础模型直接用
本地服务 localhost:11434
调用方式
ollama run 交互式
REST API / OpenAI SDK
改两行代码无缝切换
4 ~> 什么时候该回到云端
本地部署不是万能的,这几条边界要清醒:
bash
该用云端的信号:
□ 任务需要顶尖推理能力(复杂数学、长链条逻辑)
→ 7B本地模型和GPT-4级别的差距是肉眼可见的
□ 并发要求高(几十人同时用)
→ 单卡Ollama并发很弱,这是vLLM的战场(第108篇)
□ 需要最新知识或超长上下文(>32K)
→ 本地小模型的上下文窗口和知识新鲜度都受限
□ 团队没有显卡资源
→ 纯CPU能跑7B,但速度只适合演示不适合生产
一句话:本地是"够用、可控、免费"的基本盘,云端是"最强、最快、最贵"的增强包------成熟的架构是两者混合调度(第110篇专门讲多模型热切换)。
思考 && 总结
- 本地部署的三类刚需场景: 数据不出内网、批量任务省账单、离线环境可用------中一条就值得部署。
- 上手只需两条命令: 装Ollama、
ollama run qwen2.5:7b;模型选型从7B甜点起步,看显存下菜。 - Modelfile是模型级Dockerfile: 基础模型+SYSTEM人设+参数,create出团队共享的定制模型。
- OpenAI兼容层是杀手锏: base_url指向本地、api_key随便填------既有代码改两行,云端本地自由切换。
- 认清边界: 顶尖推理、高并发、超长上下文回云端;本地是基本盘,云端是增强包。
跑起来了,但你会立刻发现一个新问题:官方给的都是量化后的模型,GGUF、Q4_K_M这些后缀是什么意思?为什么量化到4bit还能用、精度到底损失多少?下一篇把量化技术彻底讲透:GGUF、GPTQ、AWQ、bitsandbytes四大方案全对比。
结尾
各位小伙伴,本文的内容到这里就全部结束了,源码骑士在这里再次感谢您的阅读!
源码骑士 --- Android Framework & 全栈开发
👀 关注:跟博主一起从源码视角深耕底层原理,见证每一次成长
❤️ 点赞:让优质内容被更多人看见,让知识传递更有力量
⭐ 收藏:把核心知识点存好,在需要时随时查、随时用
💬 评论:分享你的经验或疑问,评论区一起交流避坑
🔄 一键四连:不要忘记给博主"一键四连"哦!
🗡️ 寄语:技术之路难免有困惑,但同行的人会让前进更有方向
结语:一条命令、一只羊驼、一个跑在自己机器上的7B模型------大模型从"云端的神坛"走进"你的终端",就是Ollama这两年干成的事。本地这个基本盘,今晚就可以搭起来。不要忘记给博主"一键四连"哦!