docker 搭建 AI大数据模型 — 使用GPU方式
搭建本地大模型,最简单的方法!效果直逼GPT
服务器 | GPU | 系统 |
---|---|---|
HP580 G8 | P40 | Rocky9.2 |
安装程序 |
---|
AnythingLLM |
前端界面Open WebUI |
ChatOllama |
ollama |
一、AnythingLLM 介绍
AnythingLLM 是 Mintplex Labs Inc. 开发的一款开源 ChatGPT 等效工具,
用于在安全的环境中与文档等进行聊天,专为想要使用现有文档进行智能聊天或构建知识库的任何人而构建。
二、前端界面Open WebUI 介绍
Open WebUI 是针对 LLM 的用户友好的 WebUI,支持的 LLM 运行程序包括 Ollama
和 OpenAI 兼容的 API。
Open WebUI 系统旨在简化客户端(您的浏览器)和 Ollama API 之间的交互。
此设计的核心是后端反向代理,可增强安全性并解决 CORS 问题。
三、ChatOllama 介绍
ChatOllama 是一个 Nuxt 3 + Ollama Web 应用程序。ChatOllama 允许您管理您的 Ollama 服务器,
并与世界各地的 LLM 聊天。
从功能上来说,ChatOllama 类似于 Open WebU 和 AnythingLLM 的混合体,既可以和 AI 聊天,
也可以用来构建自己专属的知识库
四、ollama 介绍
开源免费:Ollama是一个不收费的开源工具。
即插即用:它提供了预装好的大模型,免除了复杂的安装和下载流程。
用户友好:即便没有任何技术背景,Ollama也易于上手和使用。
跨平台兼容性:
Ollama支持各种设备,包括PC、Mac甚至是树莓派。
运行各种规模的模型,保证了出色的扩展性。
安装docker
·
yum -y install iptables-services
systemctl restart iptables
systemctl enable iptables
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io --allowerasing
docker配置
more /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://proxy.1panel.live",
"https://docker.ketches.cn"
],
"ipv6": false,
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"data-root": "/data/docker"
}
mkdir /data/docker
systemctl start docker
systemctl enable docker
systemctl status docker
安装 AnythingLLM
docker pull mintplexlabs/anythingllm
export STORAGE_LOCATION=/data/anythingllm && \
mkdir -p $STORAGE_LOCATION && \
touch "$STORAGE_LOCATION/.env" && \
docker run -d -p 3001:3001 \
--restart always \
--cap-add SYS_ADMIN \
-v ${STORAGE_LOCATION}:/app/server/storage \
-v ${STORAGE_LOCATION}/.env:/app/server/.env \
-e STORAGE_DIR="/app/server/storage" \
mintplexlabs/anythingllm
报错:unable to open database file: ../storage/anythingllm.db
mkdir -p /data/anythingllm
chmod 777 -R /data/anythingllm
报错:Error: EACCES: permission denied, open '/app/server/.env'
chmod 777 -R /data/anythingllm/.env
报错:Error: EACCES: permission denied, open '/app/server/storage/comkey/ipc-priv.pem'
mkdir -p /data/anythingllm/comkey
chmod 777 -R /data/anythingllm/comkey
安装前端界面Open WebUI
github地址:https://github.com/open-webui/open-webui/pkgs/container/open-webui
CPU版示例
docker run -d -p 13000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
--name open-webui \
--restart always dyrnq/open-webui:main
注释:
-d:在后台运行容器。
-p 13000:8080:将主机的 13000 端口映射到容器的 8080 端口。主机上访问 http://localhost:13000 会转发到容器中的 8080 端口。
--add-host=host.docker.internal:host-gateway:添加一个主机条目,将 host.docker.internal 映射到主机的 IP 地址,以便容器可以访问主机上的服务。
:host-gateway 是宿主机IP地址
-v open-webui:/app/backend/data:将主机上的 open-webui 数据卷挂载到容器中的 /app/backend/data 目录,以便容器可以访问和持久化数据。
-e OLLAMA_BASE_URL=http://host.docker.internal:11434:设置环境变量 OLLAMA_BASE_URL,指定容器内应用连接的服务地址,使用主机名 host.docker.internal 和端口 11434。
--name open-webui:为容器指定名称 open-webui。
--restart always:确保容器在失败时自动重启,并在 Docker 启动时启动。
dyrnq/open-webui:main:指定 Docker 镜像及其标签。
--add-host=host.docker.internal:host-gateway 的作用就是在容器的hosts中加个解析
修正之后的命令如下:
docker run -d -p 13000:8080 \
--add-host=host.docker.internal:192.168.0.48 \
-v open-webui:/app/backend/data \
-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
--name open-webui --restart always dyrnq/open-webui:main
GPU版示例
docker run -d -p 13000:8080 \
--gpus all --add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always ghcr.io/open-webui/open-webui:cuda
注释:
-d:在后台运行容器。
-p 13000:8080:将主机的 13000 端口映射到容器的 8080 端口。主机上访问 http://localhost:13000 会转发到容器中的 8080 端口。
--gpus all:允许容器访问所有可用的 GPU,这对于需要 GPU 加速的应用很重要。
--add-host=host.docker.internal:host-gateway:添加一个主机条目,将 host.docker.internal 映射到主机的 IP 地址,以便容器可以访问主机上的服务。
:host-gateway 是宿主机IP地址
-v open-webui:/app/backend/data:将主机上的 open-webui 数据卷挂载到容器中的 /app/backend/data 目录,以便容器可以访问和持久化数据。
--name open-webui:为容器指定名称 open-webui。
--restart always:确保容器在失败时自动重启,并在 Docker 启动时启动。
ghcr.io/open-webui/open-webui:cuda:指定 Docker 镜像及其标签,cuda 表示这个镜像包含 CUDA 支持,适用于 GPU 加速
--add-host=host.docker.internal:host-gateway 的作用就是在容器的hosts中加个解析
修正之后的命令如下:
docker run -d -p 13000:8080 \
--gpus all --add-host=host.docker.internal:192.168.0.48 \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always ghcr.nju.edu.cn/open-webui/open-webui:cuda
更改为国内地址(下载快一点)
docker run -d -p 13000:8080 \
--gpus all --add-host=host.docker.internal:192.168.0.48 \
--name open-webui --restart always \
-v open-webui:/app/backend/data \
registry.cn-shenzhen.aliyuncs.com/funet8/open-webui:cuda
访问:http://192.168.0.48:13000
如果选择模型为空
设置完成之后,去到服务器上,进到这个docker容器中
进到容器中
echo "deb http://mirrors.aliyun.com/debian/ bookworm main contrib non-free" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/debian/ bookworm main contrib non-free" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free" >> /etc/apt/sources.list
apt update
apt install -y iputils-ping vim net-tools telnet
vim /etc/hosts
192.168.0.48 host.docker.internal
退出容器
在 iptables 中 放开所有
service iptables save
vim /etc/sysconfig/iptables
-A INPUT -p tcp -m tcp --dport 11434 -j ACCEPT
systemctl restart iptables
默认的是访问11434端口,如果想改为其他端口
docker exec -it open-webui /bin/bash
进到容器中
/app/backend# vim config.py
:%s/11434/11449/g (改为你想修改的端口即可)
docker restart open-webui
直接安装即可
安装ChatOllama(不指定IP版)
mkdir -p /data/chatollama/{data,db}
cd /data/chatollama
vim docker-compose.yml
把如下配置放到
version: '3.1'
services:
chromadb:
image: chromadb/chroma:latest
container_name: chatollama-db
restart: always
ports:
- "11431:8000"
volumes:
- ./data:/chroma/.chroma/index
chatollama:
image: 0001coder/chatollama:latest
#image: chatollama:local
container_name: chatollama-web
restart: always
#pull_policy: always
ports:
- "11432:3000"
volumes:
- ./db:/app/sqlite
environment:
- CHROMADB_URL=http://chromadb:8000
- DATABASE_URL=file:/app/sqlite/chatollama.sqlite
build:
context: .
dockerfile: Dockerfile
depends_on:
- chromadb
在目录中执行如下命令
docker-compose up -d
如果没有 docker-compose
安装地址
https://github.com/docker/compose/releases
wget https://github.com/docker/compose/releases/download/v2.28.1/docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose --version
数据库初始化
容器启动后,先不忙访问,还需要对 SQLite 数据库进行初始化处理
# 如果您是第一次启动,需要初始化 SQLite 数据库
docker-compose exec chatollama npx prisma migrate dev
如果不执行初始化,后面在创建知识库时会遇到下面的报错
Invalid `prisma.knowledgeBase.count()` invocation: The table `main.KnowledgeBase`
does not exist in the current database.
再启动
docker-compose up -d
安装ChatOllama(指定IP版)
version: '3.1'
services:
chromadb:
image: chromadb/chroma:latest
container_name: chatollama-db
restart: always
ports:
- "11431:8000"
volumes:
- ./data:/chroma/.chroma/index
networks:
mynetwork:
ipv4_address: 172.24.0.200 # 指定 chromadb 的 IP 地址
chatollama:
image: 0001coder/chatollama:latest
container_name: chatollama-web
restart: always
ports:
- "11432:3000"
volumes:
- ./db:/app/sqlite
environment:
- CHROMADB_URL=http://172.24.0.200:8000 # 使用指定的 chromadb IP 地址
- DATABASE_URL=file:/app/sqlite/chatollama.sqlite
build:
context: .
dockerfile: Dockerfile
depends_on:
- chromadb
networks:
mynetwork:
ipv4_address: 172.24.0.201 # 指定 chatollama 的 IP 地址
networks:
mynetwork:
driver: bridge
ipam:
config:
- subnet: 172.24.0.0/16
在目录中执行如下命令
docker-compose up -d
如果没有 docker-compose
安装地址
https://github.com/docker/compose/releases
wget https://github.com/docker/compose/releases/download/v2.28.1/docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose --version
数据库初始化
容器启动后,先不忙访问,还需要对 SQLite 数据库进行初始化处理
# 如果您是第一次启动,需要初始化 SQLite 数据库
docker-compose exec chatollama npx prisma migrate dev
如果不执行初始化,后面在创建知识库时会遇到下面的报错
Invalid `prisma.knowledgeBase.count()` invocation: The table `main.KnowledgeBase`
does not exist in the current database.
如果要删除多余的网卡
如果可能,清理掉现有的冲突网络。你可以通过以下命令列出所有 Docker 网络并删除冲突的网络:
docker network ls
docker network rm <network_id_or_name>
安装 ollama
### 如果在宿主机安装ollama 使用下面这个网址
### https://zhuanlan.zhihu.com/p/695355595
vim /etc/systemd/system/ollama.service
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/data/anaconda3/bin:/data/anaconda3/condabin:/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
Environment="OLLAMA_HOST=0.0.0.0" #(新增)
[Install]
WantedBy=default.target
systemctl daemon-reload
systemctl restart ollama
vim /etc/sysconfig/iptables
-A INPUT -p tcp -m tcp --dport 11434 -j ACCEPT
如果启动多个 Ollama 服务器实例,每个实例使用不同的主机和 GPU
systemctl stop ollama && systemctl disable ollama
mkdir /var/log/ollama_logs
vim start-ollama.sh
#!/bin/bash
# 启动多个 Ollama 实例,每个实例使用不同的 GPU 和端口
declare -A ports=( [0]=11434 [1]=11450 [2]=11451 [3]=11452 [4]=11453 [5]=11454 [6]=11455 [7]
=11456 )
for gpu in "${!ports[@]}"
do
export OLLAMA_HOST="0.0.0.0:${ports[$gpu]}"
export CUDA_VISIBLE_DEVICES=$gpu
# 启动 Ollama 实例
ollama serve &
# 输出启动信息
echo "Started Ollama instance on GPU $gpu at port ${ports[$gpu]}"
sleep 3
done
# 等待所有后台进程完成
wait
### docker 安装 ollama 使用下面方法
docker pull ollama/ollama
docker run --gpus "device=0" -e OLLAMA_FLASH_ATTENTI0N=1 \
--name ollama -p 11434:11434 -d ollama/ollama
注释:如果有四块GPU --gpus "device=" 指定使用哪一块显卡
从0开始 0是第一块 1是第二块
如果报错
docker: Error response from daemon:
could not select device driver "" with capabilities: [[gpu]].
从这里下载镜像文件(免费的)
### 如果下载不了,请评论或留言
上传到服务器的 /etc/yum.repos.d 中
yum -y install nvidia-container-runtime
yum install -y nvidia-docker2
systemctl restart docker
然后执行
docker run --gpus "device=0" -e OLLAMA_FLASH_ATTENTI0N=1 \
--name ollama -v /data/.ollama:/root/.ollama -v /etc/localtime:/etc/localtime \
-p 11434:11434 -d ollama/ollama
如果有多个GPU
docker run --gpus "device=1" -e OLLAMA_FLASH_ATTENTI0N=1 \
--name ollama_01 -v /data/.ollama:/root/.ollama -v /etc/localtime:/etc/localtime \
-p 11450:11434 -d ollama/ollama
将 device 修改一下
将 映射端口改一下
将 名称改一下 即可
修改转到后端的端口:例如将 11434 修改 11400
cd /var/lib/docker/containers/ 这个地址是docker存储地址
一个容器ID 就是一个文件夹 ,进去之后找到要修改的容器ID开头的文件夹
config.v2.json ## 配置文件config
hostconfig.json ## 配置文件hostconfig
vim comfig.v2.json
修改ExposedPorts 参数的值为要替换的端口
"ExposedPorts":{"11400/tcp":
vim hostconfig.json
PortBindings 参数的值为要替换的端口
"PortBindings":{"11400/tcp"
这两个配置文件,这以下需要注意的问题:
两个配置都需要更改,同时更改的内容需要一样
更改完成之后需要对docker服务重启,而不是docker容器重启
一定要先停止容器,再修改,修改后直接重启docker服务,再启动容器
如果其中哪一个环节出错,都会出现,修改后不生效的问题
最后展示一下 docker 配置
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://dockerproxy.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://ccr.ccs.tencentyun.com"
],
"ipv6": false,
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"data-root": "/data/docker",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
systemctl daemon-reload
systemctl restart docker
最后展示
最好用的模型:
ollama run qwen:32b
ollama run qwen2.5:7b
ollama run qwen2.5:14b
ollama run qwen2.5:32b (这个比较稳定一些)
ollama run qwen2:latest
ollama run qwen2:7b-instruct-q8_0
安装 nvidia-smi
docker run -it --rm --name test --gpus all nvidia/cuda
完结,撒花 。。。。。。。。。。。。。
open-webui参考文献
https://blog.csdn.net/wbsu2004/article/details/136443260
Chatollama 参考文献
https://blog.csdn.net/wbsu2004/article/details/136930945