前言

环境介绍:使用的Python版本为3.12.4且需要科学上网,对电脑性能有一定需求(但也没那么离谱)

相信不少人已经体验过Ai带来的便利了,甚至在工作上使用Ai加以辅助。本文是对那些对Ai产生兴趣且希望在自己的设备上实际运行大语言模型的人而准备,希望可以通过这篇文章来让更多人认识和了解Ai。本文是基于ollama创建和部署大语言模型,下面就开始进入正文。

ollama是什么?

ollama是一个管理大语言模型的工具,帮助我们在本地快速创建、部署、使用大语言模型。它本身并不是一个大语言模型!还有一个名词llama,它跟ollama很像,但是区别可就大了。llama是由Meta开发的大语言模型,所以我们可以使用ollama加载llama这样的大语言模型。

安装ollama

进入ollama官网,点击下载按钮,安装到自己电脑上即可。安装完成后可以使用ollama -v测试是否安装成功

image-20240927135638565

使用ollama运行llama3.2模型

我们先简单启动一个模型进行测试,我们以Meta最新的llama3.2的1b模型为例,执行下面命令可以自动安装并启动llama3.2模型。

1
ollama run llama3.2:1b

在模型启动后,我们可以进行一些简单的对话,不过最好使用英文,因为llama3目前还不支持中文,简单的体验完成后,我们继续准备通过ollama部署各种开源模型到本地。

image-20240927140250811

ollama常用命令:

1
2
3
4
5
6
7
8
9
10
# 查看模型列表
ollama list
# 查看目前启动的模型
ollama ps
# 删除模型
ollama rm ${模型名}
# 启动模型
ollama run ${模型名}
# 停止模型
ollama stop ${模型名}

在Huggingface上选择模型

Huggingface是一个集开源工具、模型库、数据集为一体的平台,提供了transformers库、Hugging Face Hub等功能,其中Hub是一个类似于GitHub的代码托管平台,我们可以在上面下载开源的模型、数据集使用。本次我们就要通过Huggingface下载模型,首先进入Hugging face模型页

以大语言对话模型为例,在左侧筛选,仅选中Text Generation

image-20240927142250801

继续在搜索框中输入Qwen,选择Qwen/Qwen2.5-Coder-7B-Instruct,也就是阿里的通义千问模型,Coder是编程特化型,和基础版相比提升了编程性能。下面是模型首页Huggingface-Qwen2.5-7B

image-20240930110600817

下载模型

现在模型的主要存储格式主要有ggufsafetensors,gguf采用了二进制格式编码,优化了数据结构和资源占用,可以直接通过ollama加载。safetensors则是未经过量化、更侧重于文件加载速度和安全的一种格式。

如果一个模型提供了gguf格式,我们可以直接下载下来,编写启动脚本完成模型创建,而safetensors格式则需要先将模型转变为gguf格式后再编写脚本创建。不管哪种格式,我们都需要先将模型下载下来,下面我们来看两种格式不同的下载方式。

gguf:

我们进入模型详情页后,点击Files and versions,可以看到具体的文件,而且都有不一样的后缀,例如Q3、Q4等,这代表量化精度,这里先不介绍,后面会细说,目前先记住数字越大,精度越高。我们选择一个模型,点击后面的下载按钮下载下来(只需要下载一个,不同文件之间只有精度区分)。

image-20240927153941811

safetensors:

和gguf相比,safetensors要麻烦许多,我们需要借助ollama官方的一个项目,将safetensors转为gguf格式。

创建一个python项目,创建好虚拟环境(这里我Python的版本为3.12.4,最好保持一致)

image-20240927154951477

拉取ollama项目,并初始化更新子模块

1
2
3
4
5
6
7
# 拉取ollama项目到本地
git clone git@github.com:ollama/ollama.git ollama
cd ollama
# 初始化子模块
git submodule init
# 下载并更新子模块llm/llama.cpp的代码
git submodule update llm/llama.cpp

对llama.cpp模块生成对应的虚拟环境并启用,安装所需依赖,并编译获取llama-quantize工具

1
2
3
4
5
6
7
8
9
10
# 生成虚拟环境
python3 -m venv llm/llama.cpp/.venv
# 激活虚拟环境
source llm/llama.cpp/.venv/bin/activate
# 安装依赖
pip install -r llm/llama.cpp/requirements.txt
# 注意,这里要先进入llama.cpp模块,再执行make
cd llm/llama.cpp
# 编译 (windows下需要执行cmake编译,如果没有需要安装cmake工具)
make

到这里,ollama工具的初始化就完成了。我们继续下载对应的大语言模型文件。这里我们需要用到Hugging face的官方工具huggingface-cli。因为后面需要登陆,我们需要先注册一个Huggingface账号,并在个人设置内生成一个token

image-20240927160907443

现在我们可以继续输入下面2个命令,下载huggingface_hub工具并登陆

1
2
3
4
# 下载huggingface_hub工具
pip install huggingface_hub
# 登陆(会提示你输入token)
huggingface-cli login

登陆成功后,我们就可以成功下载模型了,具体的下载的命令如下,这里对参数进行解释:download:后面跟要下载的模型,注意需要包含模型前缀,例如示例中的Qwen/,一般直接在网页复制模型名就行。resume-download:如果下载中断,下次可以继续下载。local-dir:指定具体的下载路径

1
huggingface-cli download --resume-download Qwen/Qwen2.5-Coder-7B-Instruct --local-dir /Users/sora33/download

模型下载完成后,我们将下载的东西移动到ollama文件夹下,新建一个model文件夹,方便我们后续操作。

image-20240927161707053

开始对模型进行转换,通过llama.cpp下的convert_hf_to_gguf.py文件,转换对象是model文件夹,指定输出文件类型为f16(16位浮点数)下面是命令预览:

1
python llm/llama.cpp/convert_hf_to_gguf.py ./model --outtype f16 

确保我们在ollama目录下,执行命令

image-20240927162400961

我们可以在model文件夹内看到结果文件,格式为gguf,模型格式转换成功

image-20240927164025506

PS:这里可能会遇到ChatGLM4Tokenizer._pad() got an unexpected keyword argument 'padding_side'这个错误,原因是部分模型可能还不适配最新版本,所以我们需要把transformers降级,执行下面语句降级即可:

1
2
pip uninstall transformers -y
pip install transformers==4.34.0

最后我们需要量化模型,先来简单介绍一下量化模型的作用。量化模型是通过降低浮点数来减少模型大小、加速推理和降低内存占用的过程,量化后模型精度会下降,但是效率和内存占用会贬低。量化等级按照从低到高排序:

  • q2_K
  • q3_K
  • q3_K_S
  • q3_K_M
  • q3_K_L
  • q4_0(受到推崇的)
  • q4_1
  • q4_K
  • q4_K_S
  • q4_K_M
  • q5_0
  • q5_1
  • q5_K
  • q5_K_S
  • q5_K_M
  • q6_K
  • q8_0
  • f16

我们的量化命令如下,调用llama.cpp下的llama-quantize,输入Model-7.6B-F16.gguf、输出qwen7.6B_q4_0.gguf,量化粒度为q4_0注意是在ollama目录下执行

1
llm/llama.cpp/llama-quantize ./model/Model-7.6B-F16.gguf qwen7.6B_q4_0.gguf q4_0

image-20240927165828574

量化完成后,结果文件会输出到ollama文件夹内,这里我又移动到了model里面做对比。

image-20240927170118053

同时可以看到,在q4_0粒度的量化下,直接少了10个G,压缩效率非常好

image-20240927170055345

编写启动脚本

现在我们拥有了gguf格式的文件,开始编写大模型的启动脚本modelfile。新建一个txt,FROM后面跟我们模型的具体路径,PARAMETER设置温度系数,值越高回答的随机性越大。SYSTEM设置系统消息,用来定义角色或上下文,这里我们置空。完成后将文件保存并命名为qwen.txt。(名字可以自定义)

1
2
3
4
5
6
7
FROM /Users/sora33/PythonCode/qwen/ollama/model/qwen7.6B_q4_0.gguf

# set the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1

# set the system message
SYSTEM """"""

随后我们通过ollama create命令创建模型,模型命名qwen,读取配置文件qwen.txt。

1
ollama create qwen -f qwen.txt

命令执行后,等待片刻,模型会创建完毕,如下:

image-20240930111648125

通过run命令启动模型并对话测试。

image-20240930113522721

open-webui可视化界面

目前为止,大模型已经创建完成并可以使用,但没有可视化页面只能在命令行内调用多少有点简陋。GitHub上的一个开源项目open-webui可以完美适配ollama,web页面接入ollama也很简单,下面来具体操作一下,因为版本兼容问题,这里我们只以Docker为例,当然也可以通过Python启动(Python版本必须需要在3.11,这里我因为是3.12所以不方便演示)

Python:

1
2
3
4
5
# Python
pip install open-webui
open-webui serve
# 访问
http://localhost:8080

Docker:

我们不需要改动任何东西,只需要知道将原本的8080端口改到了3000,如果3000跟你本地有冲突,也可以换成别的。执行这个Docker命令完成open-webui的创建。

1
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

访问localhost:3000,进入主页面,会提示你登陆,这里简单注册一下就可以,数据都在你本地。之后左上角选定模型,就可以在web页面使用自己已经创建的大模型了

image-20240930114535631

结束语

以上就是如何使用 ollama 配合 Huggingface 平台加载和运行大语言模型,特别是对于 safetensors 格式的模型。如果在流程上遇到什么问题,欢迎各位进行留言。