基于ollama从零部署大语言模型
前言
环境介绍:使用的Python版本为3.12.4且需要科学上网,对电脑性能有一定需求(但也没那么离谱)
相信不少人已经体验过Ai带来的便利了,甚至在工作上使用Ai加以辅助。本文是对那些对Ai产生兴趣且希望在自己的设备上实际运行大语言模型的人而准备,希望可以通过这篇文章来让更多人认识和了解Ai。本文是基于ollama创建和部署大语言模型,下面就开始进入正文。
ollama是什么?
ollama是一个管理大语言模型的工具,帮助我们在本地快速创建、部署、使用大语言模型。它本身并不是一个大语言模型!还有一个名词llama,它跟ollama很像,但是区别可就大了。llama是由Meta开发的大语言模型,所以我们可以使用ollama加载llama这样的大语言模型。
安装ollama
进入ollama官网,点击下载按钮,安装到自己电脑上即可。安装完成后可以使用ollama -v
测试是否安装成功
使用ollama运行llama3.2模型
我们先简单启动一个模型进行测试,我们以Meta最新的llama3.2的1b模型为例,执行下面命令可以自动安装并启动llama3.2模型。
1 | ollama run llama3.2:1b |
在模型启动后,我们可以进行一些简单的对话,不过最好使用英文,因为llama3目前还不支持中文,简单的体验完成后,我们继续准备通过ollama部署各种开源模型到本地。
ollama常用命令:
1 | 查看模型列表 |
在Huggingface上选择模型
Huggingface是一个集开源工具、模型库、数据集为一体的平台,提供了transformers库、Hugging Face Hub等功能,其中Hub是一个类似于GitHub的代码托管平台,我们可以在上面下载开源的模型、数据集使用。本次我们就要通过Huggingface下载模型,首先进入Hugging face模型页
以大语言对话模型为例,在左侧筛选,仅选中Text Generation
继续在搜索框中输入Qwen,选择Qwen/Qwen2.5-Coder-7B-Instruct,也就是阿里的通义千问模型,Coder是编程特化型,和基础版相比提升了编程性能。下面是模型首页Huggingface-Qwen2.5-7B
下载模型
现在模型的主要存储格式主要有gguf和safetensors,gguf采用了二进制格式编码,优化了数据结构和资源占用,可以直接通过ollama加载。safetensors则是未经过量化、更侧重于文件加载速度和安全的一种格式。
如果一个模型提供了gguf格式,我们可以直接下载下来,编写启动脚本完成模型创建,而safetensors格式则需要先将模型转变为gguf格式后再编写脚本创建。不管哪种格式,我们都需要先将模型下载下来,下面我们来看两种格式不同的下载方式。
gguf:
我们进入模型详情页后,点击Files and versions,可以看到具体的文件,而且都有不一样的后缀,例如Q3、Q4等,这代表量化精度,这里先不介绍,后面会细说,目前先记住数字越大,精度越高。我们选择一个模型,点击后面的下载按钮下载下来(只需要下载一个,不同文件之间只有精度区分)。
safetensors:
和gguf相比,safetensors要麻烦许多,我们需要借助ollama官方的一个项目,将safetensors转为gguf格式。
创建一个python项目,创建好虚拟环境(这里我Python的版本为3.12.4,最好保持一致)
拉取ollama项目,并初始化更新子模块
1 | 拉取ollama项目到本地 |
对llama.cpp模块生成对应的虚拟环境并启用,安装所需依赖,并编译获取llama-quantize工具
1 | 生成虚拟环境 |
到这里,ollama工具的初始化就完成了。我们继续下载对应的大语言模型文件。这里我们需要用到Hugging face的官方工具huggingface-cli
。因为后面需要登陆,我们需要先注册一个Huggingface账号,并在个人设置内生成一个token
现在我们可以继续输入下面2个命令,下载huggingface_hub工具并登陆
1 | 下载huggingface_hub工具 |
登陆成功后,我们就可以成功下载模型了,具体的下载的命令如下,这里对参数进行解释: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文件夹,方便我们后续操作。
开始对模型进行转换,通过llama.cpp下的convert_hf_to_gguf.py文件,转换对象是model文件夹,指定输出文件类型为f16(16位浮点数)下面是命令预览:
1 | python llm/llama.cpp/convert_hf_to_gguf.py ./model --outtype f16 |
确保我们在ollama目录下,执行命令
我们可以在model文件夹内看到结果文件,格式为gguf,模型格式转换成功
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 |
量化完成后,结果文件会输出到ollama文件夹内,这里我又移动到了model里面做对比。
同时可以看到,在q4_0粒度的量化下,直接少了10个G,压缩效率非常好
编写启动脚本
现在我们拥有了gguf格式的文件,开始编写大模型的启动脚本modelfile。新建一个txt,FROM后面跟我们模型的具体路径,PARAMETER设置温度系数,值越高回答的随机性越大。SYSTEM设置系统消息,用来定义角色或上下文,这里我们置空。完成后将文件保存并命名为qwen.txt。(名字可以自定义)
1 | FROM /Users/sora33/PythonCode/qwen/ollama/model/qwen7.6B_q4_0.gguf |
随后我们通过ollama create命令创建模型,模型命名qwen,读取配置文件qwen.txt。
1 | ollama create qwen -f qwen.txt |
命令执行后,等待片刻,模型会创建完毕,如下:
通过run命令启动模型并对话测试。
open-webui可视化界面
目前为止,大模型已经创建完成并可以使用,但没有可视化页面只能在命令行内调用多少有点简陋。GitHub上的一个开源项目open-webui可以完美适配ollama,web页面接入ollama也很简单,下面来具体操作一下,因为版本兼容问题,这里我们只以Docker为例,当然也可以通过Python启动(Python版本必须需要在3.11,这里我因为是3.12所以不方便演示)
Python:
1 | Python |
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页面使用自己已经创建的大模型了
结束语
以上就是如何使用 ollama 配合 Huggingface 平台加载和运行大语言模型,特别是对于 safetensors 格式的模型。如果在流程上遇到什么问题,欢迎各位进行留言。