LLM学习笔记2——使用Docker(Ollama+OpenWebUI)实现本地部署DeepSeek-R1-14B模型
系列文章目录
参考博客
参考博客
文章目录
- 系列文章目录
- 前言
- DeepSeek-R1
- Docker
- Ollama
- OpenWebUI
- 部署软硬件环境
- 一、安装nvidia-container-toolkit工具
- 1、简单介绍
- 2、安装步骤
- 1.配置添加官方密钥和仓库
- 2.从存储库更新软件包列表
- 3.安装NVIDIA容器工具包
- 4.查看版本
- 5.配置 Docker 使用 NVIDIA nvidia-container-toolkit工具
- 二、多容器协作Docker-Compose实现Ollama+OpenWebUI
- 1、安装Docker Compose
- 1.Docker Compose安装步骤
- 2.Docker Compose 常用指令
- 2、拉取Ollama和OpenWebUI的镜像
- 1.拉取ollama镜像
- 2.拉取OpenWebUI镜像
- 3、使用Docker Compose运行Ollama和OpenWebUI
- 1. 编写docker-compose.yml 文件
- 2.运行docker-compose.yml 文件
- 3. docker-compose.yml 文件解析
- 4.功能描述
- 4、在Docker下使用Ollama拉取模型
- 1.检查容器
- 2.拉取模型
- 3.模型测试
- 5、如何单独运行指定容器(题外话)
- 1.单独运行ollama容器(CPU)
- 2.单独运行ollama容器(GPU)
- 3.单独运行openwebui容器
- 三、Dockerfile自定义单镜像实现Ollama+OpenWebUI
- 四、模型结构
- 总结
前言
DeepSeek-R1
DeepSeek官网
DeepSeek R1是由DeepSeek公司推出的一款基于强化学习(RL)的开源推理模型。它无需依赖监督微调(SFT)或人工标注数据,完全通过强化学习训练而成。DeepSeek R1在数学、代码和自然语言推理任务上表现出色,其推理能力媲美甚至超越了OpenAI的O1正式版。同时,DeepSeek R1还具备低成本、高效率、多语言支持等优势,可广泛应用于教育辅导、金融分析、企业智能化升级等领域。
一文了解火爆的DeepSeek R1
Docker
Docker官网
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖于任何语言、框架或者包装系统。
docker入门,这一篇就够了。
Ollama
Ollama官网
Ollama是一个开源的 LLM(大型语言模型)服务工具,是大语言模型便捷的管理和运维工具,用于简化在本地运行大语言模型、降低使用大语言模型的门槛,使得大模型的开发者、研究人员和爱好者能够在本地环境快速实验、管理和部署最新大语言模型,包括如Llama、Qwen、Phi、Gemma、DeepSeek等开源的大型语言模型。Ollama现在已有Docker hub开源的镜像提供,这使得使用Docker容器运行大型语言模型变得更加简单。
OpenWebUI
OpenWebUI官网
Open WebUI 是构建与大规模语言模型(如 GPT、BERT 等)无缝对接的理想平台。它简化了开发流程,提供了易于使用的界面组件和灵活的 API,支持与大模型的高效集成,帮助开发者在短时间内构建出高度定制化和智能化的 Web 应用。
通过 Open WebUI,开发者不仅能够提高开发效率,还能为用户提供更智能、更个性化的体验。无论是在智能客服、自动内容生成、数据分析,还是个性化推荐等领域,Open WebUI 与大模型的结合都展现出巨大的潜力和应用价值。
部署软硬件环境
系统:ubuntu 18.04
GPU:NVIDIA 2080Ti(22G魔改卡)
远程连接:NoMachine+ZeroTier
辅助部署工具:DeepSeek-R1,ChatGPT-o3-mini,文心一言
一、安装nvidia-container-toolkit工具
1、简单介绍
在使用Docker运行需要GPU加速的AI应用时, 需要使用nvidia-container-toolkit工具,它是让容器访问宿主GPU的关键桥梁。
NVIDIA容器工具包使用户能够构建和运行GPU加速的容器。该工具包包括一个容器运行时库和实用程序,用于自动配置容器以利用NVIDIA GPU。
2、安装步骤
官方教程
先安装Docker。
安装Docker参考博客
升级更新一下
sudo apt-get update
没有curl库的安装一下
sudo apt-get install -y curl
1.配置添加官方密钥和仓库
配置添加官方密钥和仓库:
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
完成后会生成两个文件,分别是密钥和仓库,检查一下是否正常,不要是空文件:
/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
/etc/apt/sources.list.d/nvidia-container-toolkit.list
2.从存储库更新软件包列表
从存储库更新软件包列表
sudo apt-get update
提示nvidia更新失败:
E: 仓库 “https://nvidia.github.io/libnvidia-container/stable/deb/amd64 Release” 没有 Release 文件。
N: 无法安全地用该源进行更新,所以默认禁用该源。
N: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。
查了一下原因,在github上找到解决方法
默认情况下,sudo命令会重置环境变量,只保留一些基本的环境变量。但是通过使用-E选项,可以保留当前用户的环境变量,使得执行的命令可以继承当前用户的环境设置。
所以“sudo apt-get update”不遵循本地机器的代理设置,需要加“-E”操作。
重新更新软件包列表
sudo -E apt-get update
3.安装NVIDIA容器工具包
安装NVIDIA容器工具包:
sudo -E apt-get install -y nvidia-container-toolkit
4.查看版本
启动Docker服务后,可以使用以下命令来查看nvidia-container-toolkit的版本:
nvidia-container-cli --version
# 或者
nvidia-container-runtime --version
5.配置 Docker 使用 NVIDIA nvidia-container-toolkit工具
编辑 Docker 配置文件 /etc/docker/daemon.json,添加以下内容:
{
"registry-mirrors": [
"https://xxx.com"
],
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
在更改配置后,重启 Docker 服务:
sudo systemctl restart docker
二、多容器协作Docker-Compose实现Ollama+OpenWebUI
1、安装Docker Compose
安装Docker Compose 参考博客
1.Docker Compose安装步骤
# 安装最新版本docker-compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 加上许可权限
sudo chmod +x /usr/local/bin/docker-compose
# 查看是否已成功安装
docker-compose --version
# docker-compose是一个文件,如果要卸载只需要把文件删除即可
rm /usr/local/bin/docker-compose
2.Docker Compose 常用指令
docker-compose up:启动应用程序的所有服务。如果容器不存在,则会自动创建并启动。如果容器已经存在,则会重新启动。
docker-compose down:停止并移除应用程序的所有服务。这将停止并删除所有相关的容器、网络和卷。
docker-compose start:启动应用程序的所有服务。与docker-compose up不同的是,docker-compose start只会启动已经存在的容器,而不会重新创建。
docker-compose stop:停止应用程序的所有服务。与docker-compose down不同的是,docker-compose stop只会停止容器,而不会删除它们。
docker-compose restart:重启应用程序的所有服务。这将停止并重新启动所有容器。
docker-compose ps:列出应用程序的所有服务及其状态。这将显示每个服务的容器ID、状态、端口映射等信息。
docker-compose logs:查看应用程序的服务日志。这将显示所有服务的日志输出。
docker-compose build:构建应用程序的服务镜像。这将根据定义的Dockerfile构建镜像。
docker-compose exec:在运行的容器中执行命令。例如,docker-compose exec web ls将在名为web的容器中执行ls命令。
docker-compose down --volumes:停止并移除应用程序的所有服务,并删除所有相关的容器、网络和卷。使用--volumes选项可以删除与服务关联的卷。
2、拉取Ollama和OpenWebUI的镜像
1.拉取ollama镜像
拉取ollama镜像:
sudo docker pull ollama/ollama
如果pull拉取不稳定,可以尝试修改/etc/docker下的daemon.json配置文件,增加一些网址,加速Docker镜像。
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://pee6w651.mirror.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://mirror.baidubce.com"
]
}
查看ollama镜像是否拉取成功:
sudo docker images
2.拉取OpenWebUI镜像
拉取OpenWebUI镜像:
sudo docker pull ghcr.io/open-webui/open-webui:main
查看OpenWebUI镜像是否拉取成功:
sudo docker images
3、使用Docker Compose运行Ollama和OpenWebUI
参考博客
1. 编写docker-compose.yml 文件
services:
ollama:
image: ollama/ollama
container_name: ollama
ports:
- "11434:11434"
volumes:
- ./ollama:/root/.ollama
restart: unless-stopped
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
environment:
ROOT_PATH: "/ollama"
OLLAMA_BASE_URL: "http://ollama:11434"
ports:
- "3030:8080"
volumes:
- ./open-webui:/app/backend/data
restart: always
depends_on:
- ollama
2.运行docker-compose.yml 文件
在 docker-compose.yml 所在目录下打开终端,执行:
docker-compose up -d
如果提示以下错误:
Error response from daemon: could not select device driver "nvidia" with capabilities: [[gpu]]
请查看前面的一、安装nvidia-container-toolkit工具下的:5.配置 Docker 使用 NVIDIA nvidia-container-toolkit工具是否完成。
然后在浏览器访问:
http://localhost:3030
使用默认的管理员账号登录:
默认管理员账号:admin
默认管理员邮箱:admin@openwebui.com
默认密码:admin
即可使用 Open WebUI 交互 AI 模型。
3. docker-compose.yml 文件解析
以上 docker-compose.yml 文件定义了两个服务:ollama 和 open-webui,它们一起运行,提供一个基于 Ollama 的 AI 模型服务,并通过 Open WebUI 提供一个 Web 界面进行交互。
ollama:
image: ollama/ollama
container_name: ollama
ports:
- "11434:11434"
volumes:
- ./ollama:/root/.ollama
restart: unless-stopped
image: ollama/ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
image声明使用ollama/ollama镜像。
container_name指定容器的名称为 ollama。
ports将宿主机的 11434 端口 映射到容器的 11434 端口,用于 API 调用。
volumes把宿主机的 ./ollama 目录映射到容器的 /root/.ollama,用于持久化 Ollama 下载的模型文件。
restart容器崩溃时会自动重启,除非手动停止。
配置deploy资源,指定ollama容器可以访问所有 GPU,并且声明所需的能力为 gpu。
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
environment:
ROOT_PATH: "ollama"
OLLAMA_BASE_URL: "http://ollama:11434"
ports:
- "3020:8080"
volumes:
- ./open-webui:/app/backend/data
restart: always
depends_on:
- ollama
image声明使用ghcr.io/open-webui/open-webui:main镜像,该镜像提供一个 Web 界面,让用户更方便地与 Ollama 交互。
container_name指定容器的名称为 open-webui。
ROOT_PATH设定 Web UI 的根路径为ollama。
OLLAMA_BASE_URL指定 Ollama API 的地址,指向 ollama 容器的 11434 端口,确保 open-webui 能够访问它。
ports将宿主机的 3030 端口 映射到容器的 8080 端口,即用户可以在 http://localhost:3030 访问 Open WebUI。
volumes把宿主机的 ./open-webui目录映射到容器的 /app/backend/data,持久化 Open WebUI 需要的数据,如配置文件等。
restart容器崩溃时会自动重启,确保 Web UI 始终可用。
depends_onsh声明open-webui 依赖于 ollama,确保 ollama 容器先启动。
4.功能描述
该docker-compose.yml 文件定义的服务是Ollama 负责运行 AI 模型,提供 API 服务(端口 11434),Open WebUI 提供可视化界面,并与 Ollama 交互(端口 3020)。
volumes: - ./open-webui:/app/backend/data中的./open-webui是一个相对路径,表示当前目录下的 open-webui 文件夹。例如docker-compose.yml 文件位于 /home/user/my-project,那么 ./open-webui 就是 /home/user/my-project/open-webui。这个路径是宿主机上的路径,Docker 会将这个目录挂载到容器内的 /app/backend/data
持久化数据:
./ollama 目录保存 AI 模型文件。
./open-webui 目录存储 Web UI 相关数据。
自动重启机制,保证系统稳定运行。
4、在Docker下使用Ollama拉取模型
1.检查容器
确保容器已启动且名称正确。可以通过以下命令检查:
docker ps
2.拉取模型
拉取模型:
sudo docker exec -it ollama ollama run deepseek-r1:14b
3.模型测试
终端测试:
OpenWebUI测试:
docker exec 命令解析:
docker exec
# 用来在一个已经运行的容器内执行命令的。它允许你在容器内部启动一个新的进程,通常用于调试和管理。
-it
# i(interactive)使容器的标准输入保持打开,以便你可以与容器内的进程进行交互,t(tty)为容器分配一个伪终端,这使得你可以以终端模式运行命令。
ollama
# 这是正在运行的容器的名称。刚刚通过 docker run 命令启动了这个容器,并给它指定了名称 ollama。
ollama run deepseek-r1:14b
# 这是在容器内执行的命令。它调用了 ollama 应用程序,并加载了deepseek-r1:14b 模型。
具体想要拉取哪个模型可以到Ollama官网中查询。
5、如何单独运行指定容器(题外话)
1.单独运行ollama容器(CPU)
docker run -d -v ./ollama:/root/.ollama -p 11434:11434 --names ollama --restart alway ollama/ollama
-v ./ollama 是挂载在自己机器的目录,是当前目录下的文件夹
2.单独运行ollama容器(GPU)
docker run -d --gpus=all -v ./ollama:/root/.ollama -p 11434:11434 --name ollama --restart always ollama/ollama
3.单独运行openwebui容器
docker run -d -p 3030: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
三、Dockerfile自定义单镜像实现Ollama+OpenWebUI
未完待续。。。
四、模型结构
未完待续。。。
总结
之前尝试过只依靠了一个Hugging Face的Transformers库去部署Meta-Llama-3.2_1B的模型,实际的使用体验相当不好,这次使用Ollama+OpenWebUI部署DeepSeek-R1-14B模型,体验感还是不错的,一方面14B比1B大且能力更强,另一方面有Ollama和OpenWebUI等框架的加持。
在24年年末的deepseekV3以及今年过年时的R1出圈爆火,但是放假在家没带电脑也没法远程连接电脑,只能年后回来尝试本地部署,刚回来上班又有一些堆积的工作需要忙碌,直到现在才抽空做了一部分。
后续有时间会继续尝试将Ollama和OpenWebUI部署到单个Docker镜像中,以及更新学习一些有关的deepseek的LLM模型结构。