Ollama是什么?
Ollama是一个开源的本地大语言模型运行框架,设计用于简化在本地运行大型语言模型的过程,降低使用门槛。它通过简单的安装指令,使得用户可以通过一条命令在本地运行开源大型语言模型,例如Llama2。
Ollama保留了类似Docker的操作习惯,支持上传和管理大语言模型仓库,包括DeepSeek、Llama 2、Mistral、Qwen等模型。
Ollama的主要功能优势
①易于使用:Ollama提供了一个简单的API,使得即使是没有经验的用户也可以轻松使用。此外,它还提供了类似ChatGPT的聊天界面,用户无需开发即可直接与模型进行聊天交互。
②轻量级:Ollama的代码简洁明了,运行时占用资源少。这使得它能够在本地高效地运行,不需要大量的计算资源。
③可扩展:Ollama支持多种模型架构,并可以扩展以支持新的模型。它还支持热加载模型文件,无需重新启动即可切换不同的模型,这使得它非常灵活多变。
④预构建模型库:Ollama提供了一个预构建模型库,可以用于各种任务,如文本生成、翻译、问答等。这使得在本地运行大型语言模型变得更加容易和方便。
Ollama可以在Windows、MacOS和Linux系统上通过命令行界面运行、创建和共享大型语言模型。其设计理念是简化大语言模型的使用流程,兼顾成本效益和隐私保护。
下载Ollama 文件
访问 https://ollama.com/download
安装Ollama
安装完成后的界面
点击Ollama运行,通过shell命令查看是否安装成功.
在控制台执行如下命令:
ollama -v
表示成功!
具体Ollama的使用请查看文档:Ollama常用命令
推荐:控制台命令工具iTerm。
常用命令
可用的命令:
/set 设置会话变量
/show 显示模型信息
/bye 退出
/?, /help 帮助命令
使用 "" 开始多行消息
拉取和更新模型
ollama pull
用于拉取模型,如果模型已经存在,那么则更新本地模型。
ollama pull llama3
删除模型
如果模型不再使用,可以使用 ollama rm
从本机删除掉,以节省磁盘存储空间。下次使用的时候,仍然可以重新拉取。
ollama rm llama3
复制模型
ollama cp
命令可以复制一个模型,复制模型会占用双倍的磁盘空间。
ollama cp llama3 my-model
多行输入
在 Ollama 的命令行里面,回车表示发送指令,如果需要多行输入,可以使用单引号 ( """
) 来完成。
>>> """Hello,
... world!
... """
启动
当您想启动 Ollama 时可以使用 ollama serve
。这样就不需要使用 Ollama 的客户端程序了。比如我们在 Linux 服务器上就可以这样使用。
ollama serve
默认端口Ollama 服务的默认端口是 11434,无论是使用 App 启动,还是使用命令行启动,均是这个默认端口。由于 命令行和 APP 都使用 11434 默认端口,我们再 GUI 工作的时候执行 ollama server 会提示端口已占用。我们可以通过环境变量指定一个新的端口,来同时运行两个 ollama 实例:
linux系统
OLLAMA_HOST=127.0.0.1:11435 ollama serve
MacOS 系统
如果 Ollama 作为 macOS 应用程序运行,则应使用以下命令设置环境变量launchctl:
使用 launchctl setenv
设置环境变量,然后重新运行程序。
launchctl setenv OLLAMA_HOST "0.0.0.0"
Serve 命令提供了很多环境变量,可以让你更自由的运行 Ollama 程序:
• OLLAMA_DEBUG 显示其他调试信息(例如 OLLAMA_DEBUG=1)
• OLLAMA_HOST ollama 服务器的 IP 地址(默认 127.0.0.1:11434)
• OLLAMA_KEEP_ALIVE 模型在内存中保持加载状态的持续时间(默认“5 分钟”)
• OLLAMA_MAX_LOADED_MODELS 每个 GPU 加载的最大模型数量
• OLLAMA_MAX_QUEUE 排队请求的最大数量
• OLLAMA_MODELS 模型目录的路径
• OLLAMA_NUM_PARALLEL 并行请求的最大数量
• OLLAMA_NOPRUNE 启动时不修剪模型 blob
• OLLAMA_ORIGINS 允许来源的逗号分隔列表
• OLLAMA_TMPDIR 临时文件的位置
• OLLAMA_FLASH_ATTENTION 启用闪存注意
• OLLAMA_LLM_LIBRARY 设置 LLM 库以绕过自动检测
REST API
Ollama 启动之后,会自动运行一个执行和管理模型的 API。
curl http://localhost:11434/api/generate -d '{
"model": "deepseek-r1:1.5b",
"prompt": "为什么人会直立行走?",
"stream": true
}'
结果:
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:04.677884Z","response":"行走","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:04.760056Z","response":"步伐","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:04.843656Z","response":"。","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:04.929514Z","response":"直","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:05.031461Z","response":"立","done":false} {"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:05.22455Z","response":"状态","done":false} {"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:05.32246Z","response":"的人","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:05.420166Z","response":"可能","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:05.520856Z","response":"在","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:05.713597Z","response":"控制","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:05.828575Z","response":"力","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:05.909244Z","response":"上","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:06.004284Z","response":"更加","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:06.091339Z","response":"集中","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:06.172817Z","response":"和","done":false}
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:50:06.25258Z","response":"有效","done":false}
如果stream
设置为false,响应将是一个完整的JSON对象。
curl http://localhost:11434/api/generate -d '{
"model": "deepseek-r1:1.5b",
"prompt": "为什么人会直立行走?",
"stream": false
}'
结果:
{"model":"deepseek-r1:1.5b","created_at":"2025-02-18T10:53:02.792027Z","response":"\u003cthink\u003e\n嗯,用户问“为什么人会直立行走?”首先我得考虑他为什么会提出这个问题。可能是一个学生在学习生物学或心理学的时候,或者是一个对人类行为感兴趣的人。\n\n直立行走这个现象本身其实很普遍,每个人都有尝试过,所以用户可能是在探索自己的认知或者进行观察和思考。也许他想了解为什么人类会有直立行走,或者是否有科学依据支持这一点。\n\n接下来,我要分析可能的原因。首先,直立行走涉及到身体的协调性、肌肉的收缩以及骨骼的稳定。如果身体没有足够的力量,或者肌肉未被激活,直立行走可能会很困难或不自然。比如,老年人在站立时通常会更费力,而年轻人则有更强的运动能力。\n\n然后是生理需求方面,人类通过活动获取能量和维持生命。虽然直立行走可能需要更多的体力消耗,但随着年龄增长,身体也在不断发育,肌肉量增加,所以这种行为也是适应环境变化的一种方式。\n\n心理因素也不能忽视。不同的人有不同的偏好,有些人喜欢直立,而有些人则更倾向于走路。心理上的舒适感也是一个重要因素,比如在运动中可以放松心情或者增强体质。\n\n另外,现代社会对健康的重视也推动了直立行走的普遍性。越来越多的人开始注重体重管理、平衡和效率,这导致了更多人选择直接站立而非走动。\n\n最后,从基因角度来看,直立行走可能与体内的某些信号通路有关,这些信号在不同的年龄和环境下发挥作用,影响我们是否会倾向于行走或站立。\n\n总体来说,回答这个问题需要全面考虑生理、心理和社会因素的影响,并综合起来给出一个合理的解释。\n\u003c/think\u003e\n\n“为什么人会直立行走?”这是一个很好的问题,可以从多个角度来探讨。以下是一些可能的原因:\n\n1. **生理需求**:直立行走是一种基本的运动方式,可以满足身体对能量和协调性的需求。随着年龄增长,肌肉量的增加使得直立行走更自然和舒适。\n\n2. **力量要求**:站立通常需要更多的肌肉力量来支撑身体重量,而走路则依赖于走动时的力量分布。如果力量不足,站立可能会感到困难或不自然。\n\n3. **适应环境变化**:直立行走可以帮助人类更好地适应不同的环境条件,例如在寒冷环境中更容易保持体温,而在温暖环境中则可以节省能量。\n\n4. **心理因素**:不同的人有不同的偏好和习惯,有些人更喜欢静止状态,而另一些人更倾向于运动。这种偏好会影响人们是否选择直立行走。\n\n5. **社会压力与健康观点**:随着现代社会的不断发展,越来越多的人开始注重身体健康的提升。他们可能会选择直接站立来平衡体重、增强效率等,这也是现代生活方式的一部分。\n\n总的来说,“直立行走”并不是一种固定的行为模式,而是随着个体成长和环境变化而逐渐形成的适应方式。它反映了人类对生理需求、心理偏好以及社会价值观的深刻理解。","done":true,"done_reason":"stop","context":[151644,100678,17340,36993,73145,79095,107761,11319,151645,151648,198,106287,3837,20002,56007,2073,100678,17340,36993,73145,79095,107761,81264,101140,35946,49828,101118,42411,110936,101080,105073,1773,87267,101909,99720,18493,100134,114651,57191,107825,103920,3837,100631,101909,32664,103971,101070,103198,100623,3407,73145,79095,107761,99487,102060,100775,101045,99165,102212,3837,101587,101103,104482,38182,3837,99999,20002,87267,101219,101964,100005,102875,100631,71817,104144,33108,104107,1773,102106,42411,99172,99794,100678,103971,104330,73145,79095,107761,3837,100631,107189,99891,104282,100143,105064,3407,104326,3837,104515,101042,87267,104249,1773,101140,3837,73145,79095,107761,109228,101099,9370,102020,33071,5373,105640,9370,109501,101034,113826,9370,100407,1773,62244,101099,80443,103170,101102,3837,100631,105640,38342,99250,108248,3837,73145,79095,107761,104309,99165,103985,57191,16530,99795,1773,101912,3837,105448,18493,115113,13343,102119,36993,33126,80268,47534,3837,68536,102411,46448,18830,108858,9370,101079,99788,3407,101889,20412,107086,100354,99522,3837,103971,67338,99600,45912,101426,33108,104601,100702,1773,103925,73145,79095,107761,87267,85106,102075,109251,104997,3837,77288,101067,102185,100023,3837,101099,104477,99607,106115,3837,105640,32757,100649,3837,99999,100137,101070,100000,104117,99719,100682,104491,75768,3407,100438,100741,105827,107419,1773,99604,100623,114046,113721,3837,106648,99729,73145,79095,3837,68536,106648,46448,33126,114587,109214,1773,100438,101913,102476,98650,109381,118049,3837,101912,18493,101079,15946,73670,105270,104753,100631,101138,108372,3407,101948,3837,118966,32664,108136,102089,74763,101890,34187,73145,79095,107761,9370,102212,33071,1773,104343,100623,55286,104216,107235,39352,5373,102243,33108,101991,3837,43288,100673,34187,99573,17340,50404,101041,115113,109093,99314,27733,3407,100161,3837,45181,102477,115454,3837,73145,79095,107761,87267,57218,31914,102595,104760,104757,31935,45995,101063,3837,100001,104757,18493,101970,102185,33108,108275,118824,3837,99564,97639,113985,114587,107761,57191,115113,3407,102198,99883,3837,102104,105073,85106,100011,101118,107086,5373,100438,106640,100741,104126,90395,99799,99793,107485,46944,105630,104136,8997,151649,271,2073,100678,17340,36993,73145,79095,107761,81264,105464,104528,86119,3837,112255,101213,100884,36407,105435,1773,87752,99639,97084,87267,104249,48443,16,13,3070,107086,100354,334,5122,73145,79095,107761,101158,99797,9370,101079,75768,3837,73670,101929,101099,32664,101426,33108,102020,104196,100354,1773,101067,102185,100023,3837,105640,32757,9370,100649,104193,73145,79095,107761,33126,99795,33108,102476,3407,17,13,3070,101102,101882,334,5122,115113,102119,85106,102075,105640,101102,36407,104069,101099,106102,3837,68536,109214,46448,105537,34204,99314,27733,13343,104940,101450,1773,62244,101102,102004,3837,115113,104309,104048,103985,57191,16530,99795,3407,18,13,3070,104117,99719,100682,334,5122,73145,79095,107761,111728,103971,105344,104117,101970,99719,76095,3837,77557,18493,109646,109130,108478,100662,109207,3837,104746,104607,109130,46448,73670,106831,101426,3407,19,13,3070,100438,100741,334,5122,99604,100623,114046,113721,33108,100784,3837,106648,33126,99729,99541,81433,44091,3837,68536,100266,97084,17340,33126,114587,101079,1773,100137,113721,103252,100659,64471,50404,73145,79095,107761,3407,20,13,3070,99328,101950,57218,99722,101313,334,5122,101067,118966,9370,114133,3837,104343,100623,55286,104216,101099,108136,100341,1773,99650,104309,50404,101041,115113,36407,102243,107235,5373,101138,101991,49567,3837,104624,100390,107142,106979,3407,116880,41505,73145,79095,107761,854,102095,101053,101358,104796,100144,3837,103955,101067,106269,100423,33108,99719,100682,68536,104052,108165,104117,75768,1773,99652,112009,103971,32664,107086,100354,5373,100438,113721,101034,99328,106218,9370,101295,
192:~ csguo007$
设置FastAPI
接下来,设置一个Python的FastAPI应用。FastAPI是一个现代、快速(高性能)的Web框架,基于标准的Python类型提示,支持Python 3.7及以上版本。它是构建稳健高效API的理想选择。
编写FastAPI的路由和端点,以便与Ollama服务器进行交互。这个过程包括发送请求给Ollama以处理任务,比如文本生成、语言理解或其他LLM支持的AI任务。以下是一个简单的代码示例(你也可以使用 Ollama Python库 来优化代码)。
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
import json
import requests
app = FastAPI(debug=True)
class Itemexample(BaseModel):
name: str
prompt: str
instruction: str
is_offer: Union[bool, None] = None
class Item(BaseModel):
model: str
prompt: str
urls = ["http://localhost:11434/api/generate"]
headers = {
"Content-Type": "application/json"
}
@app.post("/chat/{llms_name}")
def update_item(llms_name: str, item: Item):
if llms_name == "deepseek":
url = urls[0]
payload = {
"model": "deepseek-r1:1.5b",
"prompt": "为什么天空是蓝色的?",
"stream": true
}
response = requests.post(url, headers=headers, data=json.dumps(payload))
if response.status_code == 200:
return {"data": response.text, "llms_name": llms_name}
else:
print("错误:", response.status_code, response.text)
return {"item_name": item.model, "error": response.status_code, "data": response.text}
return {"item_name": item.model, "llms_name": llms_name}
测试REST-API服务
curl --location 'http://127.0.0.1:8000/chat/deepseek' \
--header 'Content-Type: application/json' \
--data '{
"model": "deepseek-r1",
"prompt": "为什么天空是蓝色的?"
}'
查看日志
Ollama 的日志文件存储在 ~/.ollama/logs/server.log
,我们可以通过查看 这个日志文件来获取 Ollama 的运行信息,以及排查错误。
在 Mac 上直接打开文件即可查看日志:
也可以通过命令行来查看:
cat ~/.ollama/logs/server.log
如果是容器运行的话,更简单,直接查看容器的输出即可:
docker logs <container-name>
模型存储位置
Ollama 会下载模型到本地,不同操作系统的模型位置分别是:
• MacOS:~/.ollama/models
• Linux:/usr/share/ollama/.ollama/models
• Windows:C:\Users\%username%\.ollama\models
如果你想将模型存储到不同位置,可以使用 OLLAMA_MODELS 环境变量来指定不同的目录。
并发
以下服务器设置可用于调整 Ollama 在大多数平台上处理并发请求的方式:
• OLLAMA_MAX_LOADED_MODELS 可同时加载的最大模型数量(前提是它们适合可用内存)。默认值为 3 * GPU 数量或 3(用于 CPU 推理)。
• OLLAMA_NUM_PARALLEL 每个模型同时处理的最大并行请求数。默认将根据可用内存自动选择 4 或 1。
• OLLAMA_MAX_QUEUE Ollama 在繁忙时排队的最大请求数,在拒绝其他请求之前。默认值为 512
Ollama 处理并发请求的逻辑是:
• 如果有足够内存,则可以同时加载多个模型
• 对于某个模型,如果有足够内存,则可以并发处理请求
• 如果内存不足以加载新模型:所有请求都排队,直至新模型加载
• 之前的模型空闲时,会写在一个或多个模型腾出空间给新模型
• 排队的请求按顺序处理