点击箭头处“蓝色字”,关注更多及时AI资讯哦!!
如今越来越多的伙伴们开始借助 Ollama 来把玩模型。Ollama是一款开源工具,它允许用户在本地便捷地运行多种大型开源模型,包括清华大学的ChatGLM、阿里的千问以及Meta的llama等等。但多数情况下,我们看到的都是那种拿来就用的“预制菜”模式,如果我们想要使用自己微调的模型,那又该怎么搞定呢?
今天这篇文章就来带大家看看如何通过 Ollama 来搭建“个性化”的模型服务,特别是针对那些经过微调、准备用于推理的模型,这个过程中我们还会借助到另外一个王炸工具辅助,Dify。
Dify作为一个开源的大语言模型(LLM)应用开发平台,能够简化和加速生成式AI应用的创建和部署,Dify的开源性质让用户可以轻松将其部署到自己的环境中,支持各种大模型的集成与自定义。
如果我们需要Ollama 官方不支持的模型跑起来,或者需要把最新版 llama.cpp 转换的模型投入使用,同时还想用 Dify 轻松构建 AI 应用,那这篇文章正是可以带你入门和手把手实践的教程!
接下来我们就开始,基于Ollama、Dify 与 Docker 的组合,在本地搭建起 Llama 3.1 模型服务的全过程。
1. 准备工作-模型
模型文件动辄好几个G,下得慢、下不下来往往是把玩模型的第一道坎儿, 特别是要把模型倒腾到本地或者国内服务器上进行微调,模型下载都是第一步,所以得有个稳当快速的下载方法是非常刚需的。这里先推荐一个快速的镜像方法:
修改 /etc/docker/daemon.json 文件为Docker配置镜像源
{
"registry-mirrors": [
"https://dockerproxy.com",
"https://dockerhub.icu",
]
}
后面再来给大家单独一篇来介绍下载加速的办法。
我们也可以用一个轻量化、好管理的Docker Python镜像作为基础执行环境。这么一来,安装下载工具的时候就省心了,既不用担心错过工具的最新版更新导致下载速度慢或者出岔子,也不用担心下载工具的更新会搅和到本地环境中其他 Python 程序的依赖关系。
所以,为了不影响到咱们的服务器或者本地环境,我们来通过下面的命令,用一个独立的可持续运行的容器镜像环境,专门用来下载模型:
将python:3.10-slim下载到本地后,我们来执行下面的命令,启动一个名为 downloader 的后台容器:
这个 docker run 命令用于创建并启动一个新的 Docker 容器,具体参数解释如下:
1. docker run:这是 Docker CLI 的命令,用来创建并运行一个新的容器。
2. -d:这个选项告诉 Docker 在后台运行容器,也就是以守护进程模式运行。
3. --name=downloader:这个选项为新容器指定一个名称。在这里,容器的名称被设置为 downloader。
4. -v \pwd`:/models:-v 是用于挂载卷的选项,它将宿主机的目录挂载到容器内部。这里使用了反引号 `` `` 来执行 pwd 命令,它会打印出当前工作目录的完整路径。/models 是容器内部的挂载点。这意味着宿主机的当前目录被挂载到容器的 /models 目录。
5. python:3.10-slim:指定要使用的 Docker 镜像。这里指定的是标签为 3.10-slim 的 python 官方镜像,slim 表示该镜像是一个精简版,只包含运行 Python 3.10 所需的最小文件集。
6. tail -f /etc/hosts:这是容器启动后要执行的命令。tail -f 通常用于实时查看文件的新增内容,但在这里,它实际上是一个保持容器运行的小技巧。/etc/hosts 是一个系统文件,tail -f /etc/hosts 命令会让容器持续运行,因为它不断监视 /etc/hosts 文件的变化。由于这个文件通常不会变化,所以这个命令会无限期地等待,从而使容器保持运行状态。
接下来使用下面的命令,进入容器的命令行环境:
进行一些简单的软件源加速配置(mac系统)
echo 'export BREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/' >> ~/.zshrc
source ~/.bash_profile
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
cd /models
安装阿里云modelscope,pip install modelscope,可以看到我们制定的tsinghua的镜像已经生效。modelscope为我们提供模型下载功能的 Python 包
整个命令的作用是,调用 Python 解释器的命令,-c 后面的字符串作为 Python 代码,这行代码从 modelscope 模块中导入了 snapshot_download 函数,阿里云的modelscope是为我们提供模型下载功能的 Python 包,而 snapshot_download 函数用于下载模型。在当前目录下创建一个名为 models 的文件夹(如果它还不存在的话),并下载名为 LLM-Research/Meta-Llama-3.1-8B-Instruct 的模型到这个目录中。
如果看到下面的内容,就代表成功了
2. 准备工作-Ollama
2.1. 下载 Ollama 的 Docker 镜像
Ollama是一款开源工具,它允许用户在本地便捷地运行多种大型开源模型,包括清华大学的ChatGLM、阿里的千问以及Meta的llama等。目前,Ollama兼容macOS、Linux和Windows三大主流操作系统。下面的部分将介绍如何通过Docker安装Ollama,并将其部署以使用本地大模型。
官网地址:https://hub.docker.com/r/ollama/ollama
2.2. 创建Ollama的Docker容器
通过 docker run 创建容器
这个命令会从 Docker Hub 或其他配置的镜像仓库下载 ollama/ollama 镜像(如果本地没有的话),并基于这个镜像创建一个名为 ollama 的容器,参数具体含义如下:
1. docker run:Docker 的命令,用来创建并启动一个新的容器。
2. -d:表示以守护进程模式运行容器,即在后台运行。
3. -v ollama:/root/.ollama:表示挂载卷(Volume),将宿主机的 ollama 目录挂载到容器内的 /root/.ollama 目录。这样,容器内生成的数据可以持久化存储在宿主机上,即使容器被删除,数据也不会丢失。
4. -p 11434:11434:表示端口映射,将容器内的 11434 端口映射到宿主机的 11434 端口。这样,可以通过宿主机的 IP 地址和端口 11434 访问容器内的应用。
5. --name ollama:为容器指定一个名称,这里命名为 ollama。
6. ollama/ollama:指定要使用的 Docker 镜像名称,这里使用的是 ollama 官方镜像。
2.3. 进入容器并启动llama3
即使我们通过 docker run 命令启动了 Ollama 的 Docker 容器,它也不会自动将 ollama 命令添加到你的 PATH 中。我们需要使用 docker exec 命令进入正在运行的容器
含义如下:
1. docker exec:这是 Docker 的一个命令,用于在正在运行的 Docker 容器内执行新的命令。
2. -it:这是两个选项的组合:
3. -i 或 --interactive:保持容器的标准输入(STDIN)打开,即使不附加到容器终端。
4. -t 或 --tty:分配一个伪终端。这使得你可以与容器内运行的进程进行交互。
5. ollama:这是容器的名称,docker exec 将在名为 ollama 的容器内执行后续的命令。
6. ollama run llama3:这是要在容器内执行的命令。
7. ollama:这是在容器内运行的程序,它是用于管理大型语言模型的工具。
8. run:这是 ollama 程序的一个子命令,用于运行指定的模型。
9. llama3:这是要运行的模型的名称。
整个命令的意思是:在名为 ollama 的 Docker 容器内,以交互模式执行 ollama run llama3 命令。这通常是为了启动或运行名为 llama3 的大型语言模型,以便进行推理或其他操作。
如果 llama3 模型还没有在容器内,Ollama 可能会尝试从远程仓库下载它。下载和运行模型的过程可能会需要一些时间,具体取决于模型的大小和你的网络速度。如下图所示
这里发生的下载可能包括:
1. 模型数据:如果本地没有存储该模型的数据或者模型版本不是最新的,Ollama 会尝试从远程仓库下载所需的模型文件。
2. 模型更新:如果已经下载过模型,但模型有更新,Ollama 可能会下载更新的模型文件。
3. 依赖组件:有时候,模型运行可能需要一些额外的依赖或组件,这些也可能在执行命令时被下载。
4. 初始化过程:对于某些服务,首次运行时会执行初始化过程,这可能包括下载必要的文件。
5. Ollama 使用 Docker 容器来提供服务,所以当它需要模型文件时,它会利用 Docker 的能力来下载所需的内容。下载过程的耗时取决于多种因素,包括我们的网络连接速度、远程仓库的响应速度以及模型文件的大小。
执行完成后,就可以直接在控制台和llama3对话啦
2.4. 换一种方式启动Qwen2
在通过run命令创建好ollama的docker容器后,我们可以使用 docker exec 命令在已经运行的容器内执行命令:
这个命令会启动一个交互式的 Bash shell,允许你在容器内执行命令。这里的 ollama 是容器的名称,docker exec 会找到名为 ollama 的容器,并在其内部启动 Bash。
进入了容器的 Bash shell,你就可以执行任何命令,比如运行qwen2
这个命令会在容器内执行,因为容器是基于 ollama/ollama 镜像创建的,所以它知道要使用这个镜像中的环境和配置,执行过后会出现下面的进度条,加载完成后就会看到和上面一样的qwen的对话窗口啦
3. 启动 Dify IDE
Dify作为一个开源的AI应用开发平台,以其模块化设计、强大的提示工程工具、丰富的功能组件以及支持多种大语言模型而受到开发者的青睐。它结合了后端即服务和LLMOps的理念,提供了低代码/无代码开发环境,使得即使是非技术人员也能轻松参与AI应用的定义和数据操作。Dify的灵活性和易用性,以及其强大的模型支持和应用编排能力,使得它能够显著降低模型能力对比和选择的成本,同时加速从原型到生产的开发流程。此外,Dify还提供了智能体功能,允许用户快速创建和部署基于LLM的应用程序,满足特定需求。所有这些特点使得Dify成为开发者构建和部署大语言模型应用的优秀选择。
我们先将Dify clone到本地
git clone https://github.com/langgenius/dify.git
cd dify/docker
docker compose up -d
默认的配置中包含了下面几种应用服务:
1. dify,应用的前后端服务。
2. postgres 作为数据库使用。
3. redis 作为缓存服务使用。
4. weaviate 作为向量数据库使用。
5. nginx 作为应用网关使用,默认端口是 80,我们可以根据自己的需求修改调整。
6. docker中也可以看到各种依赖正在正确的运行
接着我们就可以本地访问到启动好的Dify啦
注册好了之后,就可以看到 Dify 的 Dashboard 啦。
想要在 Dify 中愉快的使用 Ollama 的 API,我们需要先打开“设置”中的“添加模型”界面,选择 Ollama。
参考下面的内容,我们完成包括模型名称、模型配置参数的填写,点击“保存”,完成新模型的添加。
返回 Dify 的主界面,创建一个新的 AI 应用。
创建完成后,就可以基于Agent与本地的llama3进行对话啦
4. 选修-模型转换
Ollama 的模型仓库(https://ollama.com/library)默认提供了几十种可以直接运行的模型,我们可以通过类似ollama run llama3的命令快速获取预制好的模型。不过,在真正的使用场景下,我们更多的还是要运行自己微调后的模型,所以这里我们的选修部分,来带着大家尝试使用 Llama.cpp 来量化自己的模型为 Ollama 可以运行的格式。
llama.cpp 是一款优秀的开源软件,是一个专为大型语言模型(LLM)设计的C++推理库,它通过一系列优化措施,使得在各种硬件平台上高效运行LLM成为可能。它几乎是伴随着 llama 大模型的成长、爆火、出圈而一起出现在了全球开发者和领域爱好者面前。
那我们就来尝试下手动构建适合自己设备的 llama.cpp 程序。
4.1. 环境准备
下载代码:
git clone https://github.com/ggerganov/llama.cpp.git --depth=1
切换工作目录:
cd llama.cpp
常规模式构建 llama.cpp:
cmake -B build
4.2. 常规模式构建 llama.cpp
cmake --build build --config Release
如果是 macOS,希望使用 Apple Metal:
GGML_NO_METAL=1 cmake --build build --config Release
如果使用 Nvidia GPU:
apt install nvidia-cuda-toolkit -y
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release
构建完毕 llama.cpp 后,我们就能够对转换后的模型进行运行验证了。
4.3. 通过 llama.cpp 转换模型格式
为了能够转换模型,我们还需要安装一个简单的依赖
接下来,就可以使用官方的新的转换脚本,来完成模型从 Huggingface Safetensors 格式到通用模型格式 GGML 的转换啦。
验证转换后模型:
用模型跑个分:
使用 simple 程序,来完成上面两个命令的“打包操作”:
验证完转换的模型是正确,并且能够运行的之后,这里我们可以选择根据自己的硬件情况,进行一些量化操作,来降低模型运行对硬件的需求。
4.4. 对转换后的通用模型进行量化
默认情况下,llama.cpp 支持以下的量化方式:
比如使用Q4_K_M 一类的量化类型,保持小巧,又不会太掉性能,命令如下:
./build/bin/llama-quantize ../LLM-Research/Meta-Llama-3___1-8B-Instruct/Meta-Llama-8B-3___1-Instruct-F16.gguf Q4_K_M
4.5. 构建 Ollama镜像
1.下载仓库代码
git clone https://github.com/ollama/ollama.git ollama-src
2.切换代码目录
cd ollama-src
3.进入核心组件目录
cd llm
4.更新组件代码
git submodule update --init --recursive
5.更新 llama.cpp 主分支相关代码
cd llama.cpp
git checkout master
git pull
完成代码的获取后,我们可以根据需要进行容器的构建:
1.回到代码根目录
cd ../../
2.构建修补后或调整后的程序docker镜像
bash scripts/build_docker.sh
3.也可以在命令前添加你希望构建的架构,减少构建时间
BUILD_ARCH=amd64 bash scripts/build_docker.sh
4.完成构建后,可以看到上面输出的几个拥有很长名称的 Docker 镜像,为了更好的维护和使用,我们可以给镜像起个合适的名字:
搞定 Ollama 可以导入的模型文件之后,就可以用上面正文一样的方式基于Ollama去使用心得模型了。
启动模型服务,创造一个ollama-llama3 的环境,并且进入 ollama 容器交互命令行环境
后面的步骤就是接入Dify,基于我们量化过后的模型进行各种建设了~
我们一起学AI!