首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

linux服务器部署自己本地微调的大模型,并利用api或ollama接入open webui

  • 25-04-24 14:24
  • 2277
  • 7911
blog.csdn.net

摘要:前期本地微调了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 [email protected]: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:仅测试分词器(可选验证步骤)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

2 导入模型进ollama
将生成的 merged.gguf 文件移动到 Ollama 的模型目录中:

# 创建模型存储目录(若不存在)
mkdir -p ~/.ollama/models
# 复制 GGUF 文件
cp merged.gguf ~/.ollama/models/
  • 1
  • 2
  • 3
  • 4

新建文件:

# 进入模型目录
cd ~/.ollama/models/
# 创建 Modelfile
touch Modelfile
  • 1
  • 2
  • 3
  • 4

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|>
"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
运行以下命令:
```bash
# 创建模型(跳过量化)
ollama create my_model -f ~/.ollama/models/Modelfile

# 运行测试
ollama run my_model
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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
    
    • 1
  2. 激活 Conda 环境:

    切换到新创建的环境:

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

    使用 pip 安装最新版本:

    pip install open-webui
    
    • 1
  4. 启动 Open WebUI 服务:

    运行以下命令启动服务:

    open-webui serve --host 0.0.0.0 --port 9090
    
    • 1

启动到官网界面后注册管理员账号:
(我已经注册过了,因此这里显示的是登录界面)
在这里插入图片描述

注:创建管理员账号/登录后可能会出现白屏现象,按这个教程就可以解决(教程)

登录进去后的界面:
可以在左上角选择模型,我这里有自己的微调模型也有ollama拉取的主流模型。
在这里插入图片描述

法2:使用docker

启动docker

sudo dockerd &
sudo systemctl start docker
sudo systemctl enable docker
  • 1
  • 2
  • 3

部署并与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
  • 1
  • 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 
  • 1

用宿主机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  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

step4.2 确保宿主机的9090端口(示例)的防火墙放行(如果本来就没开防火墙,就不需要这一步)

宿主机root权限执行:

# 如果宿主机启用了防火墙(如 `ufw` 或 `firewalld`),放行端口 `8000`
# 一般来说Ubantu系统用ufw做防火墙
sudo ufw allow 9090/tcp
sudo ufw reload
  • 1
  • 2
  • 3
  • 4

step4.3 在服务器上永久启用服务

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

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

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

    conda activate open-webui-new
    open-webui serve --host 0.0.0.0 --port 9090
    
    • 1
    • 2

    这会启动你的服务。

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

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

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

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

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

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

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

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

    tmux kill-session -t model_api
    
    • 1

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

注:本文转载自blog.csdn.net的wyatt_cat的文章"https://blog.csdn.net/m0_75206990/article/details/146587085"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

130
用户体验设计
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top