终于可以在本地玩大模型了!Docker+Ollama+Dify,分分钟带你构建Llama模型本地服务,CPU也能玩的大模型教程!

文摘   2024-10-05 21:02   吉林  


点击箭头处“蓝色字”,关注更多及时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 程序的依赖关系。

所以,为了不影响到咱们的服务器或者本地环境,我们来通过下面的命令,用一个独立的可持续运行的容器镜像环境,专门用来下载模型:

docker pull dockerproxy.cn/library/python:3.10-slim









将python:3.10-slim下载到本地后,我们来执行下面的命令,启动一个名为 downloader 的后台容器:

docker run -d --name=downloader -v `pwd`:/models python:3.10-slim tail -f /etc/hosts









这个 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 文件的变化。由于这个文件通常不会变化,所以这个命令会无限期地等待,从而使容器保持运行状态。

接下来使用下面的命令,进入容器的命令行环境:

docker exec -it downloader bash









进行一些简单的软件源加速配置(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 "from modelscope import snapshot_download;snapshot_download('LLM-Research/Meta-Llama-3.1-8B-Instruct', cache_dir='./models/')"









整个命令的作用是,调用 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








docker pull ollama/ollama








2.2. 创建Ollama的Docker容器

通过 docker run 创建容器

docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

这个命令会从 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 命令进入正在运行的容器

docker exec -it ollama ollama run llama3

含义如下:

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 命令在已经运行的容器内执行命令:

docker exec -it ollama /bin/bash

这个命令会启动一个交互式的 Bash shell,允许你在容器内执行命令。这里的 ollama 是容器的名称,docker exec 会找到名为 ollama 的容器,并在其内部启动 Bash。

进入了容器的 Bash shell,你就可以执行任何命令,比如运行qwen2

ollama run 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 的转换啦。

/convert_hf_to_gguf.py ../LLM-Research/Meta-Llama-3___1-8B-Instruct

验证转换后模型:

./build/bin/llama-lookup-stats -m ../LLM-Research/Meta-Llama-3___1-8B-Instruct/Meta-Llama-8B-3___1-Instruct-F16.gguf

用模型跑个分:

./build/bin/llama-bench -m ../LLM-Research/Meta-Llama-3___1-8B-Instruct/Meta-Llama-8B-3___1-Instruct-F16.gguf

使用 simple 程序,来完成上面两个命令的“打包操作”:

./build/bin/llama-simple -m ../LLM-Research/Meta-Llama-3___1-8B-Instruct/Meta-Llama-8B-3___1-Instruct-F16.gguf

验证完转换的模型是正确,并且能够运行的之后,这里我们可以选择根据自己的硬件情况,进行一些量化操作,来降低模型运行对硬件的需求。


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 镜像,为了更好的维护和使用,我们可以给镜像起个合适的名字:

docker tag ollama/release:0.3.0-12-gf3d7a48-dirty-amd64 【新的名字】

搞定 Ollama 可以导入的模型文件之后,就可以用上面正文一样的方式基于Ollama去使用心得模型了。

启动模型服务,创造一个ollama-llama3 的环境,并且进入 ollama 容器交互命令行环境

docker run -d --gpus=all -v `pwd`:/root/.ollama -p 11434:11434 --name ollama-llama3 【新的名字】

后面的步骤就是接入Dify,基于我们量化过后的模型进行各种建设了~






我们一起学AI!



同桌的AI小纸条
一个专注于将先进的AI人工智能技术融入日常生活的频道。关注让AI为我们所用,探索人工智能领域的无限可能,并征服他们,让AI赋能生活快乐每一天!
 最新文章