2月13日-14日 | Task02:Ollama 自定义导入模型[Ollama自定义导入模型](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型) | 截止时间 02月15日03:00 |
---|---|---|
llama_httpsdatawhalechinagithubiohandyollamaC31_idollama_4">[Ollama 自定义导入模型](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=ollama-自定义导入模型)
llamaC31_id_6">[简介](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=简介)
本节学习如何使用 Modelfile 来自定义导入模型,主要分为以下几个部分:
- 从 GGUF 导入
- 从 Pytorch 或 Safetensors 导入
- 由模型直接导入
- 自定义 Prompt
llamaC31_idgguf_15">[一、从 GGUF 导入](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=一、从-gguf-导入)
GGUF (GPT-Generated Unified Format) 是一种文件格式,用于保存经过微调的语言模型。这种格式旨在帮助用户方便地在不同的平台和环境之间共享和导入模型。它支持多种量化格式,可以有效减少模型文件的大小。
它的前身是 GGML(GPT-Generated Model Language),是专门为了机器学习而设计的 Tensor 库,目的是为了有一个单文件的格式,并且易在不同架构的 CPU 以及 GPU 上可以推理,但后续由于开发遇到了灵活性不足、相容性及难以维护的问题。
Ollama 支持从 GGUF 文件导入模型,通过以下步骤来实现:
- 下载
.gguf
文件
下载链接:https://huggingface.co/RichardErkhov/Qwen_-_Qwen2-0.5B-gguf/resolve/main/Qwen2-0.5B.Q3_K_M.gguf?download=true
为了演示的方便,我们选用了 Qwen2-0.5B 模型。下载后复制到第一部分的根目录下
- 新建创建 Modelfile 文件
FROM ./Qwen2-0.5B.Q3_K_M.ggufCopy to clipboardErrorCopied
- 在 Ollama 中创建模型
ollama create mymodel -f ModelfileCopy to clipboardErrorCopied
- 终端内运行模型(实测在 notebook 中运行不出来,最好在终端运行)
ollama run mymodelCopy to clipboardErrorCopied
llamaC31_idpytorchsafetensors_49">[二、从 Pytorch 或 Safetensors 导入](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=二、从-pytorch-或-safetensors-导入)
Safetensors 是一种用于存储深度学习模型权重的文件格式,它旨在解决安全性、效率和易用性方面的问题。目前这部分功能还有待社区成员开发,目前文档资源有限。
如果正在导入的模型是以下架构之一,则可以通过 Modelfile 直接导入 Ollama。当然,你也可以将 safetensors 文件转换为 gguf 文件,再进行处理,转换过程可以参考第三部分。
有关 safetensors 以及 GGUF 更详细的信息可以参考这个链接进行学习 https://www.linkedin.com/pulse/llama-3-safetensors-vs-gguf-talles-carvalho-jjcqf
- LlamaForCausalLM
- MistralForCausalLM
- GemmaForCausalLM
由于这部分内容社区还在不断优化中,因此,这里提供的示例代码和流程仅供参考,并不保证能成功运行。详情请参考官方文档。
- 下载 llama-3 模型
!pip install huggingface_hubCopy to clipboardErrorCopied
# 下载模型
from huggingface_hub import snapshot_downloadmodel_id = "unsloth/llama-3-8b-bnb-4bit"
snapshot_download(repo_id=model_id, local_dir="llama-3-8b-bnb-4bit",local_dir_use_symlinks=False,revision="main",# 怎么获取<YOUR_ACCESS_TOKEN>,请参照部分3use_auth_token="<YOUR_ACCESS_TOKEN>")Copy to clipboardErrorCopied
- 根目录下创建 Modelfile 文件,内容如下:
FROM ./llama-3-8b-bnb-4bitCopy to clipboardErrorCopied
- 在 Ollama 中创建模型
ollama create mymodel2 -f ModelfileCopy to clipboardErrorCopied
- 运行模型
ollama run mymodel2Copy to clipboardErrorCopied
llamaC31_id_98">[三、由模型直接导入](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=三、由模型直接导入)
正常来说,我们在 HuggingFace 接触到的模型文件非常之多,庆幸的是,hf 提供了非常便捷的 API 来下载和处理这些模型,像上面那样直接下载受限于网络环境,速度非常慢,这一小段我们来使用脚本以及 hf 来完成。
llama.cpp 是 GGUF 的开源项目,提供 CLI 和 Server 功能。
对于不能通过 Ollama 直接转换的架构,我们可以使用 llama.cpp 进行量化,并将其转换为 GGUF 格式,再按照第一种方式进行导入。 我们整个转换的过程分为以下几步:
llamaC31_id_31huggingfacemodel_111">[3.1 从 HuggingFace 下载 Model](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=_31-从-huggingface-下载-model)
最直觉的下载方式是通过git clone或者链接来下载,但是因为llm每部分都按GB计算,避免出现 OOM Error(Out of memory)
,我们可以使用 Python 写一个简单的 download.py。
首先应该去hf拿到用户个人的 ACCESS_TOKEN
,打开 huggingface 个人设置页面。
至此,我们就拿到了一个 ACCESS_TOKEN
,接下来我们使用 huggingface_hub
的 snapshot_download
下载模型,我们这里选择的还是 Qwen-0.5b。
!pip install huggingface_hubCopy to clipboardErrorCopied
from huggingface_hub import snapshot_downloadmodel_id = "Qwen/Qwen1.5-0.5B" # hugginFace's model name
snapshot_download(repo_id=model_id, local_dir="Qwen-0.5b",local_dir_use_symlinks=False,revision="main",use_auth_token="<YOUR_ACCESS_TOKEN>")Copy to clipboardErrorCopied
我们cd到第三部分的目录下执行,下载时间可能会很长,耐心等待。
llamacpp_httpsdatawhalechinagithubiohandyollamaC31_id_32llamacpp_140">[3.2 使用 llama.cpp 进行转换](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=_32-使用-llamacpp-进行转换)
llama.cpp 是 GGML 主要作者基于最早的 llama 的 c/c++ 版本开发的,目的就是希望用 CPU 来推理各种 LLM,在社群的不断努力下现在已经支持大多数主流模型,甚至包括多模态模型。
首先我们克隆 llama.cpp 库到本地,与下载的模型放在同一目录下:
git clone https://github.com/ggerganov/llama.cpp.gitCopy to clipboardErrorCopied
由于使用 llama.cpp 转换模型的流程基于 python 开发,需要安装相关的库,推荐使用 conda 或 venv 新建一个环境。
cd llama.cpp
pip install -r requirements.txt
python convert_hf_to_gguf.py -hCopy to clipboardErrorCopied
如果显示以下内容,说明转换程序已经准备好了。
接下来,我们把刚刚从 HuggingFace 下载的模型转换为 GGUF 格式,具体使用以下脚本:
python convert_hf_to_gguf.py ../Qwen-0.5b --outfile Qwen_instruct_0.5b.gguf --outtype f16Copy to clipboardErrorCopied
可以看到 llama.cpp 目录下多了一个 Qwen_instruct_0.5b.gguf 文件,这个过程只需要几秒钟。
为了节省推理时的开销,我们将模型量化,接下来我们开始量化实操。
llamacpphttpsdatawhalechinagithubiohandyollamaC31_id_33llamacpp_174">[3.3 使用llama.cpp进行模型量化](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=_33-使用llamacpp进行模型量化)
模型量化是一种技术,将高精度的浮点数模型转换为低精度模型,模型量化的主要目的是减少模型的大小和计算成本,尽可能保持模型的准确性,其目标是使模型能够在资源有限的设备上运行,例如CPU或者移动设备。
同样的,我们先创建 Modelfile 文件,再使 用 ollama create
命令来从 gguf 文件中创建我们的模型,不过与第一步稍有不同的是,我们添加了量化逻辑,只需要在执行 ollama create
是添加一个参数即可。
首先把上一步拿到的 Qwen_instruct_0.5b.gguf 移动至第三部分的根目录下,再创建 Modelfile 文件编写以下内容.
FROM ./Qwen_instruct_0.5b.ggufCopy to clipboardErrorCopied
终端运行创建和量化脚本。
# 第三部分根目录下
ollama create -q Q4_K_M mymodel3 -f ./ModelfileCopy to clipboardErrorCopied
到此,我们的模型就量化并创建完成了,接下来我们就可以运行模型了。
llamaC31_id_34_197">[3.4 运行并上传模型](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=_34-运行并上传模型)
使用 gguf 运行模型的步骤详见第一部分,这里不再赘述。
果本地保存的模型文件太占用空间,可以上传 gguf 模型到 huggingface 的自己的 repo 中,同步骤一的思想,我们可以写一个 upload 的逻辑。
Tip
如果想完成上传,你的 HF_ACCESS_TOKEN 权限必须要为 write,并且要修改你的 model_id,your_hf_name 指的是你 huggingface 账号名称。
from huggingface_hub import HfApi
import osapi = HfApi()
HF_ACCESS_TOKEN = "<YOUR_HF_WRITE_ACCESS_TOKEN>"
#TODO 这里需要设置你的model_id
#例如 model_id = "little1d/QWEN-0.5b"
model_id = "your_hf_name/QWEN-0.5b"api.create_repo(model_id,exist_ok=True,repo_type="model", # 上傳格式為模型use_auth_token=HF_ACCESS_TOKEN,
)
# upload the model to the hub
# upload model name includes the Bailong-instruct-7B in same folder
for file in os.listdir():if file.endswith(".gguf"):model_name = file.lower()api.upload_file(repo_id=model_id,path_in_repo=model_name,path_or_fileobj=f"{os.getcwd()}/{file}",repo_type="model", # 上傳格式為模型use_auth_token=HF_ACCESS_TOKE)Copy to clipboardErrorCopied
上传完成后就可以在自己的 hf 仓库中看到啦!
llamaC31_idprompt_241">[四、自定义 Prompt](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=四、自定义-prompt)
Ollama 支持自定 义Prompt,可以让模型生成更符合用户需求的文本。
自定义 Prompt 的步骤如下:
- 根目录下创建一个 Modelfile 文件
FROM llama3.1
# sets the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1
# sets the context window size to 4096, this controls how many tokens the LLM can use as context to generate the next token
PARAMETER num_ctx 4096# sets a custom system message to specify the behavior of the chat assistant
SYSTEM You are Mario from super mario bros, acting as an assistant.Copy to clipboardErrorCopied
- 创建模型
ollama create mymodel -f ./ModelfileCopy to clipboardErrorCopied
创建模型的时间可能稍微会久一点,和 pull 一个模型的时间差不多,请耐心等待。
再次运行 ollama list
查看已有的模型,可以看到 mymodel 已经正确创建了。
- 运行模型
ollama run mymodelCopy to clipboardErrorCopied
可以看到,我们的小羊驼 🦙 已经变成了 Mario!自定义 Prompt 成功!😘😘
llamaC31_id_286">[参考链接](https://datawhalechina.github.io/handy-ollama/#/C3/1. 自定义导入模型?id=参考链接)
- https://www.linkedin.com/pulse/llama-3-safetensors-vs-gguf-talles-carvalho-jjcqf
- https://www.sysgeek.cn/ollama-on-windows
- https://ollama.com/blog/openai-compatibility
python包的安装
更新 apt 包索引
首先,尝试更新你的 apt 包索引,这有时能解决一些下载问题:
sudo apt update
- 安装
**python3-venv**
包:
运行以下命令来安装缺少的 python3-venv
包:
sudo apt install python3.10-venv
这将安装创建虚拟环境所需要的工具。
- 重新创建虚拟环境:
安装完 python3-venv
后,重新执行你之前的虚拟环境创建命令:
python3 -m venv ldd_huggingface_hub_env
- 激活虚拟环境:
创建成功后,使用以下命令来激活虚拟环境:
source ldd_huggingface_hub_env/bin/activate
- 安装
**huggingface_hub**
:
进入虚拟环境后,你可以安装所需的库:
pip install huggingface_hub
- 运行脚本:
安装完依赖后,运行你的 Python 脚本:
python download_model.py
删除模型
llama_remove__358">1. 使用 **ollama remove**
命令
Ollama 提供了 ollama remove
命令来删除本地模型。例如,要删除名为 qwen:0.5b
的模型,可以执行:
ollama remove qwen:0.5b
如果模型没有版本号,可以直接执行:
ollama remove qwen
2. 手动删除模型文件
如果 ollama remove
无法成功删除模型,您可以手动删除存储模型的文件夹。Ollama 的模型默认存储在:
可以使用以下命令手动删除:
rm -rf ~/.ollama/models/qwen*
或者:
rm -rf ~/.ollama/models/*`模型名称`*
然后运行 ollama list
确保模型已被删除。