前言
我之前已经写了几篇关于AI大语言模型基础方面的文章,包括本地大语言模型UI和API供应商的介绍(参看文章:开启AI之旅:本地大语言模型UI与大语言模型API供应商的入门详解),本地大语言模型UI:Lobechat的安装部署教程(参看文章:docker系列 基于开源大语言模型UI框架:Lobechat的详细部署教程)及详细设置及使用教程(参看文章:家庭数据中心系列 解锁Lobechat的全部潜能:从设置到实战的完整攻略)。不过,在写这些内容时涉及到的API供应商,基本还是商业化的著名API供应商,例如OpenAI(GPT系列)、Google(Gemini系列)、Anthropic(Claude系列)等。
但是,除了商业化的API供应商之外,还有能本地自建的开源大语言模型框架,比如著名的Ollama,本文就以Ollama框架下部署大语言模型为例演示如何在本地搭建自己的开源大语言模型。
注:本地自建开源大语言模型对硬件的要求不低,运行较大的参数规模的模型对内存有不低的要求,且如果要求大语言模型的响应速度,需要Nvidia显卡的支持,所以还是有不低的门槛的。我因为是安装在inter CPU的mini主机上,没有独显,所以只能靠CPU,那响应速度一言难尽~。
基于Ollama搭建自己的开源大语言模型
Ollama简介
Ollama 是一个专注于在本地运行和管理大型语言模型(LLM)的框架(官网地址:https://ollama.com/),提供用户友好的界面和工具,用于方便地加载、管理、运行多种大语言模型。在不依赖云端服务器的情况下,Ollama让用户可以直接在自己的计算机上高效运行LLM,同时具备丰富的扩展功能,Ollama 的核心特点如下:
- 本地运行:Ollama 支持直接在本地硬件上运行大语言模型,这对于数据隐私敏感的用户尤其有吸引力,因为数据完全保存在本地。
- 模型支持:Ollama兼容多种流行的模型,用户可以选择加载合适的模型,根据不同任务需求进行调整。模型范围包括开源的 LLM,以及与 GPT-4 类似的高质量模型。
- 界面友好:提供直观的 UI 和 CLI(命令行界面),用户可以通过图形化界面与模型交互,也能在终端中执行模型命令。
- 轻松安装与管理:Ollama允许用户方便地下载、安装和更新模型,管理多个模型实例,提高了本地模型的易用性和灵活性。
- 定制与扩展:支持多种模型的微调和参数调节,用户可根据具体任务优化模型效果。此外,Ollama允许将本地模型用于个性化的应用程序开发,使其可以无缝融入到不同项目中。
Ollama的应用场景包括但不限于:
• 数据隐私保护:在需要高隐私性和数据本地化的环境下,Ollama适合在企业、组织和个人开发环境中使用。
• 开发和测试:Ollama是研究和测试 LLM 的理想工具,帮助开发者在本地调试模型表现。
• 资源优化:可以在不依赖云服务的情况下运行复杂模型,适合需要本地计算的项目。
总体而言,Ollama 适合那些希望在本地私有化环境中使用大语言模型,并且想要对模型的选择和参数进行灵活管理的用户。
Ollama支持的本地大语言模型
Ollama 支持多种开源和优化版的大语言模型,方便在本地运行,无需依赖网络连接,且这些模型在功能和表现上可以替代市面上的商用大语言模型。以下是 Ollama 支持的一些常见本地可运行模型及其应用:
1. LLaMA (Large Language Model Meta AI)
• 简介:Meta推出的开源模型家族,提供不同规模的模型(如LLaMA-7B、LLaMA-13B、LLaMA-30B等),拥有良好的性能并且可以在本地运行,LLaMA的模型架构在多任务下表现出色,适合文本生成、问答等常见的语言任务。其中,Llama 3是Meta AI开源的第三代Llama系列模型,其新的 8B 和 70B 参数 Llama 3 模型在Llama 2的基础上,实现了更大性能的提升,由于预训练和训练后的技术改进,其Llama 3模型是当今 8B 和 70B 参数规模的最佳模型。Llama 3模型的改进大大降低了错误拒绝率,改善了一致性,并增加了模型响应的多样性。Llama 3模型在推理、代码生成和指令跟踪等功能也得到了极大的改善。
• 替代商用模型:类似于 OpenAI 的 GPT-3 和 GPT-3.5,尤其适合小型项目和开发者个人使用。
2. Mistral
• 简介:Mistral是一款性能优化的开源模型,以较少的计算量实现优异的性能,能够在资源受限的设备上高效运行。其结构特别适合在多任务处理上取得良好的平衡。
• 替代商用模型:可以替代类似 GPT-3 级别的商用模型,尤其适合需要小模型部署、低计算资源的应用。
3. Falcon
• 简介:Falcon模型是 TII (Technology Innovation Institute) 推出的强大开源模型,具有强大的自然语言生成和理解能力。Falcon 40B在多种基准上表现优异,适合各种复杂文本任务。
• 替代商用模型:可以替代 GPT-3.5 和 GPT-4 级别的商用模型,在一些场景下性能接近 ChatGPT,并在复杂任务处理上有很好的表现。
4. Vicuna
• 简介:这是基于LLaMA进行指令微调的模型,特别优化了在指令跟随任务下的表现。Vicuna 的训练数据来自大规模的用户指令数据,使其更适合对话场景。
• 替代商用模型:适合替代类似ChatGPT或Anthropic的Claude系列模型,尤其在对话、问答和客户支持等交互式任务上表现良好。
5. Code LLaMA
• 简介:Meta针对代码生成任务专门优化的LLaMA变体模型,支持多种编程语言的代码补全、生成和解释。专为开发人员设计,提升了代码生成任务的准确性。
• 替代商用模型:适合替代 GitHub Copilot 或 OpenAI 的 Codex,在代码补全和编程支持上有相似的能力。
6. GPT-J & GPT-NeoX
• 简介:EleutherAI开发的开源模型家族,具有不同参数规模(如GPT-J-6B和GPT-NeoX-20B等),专为支持各种自然语言生成任务设计,表现优秀。
• 替代商用模型:GPT-J和GPT-NeoX可以用来替代GPT-3级别的商用模型,适用于日常对话、生成式任务。
7. Dolly
• 简介:Databricks推出的一个开源模型,支持本地化和定制化的微调,擅长处理简单的对话任务和问答。
• 替代商用模型:适合替代类似Bard或GPT-3级别的模型,尤其在需要个性化微调的小型项目中表现出色。
8. Bloom
• 简介:由BigScience协作项目推出的大型开源模型,支持多语言处理,擅长长文本生成任务,在多语种应用中表现优秀。
• 替代商用模型:可以用来替代GPT-3.5或Claude 2等商用模型,特别适合多语言支持需求的任务。
总结
还有一些其他的模型,我就不一一列举了,这些模型在 Ollama 的支持下可以在本地运行,提供商用模型的平替方案,特别适合需要数据隐私、安全性高、需要自定义或对成本敏感的应用场景。这些模型在资源消耗上通常比商用模型小一些,适合需要特定任务或自定义需求的用户。
Ollama部署
部署方式与差异
Ollama既可以采用docker方式部署,也可以采用源码方式部署,在性能方面,Ollama 的源码部署和 Docker 部署通常不会有显著差异,因为底层的模型推理依赖硬件而非运行环境本身。但在具体场景中,以下几点可能会产生一些小差异:
- 资源分配:Docker 容器有时会限制对硬件资源的直接访问,尤其是在默认配置下。尽管可以调整 Docker 设置以提供更高的资源访问权限,但相比直接在主机上运行源码,Docker 部署的资源管理稍显间接。
- 系统开销:Docker 容器会增加少量的系统开销(如存储层和网络层),这些开销通常较小,但在高性能计算场景下可能积累成微小的延迟。
- 驱动兼容性:如果使用 GPU,源码部署可以直接访问本地 GPU 驱动,而 Docker 则需要 GPU 支持的专用容器和驱动配置。NVIDIA 提供了 nvidia-docker 工具来优化 Docker 的 GPU 支持,因此通常能达到与源码部署接近的性能。
简单总结:在没有GPU的环境,源码方式部署和docker方式部署基本没区别,这时候更推荐docker方式部署;如果有GPU,更推荐源码方式部署。
docker方式部署
仅CPU
docker run --name ollama -d --restart=always --net=public-net \
-v /docker/ollama:/root/.ollama \
-p 11434:11434 \
-e OLLAMA_ORIGINS="*" \
ollama/ollama
参数注释:
-v /docker/ollama:/root/.ollama:映射宿主机上”/docker/ollama”到容器内部”/root/.ollama”
-e OLLAMA_ORIGINS=”*
“:允许跨域访问的域名,默认是”本地访问”,按需配置
Nvidia GPU
安装NVIDIA 容器工具包(在宿主机配置)
使用Apt安装
- 配置仓库
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
| sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
| sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
- 安装 NVIDIA 容器工具包
sudo apt-get install -y nvidia-container-toolkit
使用Yum或者Dnf安装
- 配置仓库
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo \
| sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
- 安装 NVIDIA 容器工具包
sudo yum install -y nvidia-container-toolkit
配置Docker使用Nvidia驱动
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
创建并运行容器
docker run --name ollama -d --restart=always --net=public-net \
--gpus=all \
-v ollama:/root/.ollama \
-p 11434:11434 \
-e OLLAMA_KEEP_ALIVE="10m" \
-e OLLAMA_ORIGINS="*" \
ollama/ollama
参数注释:
–gpus=all:允许 Docker 容器访问宿主机的所有Nvidia GPU。启用了 NVIDIA GPU 支持,指示 Docker 将宿主机上可用的所有 GPU 分配给该容器。如果主机上有多张 GPU,这个选项会让容器访问所有 GPU 设备。该选项依赖于安装”nvidia-container-toolkit”,并要求宿主机支持 NVIDIA 驱动程序。如果没有 GPU 或未安装 NVIDIA 支持库,–gpus=all 不会起作用,命令也会忽略 GPU 支持。
-e OLLAMA_KEEP_ALIVE=”10m”:模型在显存中保持加载的持续时间,默认”5m”,按需修改
AMD GPU
要使用 Docker 通过 AMD GPU 运行 Ollama,使用 rocm
标签和以下命令:
docker run -d --device /dev/kfd --device /dev/dri -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama:rocm
源码方式部署
对于部署的操作系统,在Ollama官方默认的源码安装默认支持3种:macos、Linux、Windows,macos和Windows都是传统应用的安装方式,Linux就是一条安装命令:
curl -fsSL https://ollama.com/install.sh | sh
安装步骤很简单,这里就不浪费篇幅介绍了。
源码安装和docker安装方式不同,会多一些环境参数变量的指定,比如”OLLAMA_HOST”:绑定的主机和端口,默认是”127.0.0.1:11434″,按需配置,如果本地大语言模型UI和Ollama在同一台设备上,使用默认值即可;如果不在同一台设备上,且远程访问有问题,可以尝试设置该参数。
安装现成的模型版本
接下来,就是在本地运行你需要的大模型版本,大模型最新的模型版本和模型参数规模数量以及模型大小可以参考github官方页面的参数(https://github.com/ollama/ollama):
注:这里的单位”B”指的是模型的参数规模数量,以 “Billion”(十亿)为单位。换句话说,1B表示模型有 10 亿个参数,7B 则表示有 70 亿个参数。模型参数的数量通常反映了模型的复杂性和能力——参数越多,模型可以捕获和表达的语言特征也越丰富,但同时需要更多计算资源和内存。在大语言模型中,参数代表了模型中的权重和偏置等学习到的值。这些参数决定了模型如何处理和生成文本数据,参数量越大,一般来说模型的表现越好,但需要更高的硬件性能支持才能高效运行。
不同的模型规则对宿主机内存有要求:
上图虽然只说了7B,13B,33B,但是通常可以根据模型参数规模的线性比例来粗略推算所需的内存。例如,假设 7B 模型需要 8 GB 内存,模型参数和内存需求之间大致呈线性关系,可以推算出:
• 1B 模型:约 1.1 – 1.2 GB 内存
• 2B 模型:约 2 – 2.3 GB 内存
• 3B 模型:约 3 – 3.5 GB 内存
• 8B 模型:约 9 – 9.5 GB 内存
这些只是粗略估计,具体需求可能会因模型架构、优化方法或加载模式而有所变化。实际内存需求可以根据模型的实际分布和分段加载情况稍有不同,但整体的计算思路可以作为参考。
自定义模型
附加知识:GGUF模型文件格式
“GGUF”指的是一种专门为本地使用优化的模型文件格式,尤其适用于在资源有限的设备上运行LLM(大语言模型)。它是一种二进制格式,具有跨平台和模型兼容性优势,因此加载和推理速度更快。这种格式在开源大语言模型社区中(Reddit、Discord 以及其他AI社区论坛)越来越受欢迎,因为它可以在不依赖云资源的情况下提升本地性能。
一些开源模型库也提供了大量支持GGUF格式的开源模型,以”Hugging Face”(目前最受欢迎的平台之一)为例,通过 Hugging Face 模型库,可以搜索并下载许多社区和机构分享的预训练模型,有时直接包含GGUF格式或相应的转换工具。
另外,一些支持 GGUF 格式的模型(如 LLaMA 等开源模型)会由开发团队直接发布在 GitHub 等平台上,官方仓库或发布页面通常会列出支持的格式,并提供下载链接。
自定义模型
Ollama可以通过在Modefile文件中导入GGUF格式的模型文件来创建自定义模型,步骤如下。
- 先创建一个名为”Modelfile”的文件,在文件中加入如下FROM指令指定要导入模型的本地文件路径:
FROM ./vicuna-33b.Q4_0.gguf
- 在 Ollama中创建名为example的模型(模型名称随意设置,看你喜欢):
ollama create example -f Modelfile
- 运行自定义模型
ollama run example
注:Modelfile 是一个配置文件,包含了模型的核心设置和超参数。常见的配置选项包括模型的基础来源路径(通过 FROM 指定)、层数、隐藏单元和注意力头数等超参数。还可以定义训练数据的位置、学习率、批处理大小和优化器等训练参数。Modelfile 中的其他设置包括输入格式、输出类型、设备类型(如 CPU 或 GPU)、内存限制以及作者、版本和描述等模型元数据。这些参数组合提供了灵活的自定义,使模型的加载、训练和运行更高效并适应不同的应用需求,由于内容较多,而我又暂时涉及不到,所以这里不多说了,需要的朋友可以自行研究下。
Ollama中安装模型llama3.2及常规使用
安装llama3.2
以”llama3.2 3B”模型为例,由于我是通过仅CPU的docker方式部署,所以运行该模型的命令为:
docker exec -it ollama ollama run llama3.2
然后就是一段时间的等待,具体等待时间跟你选择的模型大小以及网络速度有关:
和docker run
命令类似,ollama run
命令其实也是包括先进行pull
操作拉取模型,然后再run
,所以其实也可以单独先拉取镜像,需要的时候再运行ollama run
命令:
docker exec -it ollama ollama pull llama3.2
然后可以使用ollama list
命令查看已经下载的大语言模型:
docker exec -it ollama ollama list
使用ollama ps
命令查看正在运行的大语言模型:
docker exec -it ollama ollama ps
使用ollama stop
命令和looama rm
命令搭配可以删除一个正在运行的大语言模型:
docker exec -it ollama ollama stop 模型ID
docker exec -it ollama ollama rm 模型ID
也可以通过以下命令看看ollama -h
命令支持哪些参数:
docker exec -it ollama ollama -h
如果是源码方式安装Ollama,则直接在shell里运行对应的模型下载安装命令即可:
ollama run llama3.2
其他命令和docker下的是一样的,不同的是均是直接运行即可。
还可以尝试其他不同的模型,具体模型对应的命令可以参见上面的图片。
其实,运行命令ollama run llama3.2
时,容器内部已经进入了和llama3.2的交互界面:
只不过,这种交互方式并不实用,顶多用来做测试,要真正实用还是要依靠本地大语言模型UI,比如Lobechat。
在Lobechat中添加ollama中的llama 3.2模型
方式一、自建llama 3.2模型(不推荐,折腾)
在我写文章的时候,Lobechat还未内置支持llama 3.2模型,所以可以通过自建模型的方式来使用:
按照我之前文章描述(家庭数据中心系列 解锁Lobechat的全部潜能:从设置到实战的完整攻略),可以自己新建一个llama 3.2 3B模型版本:
然后就多出了Llama 3.2 3B的模型版本:
点击上图红框中的”Llama 3.2 3B”,进入具体模型设置页面,按需配置后点击”确定”保存:
方式二、直接从Ollama获取已下载的模型列表(推荐)
这种方式最简单,如果和ollama通信正常,通过了检查,可以直接点击”获取模型列表”按钮来获取ollama上已经下载的模型,比如我就下载了2个,llama3.2和gemma2:2b,所以点击获取模型列表直接就出现了,如下图:
注:唯一需要关注的问题,就是我在上图中注释的,假如Ollama和Lobechat在同一台设备上,而”Ollama服务地址”框部分又是留空(表示使用系统默认的http://127.0.0.1:11434
地址)的时候,明明Ollama是正常的也使用了ollama run
命令启用了对应的大模型,却死活通不过检查。
如果遇到这种问题,可以尝试把地址从127.0.0.1改成设备网卡的真实IP地址,估计是个bug。
在Lobechat”会话”界面选择ollama 3.2模型
直接在Lobechat的”会话”界面右边聊天部分,助手的头像右边选择对应的模型,我这里选择Llama 3.2 3B,如下图:
然后试试简单的对话:
直接给我把docker专用虚拟机的cpu干到了78%:
写个最简单的shell脚本:
docker专用虚拟机的cpu干到了90%~:
仅CPU部署还是够呛,我又尝试了下规模更小的模型”llama3.2:1b”,相比3B,1B需要的资源更少,速度理论上会更快,但是嘛,只是感觉输出速度快了那么一点点:
CPU利用率略微低一点,实际上也没太大差异:
想来,应该是因为瓶颈是在于我的CPU,我这垃圾CPU,不管是对于1B,还是3B,其实都没啥区别~。
注:github上也有不少llama3的中文微调版,经过优化之后,相同配置下,响应速度和对中文的支持都有不小的提高,大家感兴趣可以去找找,直接在github上搜索”llama3″即可,前面提到的一些平台和社区也是一个查找渠道。
后话
本来,我还想研究一下使用inter核显能不能实现加速,不过,研究了一下,似乎意义不大的样子,因为Ollama 的部署主要支持NVIDIA GPU,是因为需要CUDA支持来进行深度学习任务加速(CUDA 是 NVIDIA 专有的 GPU 计算平台,广泛用于 AI 模型的训练和推理加速)。而Intel 核显缺乏对 CUDA 的支持,虽然 Intel 也在开发适用于 AI 推理的 GPU 解决方案(如 Intel Arc 独显及其 OneAPI 框架),但 Ollama 尚未宣布对这些硬件和框架的支持,更别说是Inter的核显了~,就算是折腾出来,意义也不大。
不过,在 Apple M 系列(如 M3 Pro)上运行 Ollama,却可以获得较好的性能,尤其是对于小型或中型的大语言模型(如 7B 参数以下的模型):苹果的 M 系列芯片(包括 M1、M2、M3 及其 Pro、Max、Ultra 变体)内置了强大的神经网络引擎和 GPU,专门针对机器学习任务进行了优化,因此在本地运行大语言模型时性能表现”不俗”,但是具体如何个”不俗”就不清楚了,我macbook pro只是M1的,实在没有啥测试的欲望。
决定了,明年买个M4 pro的mac mini来测试下,为了做研究我也是拼了,这是为科学献身,可不是乱花钱~。
另,附上Apple M 系列(以M3 Pro为例)与 NVIDIA GPU 跑ollama的简单对比:
• 推理速度
对于不太大的模型(如 7B 或更小的模型),M3 Pro 的性能可以接近入门级 NVIDIA 显卡,甚至比一些低端 GPU 更快。但是,对于大规模模型(如 13B 或更大),NVIDIA 专业 GPU(如 A100、H100、RTX 4090 等)的 CUDA 核心和 Tensor 核心可以提供显著加速,尤其在显存和并行处理能力方面更胜一筹,因此会更快。
• 内存限制
M3 Pro 通常内存容量较大(16GB 至 36GB),可以支持中小型模型在内存中运行,但超大模型(如 33B、65B)会受到内存限制,可能无法完整加载到内存,导致运行失败或需要分批加载数据。而专业 NVIDIA GPU 的显存更大(如 A100 有 40GB 显存),可以处理更大的模型。
• 电源效率和静音性
M3 Pro 等 M 系列芯片在电源效率和静音表现上非常出色,发热量低、功耗小,适合长时间运行。相比之下,NVIDIA 专业显卡的功耗和发热量更大,通常需要主动散热。
总结:在 M3 Pro上运行 Ollama 能够获得很好的 CPU 和神经网络引擎加速,适合日常使用和小型模型推理(门槛也不低啊,M3(Pro)的机器也不便宜~,M2(Pro)应该也能一战,总之性能越好体验越好)。如果追求更高的推理速度和大型模型的流畅运行,NVIDIA 的专业显卡仍然是更强的选择。