在 Ubuntu 上安装 Ollama 并通过 Open WebUI 运行本地大语言模型

1. 引言

在这篇教程中,我们将详细介绍如何在 Ubuntu 系统上安装 Ollama,以及如何通过 Open WebUI 进行图形化管理本地大语言模型。你将能够在本地机器上运行诸如 DeepSeek-CoderCodeLlama 之类的大型语言模型,并通过 Web 界面与它们进行交互。通过这种方法,你无需依赖外部服务器,可以在本地机器上享受私有化、大模型的推理体验。

2. 系统要求

  • 操作系统:Ubuntu 20.04 或更高版本
  • 内存要求:至少 8GB RAM(建议 16GB 或更多)
  • 显卡要求:NVIDIA GPU(可选),但如果没有显卡也可以通过 CPU 运行
  • 其他要求:Docker、Git

3. 安装步骤

3.1 安装 Docker 和 Docker Compose

首先,我们需要安装 Docker 和 Docker Compose,这些是运行 Open WebUI 容器的前提。

# 更新系统并安装 Docker 和 Docker Compose sudo apt update sudo apt install docker.io docker-compose -y 

安装完成后,可以检查 Docker 是否安装成功:

docker --version docker-compose --version 

确保返回版本信息,说明 Docker 已成功安装。

3.2 配置 Docker 权限

如果在运行 Docker 命令时遇到权限错误,如 permission denied while trying to connect to the Docker daemon socket,可以通过将当前用户添加到 docker 组来解决:

# 将当前用户加入 docker 用户组 sudo usermod -aG docker $USER # 重新加载用户组配置并生效 newgrp docker 

然后,重新启动 Docker 服务:

sudo systemctl restart docker 

3.3 安装 Ollama

Ollama 是本地化的大语言模型推理引擎,我们将通过其提供的 API 来与模型进行交互。

# 安装 Ollama curl -fsSL https://ollama.com/install.sh | sh 

此命令将自动下载并安装 Ollama。

3.4 启动 Ollama 服务

安装完成后,启动 Ollama 服务:

ollama serve & 

该命令将在后台启动 Ollama 服务,默认监听端口 11434

3.5 拉取所需的模型

接下来,我们需要拉取本地模型。例如,拉取 DeepSeek-CoderCodeLlama 模型:

# 拉取 DeepSeek-Coder 模型 ollama pull deepseek-coder:instruct # 拉取 CodeLlama 模型 ollama pull codellama:13b-instruct 

3.6 安装 Open WebUI

为了方便操作和管理,我们使用 Open WebUI 来提供图形化的界面。Open WebUI 将通过浏览器访问本地的 Ollama 模型。

# 拉取并运行 Open WebUI 容器 docker run -d -p 3000:8080 --name open-webui --restart always \ -e OLLAMA_API_BASE_URL=http://localhost:11434/api \ ghcr.io/open-webui/open-webui:main 

3.7 访问 Open WebUI

WebUI 容器启动后,你可以在浏览器中访问本地界面:

http://localhost:3000 

在该页面,你可以选择加载的模型并开始与模型进行交互。

4. 配置和使用

4.1 配置 config.py

Open WebUI 容器中,配置文件 config.py 定义了模型和 Ollama API 的连接设置。你可以按照如下方式配置:

models_config = { "deepseek-chat": { "base_url": "https://api.deepseek.com", "key": "", }, "gpt-4o": { "base_url": "", "key": "", }, # 本地 Ollama(OpenAI 兼容 /v1) "ds-coder": { "base_url": "http://localhost:11434/v1", "key": "", "inner_model_name": "deepseek-coder:instruct" }, "c13b": { "base_url": "http://localhost:11434/v1", "key": "", "inner_model_name": "codellama:13b-instruct" } } 

在这里,你可以选择模型的名称、API 地址以及 API 密钥(如果有的话)。如果模型是在本地运行,则不需要密钥。

4.2 通过 Open WebUI 进行交互

打开浏览器并访问 http://localhost:3000,你将看到一个可视化界面。你可以在界面中选择不同的模型并开始与它们进行对话。例如,选择 DeepSeek-Coder 模型并输入一些编程相关的查询,模型将返回相应的代码生成和优化建议。


5. 常见问题与解决方法

5.1 权限问题

如果遇到 Docker 权限问题(如 permission denied),请确保将当前用户添加到 docker 组并重新登录。

5.2 显存不足

如果没有 NVIDIA 显卡,或者显存不够运行较大模型(如 codellama:13b-instruct),可以考虑使用较小的模型(例如 deepseek-coder:lite-instruct)。


6. 总结

通过上述步骤,你已经成功在 Ubuntu 上安装并运行了 Ollama 与 Open WebUI。现在,你可以在本地机器上享受与大语言模型的交互体验,无需依赖外部云端服务。通过 Docker 容器,你还可以方便地管理和切换不同的模型,提升工作效率。

希望这篇教程能帮助你更好地理解如何在本地运行大语言模型,并通过图形化界面进行管理。如果你有任何问题,欢迎在评论区留言!


Read more

前端科技新闻(WTN-4)你用了免费的 Trae 编辑器吗?排队多少名?我排在1584名

前端科技新闻(WTN-4)你用了免费的 Trae 编辑器吗?排队多少名?我排在1584名

写在前面,怎么说呢?首先是为了支持国产,用于偷懒写git摘要和部分内容的代码补充还是有些效率提升的,但是plan模式,基本上没怎么完成过。可能是项目不太标准的原因,要是做已经成熟的产品副本或许更简单- 突然有了个点子,找那些收费高卖的贵的,出青春版,或许有搞头。 也是首次,发现需要排队了,哈哈哈哈哈哈哈哈哈,让我想起某些游戏,付费插队 一、技术快讯|一次普通的 i18n 任务,却排到 1500 名之后 最近在使用 Trae 编辑器(免费版) 时,遇到了一件颇具“时代特色”的小插曲。 我只是想让 AI 帮忙做一个非常常规的工程任务: * 扫描页面组件 * 提取未国际化的中文文案 * 生成 key-value * 替换为统一的 $t('xxx') 调用 * 保证多语言资源文件结构一致 点击执行后,编辑器并没有立刻开始处理,而是弹出了一条提示:

【DataX篇】DataX的两种部署方式以及DataX-Web可视化管理平台的搭建

【DataX篇】DataX的两种部署方式以及DataX-Web可视化管理平台的搭建

💫《博主主页》: 🔎 ZEEKLOG主页:奈斯DB 🔎 IF Club社区主页:奈斯、 🔎 微信公众号:奈斯DB 🔥《擅长领域》: 🗃️ 数据库:阿里云AnalyticDB(云原生分布式数据仓库)、Oracle、MySQL、SQLserver、NoSQL(Redis) 🛠️ 运维平台与工具:Prometheus监控、DataX离线异构同步工具 💖如果觉得文章对你有所帮助,欢迎点赞收藏加关注💖     这篇文章将系统的分享 DataX 的安装部署实践,详细拆解DataX的两种核心部署方式——二进制部署与源码编译部署,并深入探讨动态参数配置、并发度优化等关键调优技巧。🎯     在此基础上,也将进一步介绍如何集成 DataX-Web可视化管控平台 ,以构建一个具备 统一调度、实时监控与高效管理 能力的企业级数据同步运维体系。🚀     DataX二进制、源码安装部署的 Github 地址: https://github.com/alibaba/DataX/blob/master/userGuid.md     DataX-Web二进制、

前端状态管理:别让你的状态变成一团乱麻

前端状态管理:别让你的状态变成一团乱麻 毒舌时刻 这状态管理得跟蜘蛛网似的,谁能理得清? 各位前端同行,咱们今天聊聊前端状态管理。别告诉我你还在使用 setState 管理所有状态,那感觉就像在没有地图的情况下寻宝——能找,但累死你。 为什么你需要状态管理 最近看到一个项目,组件之间传递状态需要经过 5 层,修改一个状态要修改多个地方。我就想问:你是在做状态管理还是在做传递游戏? 反面教材 // 反面教材:混乱的状态管理 function App() { const [user, setUser] = useState(null); const [posts, setPosts] = useState([]); const [comments, setComments] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { async function fetchData() { setLoading(