ollama 部署教程(window、linux)

文子阳 2024-10-21 10:37:01 阅读 88

目录

一、官网

二、安装方式一:window10版本下载

三、安装方式二:linux版本docker

四、 模型

五、运行模型

六、API服务

七、python调用

ollama库调用

langchain调用 

requests调用

aiohttp调用

八、模型添加方式

1.线上pull

2.导入 GGUF 模型文件

3.导入 safetensors 模型文件

九、部署Open WebUI


参考链接:Ollama完整教程:本地LLM管理、WebUI对话、Python/Java客户端API应用 - 老牛啊 - 博客园 (cnblogs.com)

icon-default.png?t=O83A

https://www.cnblogs.com/obullxl/p/18295202/NTopic2024071001

一、官网

在 macOS 上下载 Ollama - Ollama 中文

二、安装方式一:window10版本下载

安装完成没有提示。 接下来配置环境变量!

Ollama的安装过程,与安装其他普通软件并没有什么两样,安装完成之后,有几个常用的系统环境变量参数建议进行设置:

OLLAMA_MODELS模型文件存放目录,默认目录为当前用户目录(Windows 目录:<code>C:\Users%username%.ollama\models,MacOS 目录:~/.ollama/models,Linux 目录:/usr/share/ollama/.ollama/models),如果是 Windows 系统建议修改(如:D:\OllamaModels),避免 C 盘空间吃紧OLLAMA_HOST:Ollama 服务监听的网络地址,默认为127.0.0.1,如果允许其他电脑访问 Ollama(如:局域网中的其他电脑),建议设置0.0.0.0,从而允许其他网络访问OLLAMA_PORT:Ollama 服务监听的默认端口,默认为11434,如果端口有冲突,可以修改设置成其他端口(如:8080等)OLLAMA_ORIGINS:HTTP 客户端请求来源,半角逗号分隔列表,若本地使用无严格要求,可以设置成星号,代表不受限制OLLAMA_KEEP_ALIVE:大模型加载到内存中后的存活时间,默认为5m即 5 分钟(如:纯数字如 300 代表 300 秒,0 代表处理请求响应后立即卸载模型,任何负数则表示一直存活);我们可设置成24h,即模型在内存中保持 24 小时,提高访问速度OLLAMA_NUM_PARALLEL:请求处理并发数量,默认为1,即单并发串行处理请求,可根据实际情况进行调整OLLAMA_MAX_QUEUE:请求队列长度,默认值为512,可以根据情况设置,超过队列长度请求被抛弃OLLAMA_DEBUG:输出 Debug 日志标识,应用研发阶段可以设置成1,即输出详细日志信息,便于排查问题OLLAMA_MAX_LOADED_MODELS:最多同时加载到内存中模型的数量,默认为1,即只能有 1 个模型在内存中

看看是不是已经启动了ollama。右下角图标如下 

如果没有,则去打开一下

黑窗口查看一下 版本

浏览器查看一下API服务:127.0.0.1:11434

 如果出现连接不上,则检查一下环境变量是不是配错了,是不是没有E盘(如果你照抄)。 

运行一个0.5b的qwen模型

<code>ollama run qwen2:0.5b

看看API访问情况: 

提问:

对话: 

① system 代表系统设定(也就是告诉chatGPT他的角色)

② user 表示用户

③ assistant 表示GPT的回复

三、安装方式二:linux版本docker

Olama现已作为官方Docker镜像提供 · Olama博客 - Ollama 中文

<code>docker run -d -v /home/ollama:/root/.ollama -p 11435:11434 --name ollama ollama/ollama

主机的/home/ollama文件夹映射到容器的/root/.ollama文件夹

主机的11435端口映射到容器的11434端口 

 

进入容器内部:

<code>docker exec -it ollama /bin/bash

 查看ollama执行

ollama

ollama serve    # 启动ollama

ollama create    # 从模型文件创建模型

ollama show        # 显示模型信息

ollama run        # 运行模型,会先自动下载模型

ollama pull        # 从注册仓库中拉取模型

ollama push        # 将模型推送到注册仓库

ollama list        # 列出已下载模型

ollama ps        # 列出正在运行的模型

ollama cp        # 复制模型

ollama rm        # 删除模型

<code># 本地模型列表

>ollama list

NAME ID SIZE MODIFIED

gemma2:9b c19987e1e6e2 5.4 GB 7 days ago

qwen2:7b e0d4e1163c58 4.4 GB 10 days ago

# 删除单个模型

>ollama rm gemma2:9b

deleted 'gemma2:9b'

>ollama list

NAME ID SIZE MODIFIED

qwen2:7b e0d4e1163c58 4.4 GB 10 days ago

# 启动本地模型

>ollama run qwen2:0.5b

>>>

# 运行中模型列表

>ollama ps

NAME ID SIZE PROCESSOR UNTIL

qwen2:0.5b 6f48b936a09f 693 MB 100% CPU 4 minutes from now

# 复制本地大模型:ollama cp 本地存在的模型名 新复制模型名

>ollama cp qwen2:0.5b Qwen2-0.5B

copied 'qwen2:0.5b' to 'Qwen2-0.5B'

>ollama list

NAME ID SIZE MODIFIED

Qwen2-0.5B:latest 6f48b936a09f 352 MB 4 seconds ago

qwen2:0.5b 6f48b936a09f 352 MB 29 minutes ago

qwen2:7b e0d4e1163c58 4.4 GB 10 days ago

四、 模型库

library (ollama.com)

五、运行模型

模型要求

 这里我们运行一个要求最小的0.5B的qwen模型

注意这是在容器内部运行的: 

<code>ollama run qwen2:0.5b

root@535ec4243693:/# ollama run qwen2:0.5b

pulling manifest

pulling 8de95da68dc4... 100% ▕████████████████████████████████████▏ 352 MB

pulling 62fbfd9ed093... 100% ▕████████████████████████████████████▏ 182 B

pulling c156170b718e... 100% ▕████████████████████████████████████▏ 11 KB

pulling f02dd72bb242... 100% ▕████████████████████████████████████▏ 59 B

pulling 2184ab82477b... 100% ▕████████████████████████████████████▏ 488 B

verifying sha256 digest

writing manifest

removing any unused layers

success

>>> 你是谁

我是来自阿里云的超大规模语言模型——通义千问。我能够理解、生产、传播各种语言和文字,可以回答您在任

何语言或任何问题的问题。

>>> Send a message (/? for help)

六、API服务

文档地址:

model:(必需)模型名称prompt:生成响应的提示suffix:模型响应后的文本images:(可选)base64 编码图像列表(对于多模态模型,例如llava)

高级参数(可选):

format:返回响应的格式。目前唯一接受的值是jsonoptions:Modelfile 文档中列出的其他模型参数,例如temperaturesystem:系统消息更改为(覆盖Modelfile)template:要使用的提示模板(覆盖Modelfile)context:从上一个请求返回的 context 参数 to ,这可用于保持较短的对话记忆/generatestream:如果响应将作为单个响应对象返回,而不是对象流falseraw:如果没有格式将应用于提示。如果您在对 API 的请求中指定了完整的模板化提示,则可以选择使用该参数truerawkeep_alive:控制模型在请求后加载到内存中的时间(默认值:5m)

curl --location --request POST 'http://127.0.0.1:11435/api/generate' \

--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \

--header 'Content-Type: application/json' \

--data-raw '{

"model": "qwen2:0.5b",

"prompt": "你知道麦克斯韦吗"

}'

curl --location --request POST 'http://127.0.0.1:11435/api/chat' \

--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \

--header 'Content-Type: application/json' \

--data-raw '{

"model": "qwen2:0.5b",

"messages": [

{

"role": "system",

"content": "你是一个历史专家"

},

{

"role": "user",

"content": "东北三省是哪三个?"

},

{

"role": "assistant",

"content": "东北三省是指中国东北地区(不含内蒙古)。它包括吉林省的延边朝鲜族自治州、黑龙江省的黑河市和哈尔滨市,以及辽宁省的抚顺市、本溪市、丹东市。其中,延边州包括临山子、龙沙等13个县市。"

},

{

"role": "user",

"content": "张作霖的势力是在这里兴起的吗"

}

],

"stream": false

}'

① system 代表系统设定(也就是告诉chatGPT他的角色)

② user 表示用户

③ assistant 表示GPT的回复

 API访问会激活模型,经过keep_alive的时间内(默认5m)如果没有访问,则会自动下线模型。当再次有API访问,则会再次自动激活模型。

如果keep_alive的值为零0,则是主动将模型下线。比如:

curl http://localhost:11434/api/chat -d '{

"model": "llama3.1",

"messages": [],

"keep_alive": 0

}'

七、python调用

temperature:用于调整生成结果的创造性程度,设置越高,生成的文本越新颖、越独特,设置越低,结果更集中。stream:默认false,是否流式传输回部分进度。format: 转录输出的格式,可选项包括json、str等。

ollama库调用

pip install ollama

import ollama

host = "127.0.0.1"

port = "11434"

client = ollama.Client(host=f"http://{host}:{port}")

res = client.chat(model="qwen2:0.5b",code>

messages=[{"role": "user", "content": "你是谁"}],

options={"temperature": 0})

print(res)

langchain调用 

pip install langchain

pip install langchain_community

from langchain_community.llms import Ollama

host="127.0.0.1"code>

port="11434" #默认的端口号为11434code>

llm=Ollama(base_url=f"http://{host}:{port}", model="qwen2:0.5b",temperature=0)code>

res=llm.invoke("你是谁")

print(res)

requests调用

pip install requests

host="127.0.0.1"code>

port="11434"code>

url = f"http://{host}:{port}/api/chat"

model = "qwen2:0.5b"

headers = {"Content-Type": "application/json"}

data = {

"model": model, #模型选择

"options": {

"temperature": 0. #为0表示不让模型自由发挥,输出结果相对较固定,>0的话,输出的结果会比较放飞自我

},

"stream": False, #流式输出

"messages": [{

"role": "system",

"content":"你是谁?"

}] #对话列表

}

response=requests.post(url,json=data,headers=headers,timeout=60)

res=response.json()

print(res)

aiohttp调用

pip install aiohttp

Welcome to AIOHTTP — aiohttp 3.10.5 documentation

import asyncio

import json

import aiohttp

host = "127.0.0.1"

port = "11434"

url = f"http://{host}:{port}/api/chat"

headers = {

'Content-Type': 'application/json'

}

payload = json.dumps({

"model": "qwen2:0.5b",

"options": {

"temperature": 0. # 为0表示不让模型自由发挥,输出结果相对较固定,>0的话,输出的结果会比较放飞自我

},

"messages": [

{"role": "system", "content": "你是一个历史砖家,专门胡说八道,混淆历史"},

{"role": "user", "content": "吕雉和吕不韦是啥关系?汉朝是大秦帝国的延续吗?"}

],

"stream": False

})

async def main():

start_time = asyncio.get_event_loop().time()

async with aiohttp.ClientSession() as session:

try:

async with session.post(url, headers=headers, data=payload, timeout=60) as response:

if response.status == 200:

data = await response.text()

print(data)

end_time = asyncio.get_event_loop().time()

elapsed_time = end_time - start_time

except asyncio.TimeoutError:

print("请求超时了")

finally:

print(f"耗时:0.0570秒")

if __name__ == '__main__':

asyncio.run(main())

八、模型添加方式

1.线上pull(推荐

即上述教程采用的方式。

2.导入 GGUF 模型文件(推荐
windows示例:
①.下载模型

从 HF 或者 ModeScope 下载了 GGUF 文件:qwen2-0_5b-instruct-q4_0.gguf

②.上传文件

新建一个文件夹来存放GGUF文件,例如我存放在E:\huggingface_models\qwen2-05b-q4中,在GGUF文件的同级,创建一个文件名为Modelfile的文件,该文件的内容如下:

<code>FROM ./qwen2-0_5b-instruct-q4_0.gguf

③.导入模型

打开Modelfile所在文件夹下打开终端,执行命令导入模型文件:

<code>ollama create 模型名称 -f ./Modelfile

ollama create qwen2-05b-q4 -f ./Modelfile

④.查看模型

导入成功之后,我们就可以通过<code>list命名,看到名为qwen2-05b-q4的本地模型了,后续可以和其他模型一样进行管理了。

⑤.运行模型

<code>ollama run qwen2-05b-q4:latest

Linux示例
①.在主机的/home/ollama文件夹下新建huggingface_models文件夹,
②.再在huggingface_models文件夹下新建qwen2-05b-q4文件夹。
③.将模型文件和Modelfile上传到上一步创建的qwen2-05b-q4文件夹中。

<code>/home/ollama/huggingface_models/qwen2-05b-q4

④.进入ollama容器

<code>docker exec -it ollama bash

⑤.cd 到映射的文件夹中

cd /root/.ollama/huggingface_models/qwen2-05b-q4

⑥. 执行导入模型命令

<code>ollama create qwen2-05b-q4 -f ./Modelfile

⑦.查看导入的模型

<code>ollama list

 

⑧.运行模型

<code>ollama run qwen2-05b-q4:latest

3.导入 safetensors 模型文件(多了一个将safetensors转换成gguf文件的过程)

示例

①.下载模型文件

从 HF 或者 ModeScope 下载了 safetensors 文件

https://huggingface.co/Qwen/Qwen2.5-0.5B/tree/main

模型所有文件上传到linux

在linux上新建一个文件夹huggingface_safetensors_models,再在里面新建一个文件夹qwen2-05b-q4,然后将模型所有文件上传进去

 

②.克隆ollama/ollama项目

git克隆,并设置python环境,最好是虚拟环境,防止依赖版本与其他项目冲突。可能会有类似下面的错误。博主使用的是conda,以此为例:

ollama/ollama: Get up and running with Llama 3.1, Mistral, Gemma 2, and other large language models. (github.com)

<code>git clone git@github.com:ollama/ollama.git ollama

进入项目中

<code>cd ollama

紧接着,同步 llm/llama.cpp 子模块

git submodule init

git submodule update llm/llama.cpp

③.设置环境

创建一个虚拟环境 

<code>conda create -n ollama python=3.11

 

激活虚拟环境 

<code>conda activate ollama

④.安装依赖

进入项目目录

<code>cd /home/ollama/ollama

 

执行安装命令

<code>pip install -r llm/llama.cpp/requirements.txt

 

如果报错,就多装几次,可能网络时间太长断开了。 

 ④.构建量化工具

如果没有make命令则安装一个make

<code>sudo apt update

sudo apt install make

如果没有gcc 和 g++ 编译器 则需要安装一下

sudo apt update

sudo apt install build-essential

下边这个可选(可以加速) 

sudo apt install ccache

 构建量化工具

make -C llm/llama.cpp quantize

 ⑤.模型转换

将 safetensors 转换为 converted.bin格式:

<code>python llm/llama.cpp/convert_hf_to_gguf.py 模型所在文件夹 --outtype f16 --outfile converted.bin

python llm/llama.cpp/convert_hf_to_gguf.py /home/ollama/huggingface_safetensors_models/qwen2-05b-q4 --outtype f16 --outfile converted.bin

注意:某些模型架构需要使用特定的转换脚本。例如,Qwen 模型需要运行 

1.outtype 指定了模型的格式,这里是 f16,也就是 float16 

2.生成的converted.bin文件在ollama项目的根目录下

⑥.生成llama系列文件

进入llama.cpp文件夹

<code>cd llm/llama.cpp/

执行make命令 

make

 

此时在llama.cpp文件夹下生成了一些列的llama文件,其中有一个llama-quantize是我们需要的。 

 

 ⑦.量化模型

回到ollama项目目录下

上面转换的事f16,也就是float16,此时的访问速度很慢,我们需要向量化来加快它的计算速度。

这里我们量化成q4,也就是int4:

<code>llm/llama.cpp/llama-quantize converted.bin quantized.bin q4_0

此时在ollama项目的根目录下生成了我们需要的文件quantized.bin,它与gguf文件作用相同

⑧.将quantized.bin文件放到我们的平时存放gguf文件的文件夹中:

我们将quantized.bin文件放到我们的平时存放gguf文件的文件夹中,比如我放到了huggingface_models,在huggingface_models中新建了一个文件夹qwen2-05b-q4-s来存放。

<code>cp /home/ollama/ollama/quantized.bin /home/ollama/huggingface_models/qwen2-05b-q4-s/quantized.bin

在 quantized.bin同级新建Modelfile文件,内容如下

<code>FROM quantized.bin

⑨.导入模型文件:ollama create 模型名称 -f ./Modelfile

进入ollama容器中

docker exec -it ollama bash

进入存放模型的文件夹中

cd /root/.ollama/huggingface_models/qwen2-05b-q4-s

 执行命令,创建Ollama模型

<code>ollama create qwen2-05b-q4-s -f ./Modelfile

 ⑩.查看模型

<code>ollama list

 

⑪.运行模型

<code>ollama run qwen2-05b-q4-s:latest

九、部署Open WebUI

 🏡 Home | Open WebUI



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。