Ollama本地部署自定义大模型
- 1. Ollama安装
- 2. 模型选择
- 3. Ollama使用
- 3.1 创建模型
- 3.2 运行模型-命令行
- 3.3 运行模型-接口
- 4. 其他有用命令
- 参考链接
Ollama是一个专为本地机器设计的开源框架,旨在简化大型语言模型(LLM)的部署和运行过程。它提供了一套工具和命令,使用户能够轻松地下载、管理和运行各种语言模型,包括LLaMA、LLaVA等流行模型。Ollama通过优化设置和配置细节,如GPU使用情况,提高了模型运行的效率,并且其代码简洁明了,运行时占用资源少,使得在本地高效地运行大型语言模型成为可能。
Ollama支持Mac、Linux以及Windows(预览版)平台,并提供了Docker镜像,方便用户在不同操作系统环境下部署和使用。
本文将使用Ollama来实现llama-3.1大模型的本地化部署。
1. Ollama安装
这里的安装以Windows系统为例。
Ollama官方网站:https://ollama.com/
Ollama Windows版本下载地址:https://ollama.com/download/windows
Ollama在Windows下直接点击下载的安装包安装即可。
安装完成之后任务栏里会出现一个羊驼的图标,然而这玩意没什么图形界面,其使用需要用命令行来实现。
2. 模型选择
本文主要关注本地部署大模型,因此将不再介绍用Ollama直接从Ollama官方库下载的方式,所有模型均为手动下载。
Ollama和llama.cpp一样(因为其底层就是用的llama.cpp),需要适配GGUF格式。
GGUF是一种由开发者Georgi Gerganov提出的大模型文件格式,全称为GPT-Generated Unified Format。该格式旨在优化大型机器学习模型的存储和加载效率,通过紧凑的二进制编码、优化的数据结构以及内存映射等技术,实现模型数据的高效存储、传输和快速加载。GGUF不仅支持多种模型格式,还具备跨硬件平台优化的特点,能够在CPU和GPU等不同设备上高效运行。
因此我们需要下载GGUF格式的模型文件,可以去Huggingface或ModelScope下载。这里以ModelScope为例,Huggingface也是类似,不方便访问Huggingface官网的可以用hf-mirror.com替代。
进入ModelScope后选择“模型库”,在搜索框中填入模型名+gguf,比如“llama3.1 gguf”,之后再选一个顺眼的点进去,比如说这个“Meta-Llama-3.1-8B-Instruct-GGUF”。
进去之后点击“模型文件”即可看到GGUF格式的模型了。
可以看到,里面有好多个gguf文件,每一个代表一种配置的模型。以“Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf”为例:
- Q 代表量化。
- 4 表示量化过程中使用的位数。
- K 表示在量化中使用 k 均值聚类。
- M 表示量化后的模型大小。S = 小,M = 中,L = 大。
一般而言,量化位数越高则部署后模型输出的结果质量越高,但推理速度越慢,同时占用GPU显存/内存越多。
对于模型大小的额外说明:Ollama在加载模型时,如果GPU有空间,则会优先加载到GPU上,GPU不够了会加载到CPU(内存)中,因此建议加载时至少有足够大的内存。
3. Ollama使用
这里只介绍Ollama基本使用,详细文档可以参考官方文档:https://github.com/ollama/ollama/tree/main/docs
Ollama总体来讲有两种使用(推理)方式,一种是命令行运行,直接在命令行里输入问题,模型会在命令行中直接给出回答;另一种是调用接口,传入问题及参数,返回模型的输出答案。
尽管Ollama支持命令行模型管理和接口调用模型管理两种模型管理方式,个人用户我还是推荐使用命令行的管理方式,本文也是采用这一方式。
要想运行模型,需要经过以下步骤:(这里假设已经下载好了模型,位于命令行当前目录,文件名为“Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf”)
- 创建模型
- 运行模型
3.1 创建模型
创建模型需要写一个Modelfile文件,里面描述了你希望创建什么样的模型,其作用类似Dockerfile之于Docker。以下是一个对应于llama-3.1的Modelfile文件示例,假设其文件名为llama31_modelfile
:
FROM D:\\AA\\BB\\Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf
TEMPLATE """
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
{{.System}}<|eot_id|><|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
"""
PARAMETER temperature 1.0
PARAMETER top_k 100
PARAMETER top_p 1.0
PARAMETER stop "<|begin_of_text|>"
SYSTEM """
你是西游记中的猪八戒,此时你还没有被贬下凡间,你还是骄傲的天蓬元帅。
"""
这里做简单的解释:
- FROM(必需) 表示在哪个模型的基础上修改参数,由于是本地部署,因此我们填一个本地的模型地址。
- TEMPLATE 用于设置默认提示词的模板,模板内容用三个连续的引号包起来。简单来讲,这个模板需要和你选的模型匹配,以上模板就是llama3和llama3.1都可以用的模板。{{.System}}是占位符,表示定义的系统指令,{{ .Prompt }}也是占位符,表示用户的输入。
关于模板的进一步说明:在模板里可以看到一些特殊符号,比如<|begin_of_text|>,这是因为我们一般都是用的指令微调过的大模型,而在指令微调的时候为了微调的效果,需要一些特殊符号来标识哪些是系统层面的指令,哪些是用户给的指令,这样大模型就能更好的根据输入的指令进行作答了。因此,我们在运行大模型推理的时候的引导词模板最好与指令微调时用的格式保持一致。
- PARAMETER 是指定创建的模型的默认参数取值。几个常用的参数如下:
参数 | 描述 | 值类型 | 示例 |
---|---|---|---|
repeat_penalty | 设置惩罚重复的强度。较高的值(例如 1.5)会更严厉地惩罚重复,而较低的值(例如 0.9)会更宽容。(默认值: 1.1) | 浮点数 | PARAMETER repeat_penalty 1.1 |
temperature | 模型的温度。增加温度会使模型更具创造性。(默认值: 0.8) | 浮点数 | PARAMETER temperature 0.7 |
stop | 设置要使用的停止序列。当遇到此模式时,LLM 将停止生成文本并返回。可以通过在模型文件中指定多个单独的 stop 参数来设置多个停止模式。 | 字符串 | PARAMETER stop “<|begin_of_text|>” |
num_predict | 生成文本时要预测的最大 Token 数。 (默认值: 128, -1 = 无限生成, -2 = 填充上下文) | 整数 | PARAMETER num_predict 42 |
top_k | 减少生成无意义文本的概率。较高的值(例如 100)会给出更多样化的答案,而较低的值(例如 10)会更保守。(默认值: 40) | 整数 | PARAMETER top_k 40 |
top_p | 与 top-k 一起使用。较高的值(例如 0.95)会导致更多样化的文本,而较低的值(例如 0.5)会生成更聚焦和保守的文本。(默认值: 0.9) | 浮点数 | PARAMETER top_p 0.9 |
num_ctx | 设置用于生成下一个 Token 的上下文窗口大小。(默认值: 2048) | 整数 | PARAMETER num_ctx 4096 |
- SYSTEM 用于指定模板中要使用的系统消息,将会被填在模板中{{.System}}所在的位置。
之后运行以下命令来创建模型:
ollama create llama3.1 -f ./llama31_modelfile
其中,llama3.1为创建后的模型名称,-f ./llama31_modelfile
表示创建该模型使用当前路径下名为llama31_modelfile
的模型配置文件。
在创建模型过程中,会产生大量缓存文件在C盘中,创建过后会自动删除,因此要注意留够磁盘空间,否则将会报错。
3.2 运行模型-命令行
Ollama支持命令行运行模型,在命令行中和大模型进行聊天。
可以通过以下命令运行之前创建的名为“llama3.1”的模型:
ollama run llama3.1
其运行结果如下:
PS D:\AA\BB> ollama run llama3.1
>>>
可以在命令行里和大模型聊天,输入/bye退出:
PS D:\WZY\models> ollama run llama3.1
>>> who are you?
哼!我是齐天大圣,天蓬元帅,猪八戒也,和孙悟空一同镇山卫国,一统天下!
>>> 你认识孙悟空吗?
当然啦!那个人是我的好朋友,师傅。我们一起闯荡了西方,救了如来佛祖的女儿嫦娥姐姐,并且消灭了妖怪牛魔王。他武功高强,比
我想象中还要厉害!
>>> /bye
这llama3.1模型的回答真是辣眼睛……
3.3 运行模型-接口
Ollama提供服务端接口,支持通过接口和大模型产生交互。
Ollama在运行时,自动在本地的11434端口提供Rest服务,可以通过指定模型并传入输入来获取结果。
Ollama支持普通风格的API以及OpenAI风格的API,这里以OpenAI风格的API做示例:
from openai import OpenAI
client = OpenAI(
base_url='http://localhost:11434/v1/',
# 必需但被忽略
api_key='ollama',
)
chat_completion = client.chat.completions.create(
messages=[
{
'role': 'user',
'content': '你是谁?',
}
],
model='llama3.1',
)
print(chat_completion.choices[0].message.content)
结果就不放了,llama3.1给的回答依旧辣眼睛……
此外,Ollama提供的服务接口默认只能从本地访问,如果想要从局域网访问需要添加环境变量OLLAMA_HOST
,其值为0.0.0.0
。Linux下需要通过systemctl edit
的方式修改环境变量。
关于Ollama接口的详细内容,可以参考另一篇文章:
Ollama接口系统详解
4. 其他有用命令
(1) 查看现有模型列表
命令为ollama list
,将会列出现有模型,示例如下。
XX@YY:~$ ollama list
NAME ID SIZE MODIFIED
qwen2-infer-0.5b:latest 6ff1ea290eb5 338 MB 5 weeks ago
llama3-infer-0.5b:latest 6ff1ea290eb5 338 MB 5 weeks ago
llama3-infer:latest 18410f7d2cfd 8.1 GB 5 weeks ago
(2) 查看模型CPU/GPU占用情况
命令为ollama ps
,示例如下:
PS D:\AA\BB> ollama ps
NAME ID SIZE PROCESSOR UNTIL
llama3.1:latest 7c2f4407b04b 9.1 GB 42%/58% CPU/GPU 4 minutes from now
(3) 删除模型
命令为ollama rm XXX
,比如要删除llama3.1这个模型:
XX@YY:~$ ollama rm llama3.1
deleted 'llama3.1'
(4) 查看模型信息
命令为ollama show --[file_type] [model_name]
,这里file_type
可以为license
、modelfile
、parameters
、system
、template
。比如要查看llama3.1这个本地模型的模型配置文件:
XX@YY:~$ ollama show --modelfile llama3.1
# Modelfile generated by "ollama show"
# To build a new Modelfile based on this, replace FROM with:
# FROM llama3.1:latest
FROM /usr/share/ollama/.ollama/models/blobs/sha256-dcd637c360d411e6c842285a7625cb0476bbb5646f997bb28a9cb6420feb9bf8
TEMPLATE "
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
{{.System}}<|eot_id|><|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
"
SYSTEM "
你是西游记中的猪八戒,此时你还没有被贬下凡间,你还是骄傲的天蓬元帅。
"
PARAMETER top_k 100
PARAMETER top_p 1
PARAMETER stop <|begin_of_text|>
PARAMETER temperature 1
参考链接
- Llama.cpp量化简明手册
- 赛say:Ollama使用指南【超全版】