在开源通用大模型已经很多的今天,我们为什么要自定义一个AI大模型?
这所谓名不正则言不顺,只有搞清楚自定义AI大模型的意义是什么,才能有针对性的去搞清楚怎样自定义AI大模型!在我看来主要有以下几点原因:
- 通用的AI大模型难以满足垂直领域的业务需要,定制AI大模型可以基于业务流程,在融合行业术语等具体内容后提升大模型推理检索的准确性;
- 在自定义AI大模型的过程中可以通过硬件适配、模型压缩等技术,降低大模型的计算成本,提升大模型的推理速度;
- 一些对数据安全有特殊要求的行业,自定义AI大模型可以满足数据安全;
- 自定义AI大模型可以申请技术专利,提升企业差异化竞争力。
一、自定义模型基本流程
大家先不用管 Modelfile 文件里写入内容的具体含义,先按下面流程操作,熟悉自定义AI大模型的流程!
- 创建一个名为 Modelfile 的文件
- 编辑 Modelfile 文件,写入下面内容
FROM ./vicuna-33b.Q4_0.gguf
- 创建AI大模型
ollama create example -f Modelfile
- 运行AI大模型
ollama run example
通过以上四步,我们就可以得到一个自定义的AI大模型,这只是一个最简单的演示案例,实际业务使用的AI大模型自定义会比这更复杂,接下来我们将进行详细说明!
二、导入AI大模型
AI大模型都是通过在 Modelfile 文件中使用 FROM 命令导入的,接下来将详细讲解四种常用的导入方式。
2.1 通过 safetensors 权重文件导入基础模型
导入命令:
FROM /path/to/safetensors/directory
说明:
- FROM 命令后面跟随的文件夹中必须包含要导入的 Safetensors 格式的模型权重文件;
- Safetensors 是由 Hugging Face 开发的一种更高效更安全的模型权重文件存储格式,专为存储大型张量数据而设计的;
- 如果创建的 Modelfile 文件和权重文件在同一个文件夹下时,可以简化命令为 FROM .
2.2 通过预训练过的适配器文件导入Safetensors 权重文件
导入命令:
FROM <base model name>
ADAPTER /path/to/safetensors/adapter/directory
说明:
- 通过 FROM 指定预训练需要的基础模型,通过 ADAPTER 指定适配器文件夹路径
- 指定的基础模型需要和预训练的适配器必须是同一个基础大模型
- 大部分的不同框架使用的量化方法不相同,因此最好使用无量化的适配器
- 如果 Modelfile 文件和适配器文件在同一个文件夹下时,命令可以简化为 FROM .
2.3 导入 GGUF 格式的基础模型
导入命令:
FROM /path/to/file.gguf
说明:
- FROM 命令后面的路径就是 GGUF格式的模型文件
- 可以通过 Llama.cpp 提供的 convert_hf_to_gguf.py 脚本将一个Safetensors 格式的模型转换为 GGUF 格式
- 同样,也可以通过 Llama.cpp 提供的 convert_lora_to_gguf.py 脚本将一个 Safetensors 格式的适配器文件转换为 GGUF 适配器文件
2.4 导入 GGUF 格式的适配器
导入命令:
FROM
ADAPTER /path/to/file.gguf
说明:
- 通过 FROM 指定预训练需要的 GGUF 格式的基础模型,通过 ADAPTER 指定适配器文件夹路径
- 指定的 GGUF 格式基础模型需要和预训练的适配器是同一个模型。
三、Modelfile 详解
命令 | 说明 |
FROM (required) | 导入要使用的基础模型 |
PARAMETER | 设置 ollama 运行模型时的参数 |
TEMPLATE | 发送给模型的提示词模板 |
SYSTEM | 指定设置到模板中的系统消息 |
ADAPTER | 定义要提供给模板的(Q)LoRA 适配器 |
LICENSE | 指定License |
MESSAGE | 指定消息历史 |
3.1 命令说明
- FROM(必需)
FROM 指令定义创建模型时要使用的基础模型。
FROM <模型名称>:<标签>
可用基础模型列表:
https://github.com/jmorganca/ollama#model-library
从 bin 文件构建
FROM ./ollama-model.bin
应将此bin文件位置指定为绝对路径或相对于 Modelfile 位置的路径。
- PARAMETER
PARAMETER指令定义在运行模型时可以设置的参数
PARAMETER <参数> <参数值>
- 有效参数和值
参数 | 描述 | 值类型 | 示例用法 |
mirostat | 启用 Mirostat 采样以控制困惑度。(默认值: 0, 0 = 禁用, 1 = Mirostat, 2 = Mirostat 2.0) | 整数 | mirostat 0 |
mirostat_eta | 影响算法对生成文本反馈的响应速度。较低的学习率会导致调整速度较慢,而较高的学习率会使算法更具响应性。(默认值: 0.1) | 浮点数 | mirostat_eta 0.1 |
mirostat_tau | 控制输出的连贯性和多样性之间的平衡。较低的数值会导致更加聚焦和连贯的文本。(默认值: 5.0) | 浮点数 | mirostat_tau 5.0 |
num_ctx | 设置用于生成下一个 Token 的上下文窗口大小。(默认值: 2048) | 整数 | num_ctx 4096 |
num_ gqa | Transformer 层中的 GQA 组数。某些模型需要,例如 llama2:70b 需要设置为 8 | 整数 | num_ gqa 1 |
num_gpu | 发送到 GPU 的层数。在 macOS 上,默认值为 1 以启用 Metal 支持,为 0 则禁用。 | 整数 | num_gpu 50 |
num_thread | 设置计算过程中要使用的线程数。默认情况下,Ollama 会检测以获得最佳性能。建议将此值设置为系统实际物理 CPU 核心数(而非逻辑核心数)。 | 整数 | num_thread 8 |
repeat_ last_ n | 设置模型回顾以避免重复的范围。(默认值: 64, 0 = 禁用, -1 = num_ctx) | 整数 | repeat_ last_ n 64 |
repeat_penalty | 设置惩罚重复的强度。较高的值(例如 1.5)会更严厉地惩罚重复,而较低的值(例如 0.9)会更宽容。(默认值: 1.1) | 浮点数 | repeat_penalty 1.1 |
temperature | 模型的温度。增加温度会使模型更具创造性。(默认值: 0.8) | 浮点数 | temperature 0.7 |
seed | 设置用于生成的随机数种子。将其设置为特定数字将使模型对相同提示生成相同的文本。(默认值: 0) | 整数 | seed 42 |
stop | 设置要使用的停止序列。当遇到此模式时,LLM 将停止生成文本并返回。可以通过在模型文件中指定多个单独的 stop 参数来设置多个停止模式。 | 字符串 | stop "AI assistant:" |
tfs_z | 尾部自由采样用于减少输出中较不可能的 Token 的影响。较高的值(例如 2.0)会更大程度地减少影响,而值为 1.0 则禁用此设置。(默认值: 1) | 浮点数 | tfs_z 1 |
num_predict | 生成文本时要预测的最大 Token 数。 (默认值: 128, -1 = 无限生成, -2 = 填充上下文) | 整数 | num_predict 42 |
top_k | 减少生成无意义文本的概率。较高的值(例如 100)会给出更多样化的答案,而较低的值(例如 10)会更保守。(默认值: 40) | 整数 | top_k 40 |
top_p | 与 top-k 一起使用。较高的值(例如 0.95)会导致更多样化的文本,而较低的值(例如 0.5)会生成更聚焦和保守的文本。(默认值: 0.9) | 浮点数 | top_p 0.9 |
- TEMPLATE
该模板将传递到模型中。它可以包括(可选)系统消息、用户消息和模型的响应。
注意:语法可能是特定于模型的。模板使用Go 模板语法。
- 模板变量
在模板中,我们使用以下变量来表示不同部分的内容:
变量 | 描述 |
{{ .System }} | 用于指定自定义行为的系统消息。 |
{{ .Prompt }} | 用户提示消息。 |
{{ .Response }} | 模型生成的回复。在生成回复时,此变量后的文本将被省略。 |
TEMPLATE """{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
"""
- SYSTEM
SYSTEM 指令用于指定模板中要使用的系统消息。
SYSTEM """"""
- ADAPTER
ADAPTER 指令用于指定要应用于基础模型的 LoRA 适配器。
该指令的值应为绝对路径或相对于 Modelfile 的路径,并且文件必须采用 GGML 文件格式。
适配器应该是从基础模型调整过的,否则行为是不确定的。
ADAPTER ./ollama-lora.bin
- LICENSE
LICENSE 指令允许您指定在使用此 Modelfile 的模型下共享或分发的法律许可。
LICENSE """
<许可证文本>
"""
- MESSAGE
MESSAGE 指令允许您为模型指定消息历史记录,以便在响应时使用。
使用多个 MESSAGE 命令的迭代来构建对话,这将引导模型以类似的方式回答。
MESSAGE <角色> <消息>
- 有效角色
system:为模型提供系统消息的替代方式。
user:用户可能会提出的示例消息。
assistant:模型应该如何回应的示例消息。
- 示例对话
MESSAGE user 多伦多在加拿大吗?
MESSAGE assistant 是的
MESSAGE user 萨克拉门托在加拿大吗?
MESSAGE assistant 不是
MESSAGE user 安大略在加拿大吗?
MESSAGE assistant 是的
- 注意事项
Modelfile 不区分大小写。
在示例中,使用大写指令是为了更容易区分它与参数。
指令可以以任何顺序出现。在示例中,FROM 指令首先出现是为了使其易于阅读。
3.2 创建一个基础的小学生作文创作助手(essay-assistant)的 Modelfile 示例
FROM qwq:latest
# 设置温度为1[ 温度越高,创造性越强;温度越低,连贯性越好]
PARAMETER temperature 1
# 将上下文窗口大小设置为4096, 这控制了LLM可以使用多少标记作为上下文来生成下一个标记
PARAMETER num_ctx 4096
# 设置自定义系统消息以指定聊天助手的行为
SYSTEM 你是一个小学学生,你擅长创作小学语文作文。
使用方法:
- 将其保存为文件(Modelfile)
- 执行以下命令
ollama create <模型名称 essay-assistant> -f <文件位置,如 .modelfile>
ollama run essay-assistant
四、发布自定义的AI大模型
自定义AI大模型只有发布后,才可以共享给别人使用。可以按下面的操作流程进行发布
- 在Ollama平台注册一个帐户
- 添加公钥到 Ollama 帐户下
macOS: cat ~/.ollama/id_ed25519.pub
Windows: type %USERPROFILE%\.ollama\id_ed25519.pub
Linux: cat /usr/share/ollama/.ollama/id_ed25519.pub
- 将模型复制到用户名空间下
ollama cp example /example
- 推送模型
ollama push /example
- 推送成功后,自定义的模型就在 ollama.com/用户名/example 上可用