
linux服务器部署自己本地微调的大模型,并利用api或ollama接入open webui
前期本地微调了DeepSeek-R1-Distill-Qwen-1.5B,现在想给模型加一个前端。经过简单调研后决定选用开源项目open webui。但是上网查相关的配置教程发现大部分是ollama拉取开源模型并接入open webui,较少有自己微调的模型接入open webui,于是打算记录自己的完整步骤,供更多的人参考。
摘要:前期本地微调了DeepSeek-R1-Distill-Qwen-1.5B,现在想给模型加一个前端。经过简单调研后决定选用开源项目open webui。但是上网查相关的配置教程发现大部分是ollama拉取开源模型并接入open webui,较少有自己微调的模型接入open webui,于是打算记录自己的完整步骤,供更多的人参考。
openwebui项目地址:https://github.com/open-webui/open-webui
操作系统:Ubantu 22.04.4 LTS
step1 部署模型
open webui只支持与openAI兼容的API模型调用和部署在ollama里的模型调用。两种方法的优缺点:
- 与openAI兼容的API调用更便捷,唯一小缺点要写一个前端代码
- ollama部署要写Modelfile模版文件,并且微调模型每次更新后都要重新写Modelfile模版文件并载入ollama
我个人更推荐与openAI兼容的API调用,写好一个简单的前端代码,一劳永逸。但如果不会或不想写前端代码的,当然就选用ollama。
法1:将模型封装成 OpenAI 兼容的 API
先要在自己的微调代码里写一个简单的前端,与openAI兼容:
有两个关键路由要写:
1 模型列表路由,open webui会在这里面找你的模型。要求一定是/v1/models
。
2 用于对话的路由:(截图只截了部分)
法2:导入模型进ollama
说明:ollama只支持.gguf模文件,因此如果本地模型文件是.safetensor之类,要用开源项目llama.cpp将.safetensor模型文件转换成.safetensor模型文件。
1 使用llama.cpp进行模型转换(.safetensor —>.gguf)
# 创建专用conda环境(推荐Python 3.10)
conda create -n ollama_convert python=3.10
conda activate ollama_convert
# 仅克隆必要组件
git clone git@github.com:ollama/ollama.git
cd ollama
# 紧接着,同步 llm/llama.cpp 子模块:
git submodule init
git submodule update llm/llama.cpp
# 安装依赖
pip install -r llama.cpp/requirements.txt
# 运行转换脚本(FP16精度)
python llm/llama.cpp/convert_hf_to_gguf.py /home/chenaotian/merged_model --outtype f16 --outfile /home/chenaotian/LLM-Large-Language-Model/merged.gguf
python llm/llama.cpp/convert_hf_to_gguf.py \
--input_dir /path/to/your_model_dir \
--outtype f16 \
--outfile converted.bin
# 关键参数说明:
# --input_dir:包含safetensors分片和配置文件的目录
# --output_type:降低到f16浮点精度(也可以保持f32精度或)
# --vocab-only:仅测试分词器(可选验证步骤)
2 导入模型进ollama
将生成的 merged.gguf
文件移动到 Ollama 的模型目录中:
# 创建模型存储目录(若不存在)
mkdir -p ~/.ollama/models
# 复制 GGUF 文件
cp merged.gguf ~/.ollama/models/
新建文件:
# 进入模型目录
cd ~/.ollama/models/
# 创建 Modelfile
touch Modelfile
Modelfile
内容如下:
注意:这里是重点,每个人的Modelfile文件都不同,超参数和对话模版都要依据自己的模型定义。
FROM "/home/chenaotian/LLM-Large-Language-Model/merged.gguf"
PARAMETER temperature 0.6
PARAMETER num_ctx 131072
PARAMETER num_predict 512
PARAMETER stop "<|end▁of▁sentence▁|>"
PARAMETER top_p 0.95
TEMPLATE "
<|begin▁of▁sentence▁|>
{{ range .Messages }}
{{ if eq .Role "system" }}
{{ .Content }}
{{ end }}
{{ end }}
{{ range .Messages }}
{{ if eq .Role "user" }}<|User|>{{ .Content }}{{ end }}
{{ if eq .Role "assistant" }}<|Assistant|>{{ .Content }}<|end▁of▁sentence▁|>{{ end }}
{{ end }}
<|Assistant|><think>
"
运行以下命令:
```bash
# 创建模型(跳过量化)
ollama create my_model -f ~/.ollama/models/Modelfile
# 运行测试
ollama run my_model
step2 部署open-webui
使用docker当然更便捷,但问题是很多人可能跟我一样,是跟很多人一起共用服务器,为了保证安全,所有人被放在服务器的一个docker容器里面,因此docker中没法再创建docker,此时只能命令行一条条输命令,不过好在是不使用docker安装open-webui的过程一点都不复杂。
法1:不使用docker
-
创建 Conda 环境:
使用以下命令创建一个 Python 3.11 的新环境:
conda create -n open-webui python=3.11
-
激活 Conda 环境:
切换到新创建的环境:
conda activate open-webui
-
安装 Open WebUI:
使用 pip 安装最新版本:
pip install open-webui
-
启动 Open WebUI 服务:
运行以下命令启动服务:
open-webui serve --host 0.0.0.0 --port 9090
启动到官网界面后注册管理员账号:
(我已经注册过了,因此这里显示的是登录界面)
注:创建管理员账号/登录后可能会出现白屏现象,按这个教程就可以解决(教程)
登录进去后的界面:
可以在左上角选择模型,我这里有自己的微调模型也有ollama拉取的主流模型。
法2:使用docker
启动docker
sudo dockerd &
sudo systemctl start docker
sudo systemctl enable docker
部署并与ollama关联:
sudo docker run -d --network=host -v open-webui:/app/backend/data -e OLLAMA_BASE_URL=http://127.0.0.1:11434 --name open-webui1 --restart always ghcr.io/open-webui/open-webui:main
- docker run: 启动一个新的 Docker 容器。
- -d: 以守护进程模式运行容器,容器将在后台运行。
- -p 3000:8080: 将本地机器的端口 3000 映射到容器内的端口 8080。这意味着你可以通过访问 http://localhost:3000 来访问运行在容器内的服务。
- –add-host=host.docker.internal:host-gateway: 将主机名 host.docker.internal 映射到 Docker 网关。这对于在容器内访问主机服务很有用。
- -v open-webui:/app/backend/data: 将本地的 open-webui 卷映射到容器内的 /app/backend/data 目录。这用于持久化数据,确保即使容器停止或重新启动,数据也不会丢失。
- –name open-webui: 为容器指定一个名称 open-webui,以便于管理和识别。
- –restart always: 设置容器的重启策略为 always,这意味着容器如果停止(例如由于崩溃或系统重启),Docker 会自动重启它。
- ghcr.io/open-webui/open-webui:main: 使用来自 GitHub 容器注册表(GitHub Container Registry)的 open-webui 镜像,并指定使用 main 标签的版本。
step3 配置后端模型与前端open webui的连接
1 若使用Open AI兼容的API:
打开管理员面板:
点 设置——>外部连接
添加openAI API连接:
URL是固定的,一定要这么写:
http://localhost:5002/v1
密钥如果没有的话就写:NULL
最下面写自己模型在后端的项目路径。
然后点击保存即可。
2 若使用ollama
什么也不用做,open webui已经配置好ollama接入,直接在选模型那里选自己的模型即可。
step4 将服务部署运行在局域网
说明:我现在是在服务器的docker容器里,因此想将服务部署到局域网还要做一些操作:以服务部署在9090端口(随便选一个就行)为例
step4.1 将容器9090端口(示例)映射到宿主机9090端口(示例)
获取容器IP:
hostname -i
用宿主机root权限执行:
# 添加 NAT 规则(将宿主机的 8000 转发到容器 IP 的 9090 端口)
sudo iptables -t nat -A DOCKER -p tcp --dport 9090 -j DNAT --to-destination 容器IP:9090
# 允许转发流量
sudo iptables -A FORWARD -p tcp -d 容器IP --dport 9090 -j ACCEPT
# 保存规则(避免重启失效)
sudo iptables-save | sudo tee /etc/iptables/rules.v4
step4.2 确保宿主机的9090端口(示例)的防火墙放行(如果本来就没开防火墙,就不需要这一步)
宿主机root权限执行:
# 如果宿主机启用了防火墙(如 `ufw` 或 `firewalld`),放行端口 `8000`
# 一般来说Ubantu系统用ufw做防火墙
sudo ufw allow 9090/tcp
sudo ufw reload
step4.3 在服务器上永久启用服务
这样就不怕每次关掉终端服务就停止,方便局域网里所有人随时查看,如果想停止服务可以手动停止。
-
创建一个新的
tmux
会话并命名:tmux new -s OpenWebUI # 命名为了OpenWebUI
-
在
tmux
会话中运行以下命令:conda activate open-webui-new open-webui serve --host 0.0.0.0 --port 9090
这会启动你的服务。
-
分离
tmux
会话,让服务在后台运行:- 按下
Ctrl + b
,然后按d
。 这会让你退出tmux
会话,但服务仍在后台运行。
- 按下
-
重新连接到会话(可选): 如果你想查看服务运行状态,可以重新连接:
tmux attach -t OpenWebUI
-
关闭会话(可选): 如果不再需要运行服务,可以关闭会话:
tmux kill-session -t OpenWebUI
-
创建一个新的
model_api
会话并命名:tmux new -s model_api
-
在
tmux
会话中运行以下命令:conda activate cat cd /home/chenaotian/LLM-Large-Language-Model/web python server.py
-
分离
tmux
会话,让服务在后台运行:- 按下
Ctrl + b
,然后按d
。 这会让你退出tmux
会话,但服务仍在后台运行。
- 按下
-
重新连接到会话(可选): 如果你想查看服务运行状态,可以重新连接:
tmux attach -t model_api
-
关闭会话(可选): 如果不再需要运行服务,可以关闭会话:
tmux kill-session -t model_api
到此已经结束!有错误的地方欢迎大家指正,也十分欢迎大家评论区跟我交流讨论,我看到就一定回复!
更多推荐
所有评论(0)