摘要:前期本地微调了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

  1. 创建 Conda 环境:

    使用以下命令创建一个 Python 3.11 的新环境:

    conda create -n open-webui python=3.11
    
  2. 激活 Conda 环境:

    切换到新创建的环境:

    conda activate open-webui
    
  3. 安装 Open WebUI:

    使用 pip 安装最新版本:

    pip install open-webui
    
  4. 启动 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 在服务器上永久启用服务

这样就不怕每次关掉终端服务就停止,方便局域网里所有人随时查看,如果想停止服务可以手动停止。

  1. 创建一个新的 tmux 会话并命名:

    tmux new -s OpenWebUI # 命名为了OpenWebUI
    
  2. tmux 会话中运行以下命令:

    conda activate open-webui-new
    open-webui serve --host 0.0.0.0 --port 9090
    

    这会启动你的服务。

  3. 分离 tmux 会话,让服务在后台运行:

    • 按下 Ctrl + b,然后按 d。 这会让你退出 tmux 会话,但服务仍在后台运行。
  4. 重新连接到会话(可选): 如果你想查看服务运行状态,可以重新连接:

    tmux attach -t OpenWebUI
    
  5. 关闭会话(可选): 如果不再需要运行服务,可以关闭会话:

    tmux kill-session -t OpenWebUI
    
  6. 创建一个新的 model_api 会话并命名:

    tmux new -s model_api
    
  7. tmux 会话中运行以下命令:

    conda activate cat
    cd /home/chenaotian/LLM-Large-Language-Model/web
    python server.py
    
  8. 分离 tmux 会话,让服务在后台运行:

    • 按下 Ctrl + b,然后按 d。 这会让你退出 tmux 会话,但服务仍在后台运行。
  9. 重新连接到会话(可选): 如果你想查看服务运行状态,可以重新连接:

    tmux attach -t model_api
    
  10. 关闭会话(可选): 如果不再需要运行服务,可以关闭会话:

    tmux kill-session -t model_api
    

到此已经结束!有错误的地方欢迎大家指正,也十分欢迎大家评论区跟我交流讨论,我看到就一定回复!

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐