简介:这份资源面向具备基础命令行与容器化概念、希望将预训练语言模型落地到本地环境的开发者与研究人员,提供DeepSeek-R1从零部署的完整技术流程。内容围绕Ollama安装、按显存容量适配1.5B至70B不同模型尺寸、Docker与Open WebUI扩展配置,以及命令行和图形化界面两种调用方式展开,帮助读者在Windows、macOS或Linux上完成模型运行与测试。资源包为1个docx文档,约15KB,以图文步骤与操作指令为主,便于按章节对照执行。目前已有5390人学习下载,适合需要手把手排错、快速搭建本地AI实验环境的中级技术人员参考。
1. 为什么要在本机跑 DeepSeek:从 Ollama 安装到 WebUI 集成的完整链路
很多人第一次接触 DeepSeek,是从网页端或 API 开始的,但真正让它在团队里跑起来的,往往是本地部署这条路径。原因很直接:数据不出内网、调用不受额度限制、可以把模型嵌进自己的工具链里。而 Ollama 把这条路径的门槛压到了最低——一条命令拉模型,一条命令起服务,再用 Open WebUI 补上对话界面,整套流程在普通开发机上就能跑通。
这套链路解决的核心问题是「模型可控」:权重在你自己的磁盘上,推理在你自己的显卡或 CPU 上,接口地址是你自己的localhost。适合的人群包括需要处理内部文档的开发者、想给团队搭一个私有问答入口的运维、以及单纯想研究模型行为的技术人员。接下来按「装 Ollama → 拉 DeepSeek → 起 WebUI → 调优排错」的顺序,把每一步的命令、参数和坑讲清楚。
2. Ollama 安装与 DeepSeek 模型拉取:命令、镜像与显存匹配
2.1 Ollama 在 Windows、macOS、Linux 上的安装差异
Ollama 的安装方式按平台分三类,选错了会在后面拉模型时遇到权限或路径问题。
Windows 和 macOS 直接下载安装包,双击后它会注册成后台服务,默认监听127.0.0.1:11434。Linux 用官方脚本:
# Linux 一键安装,脚本会自动识别架构并注册 systemd 服务 curl -fsSL https://ollama.com/install.sh | sh # 安装后确认服务状态,正常应显示 active (running) systemctl status ollama # 查看版本,确认安装成功 ollama --version逻辑说明:安装脚本会把二进制放到/usr/local/bin,并创建ollama.service。参数上不需要额外配置,但如果你在容器或 WSL 里跑,要确认11434端口没有被占用。Windows 用户如果遇到virtualization support not detected这类 Docker Desktop 报错,那是 Docker 的问题,和 Ollama 本身无关——Ollama 不依赖 Docker,可以直接装。
提示:Linux 上如果
systemctl status显示 failed,先看journalctl -u ollama -n 50,多数是端口冲突或显存驱动没装好。
2.2 拉取 DeepSeek 模型:版本选择与国内下载慢的处理
DeepSeek 在 Ollama 上的模型名以deepseek开头,常见的有deepseek-r1系列和deepseek-coder系列。拉取命令很简单:
# 拉取 7B 参数的 DeepSeek 模型,适合 8GB 显存左右的机器 ollama pull deepseek-r1:7b # 拉取 1.5B 小模型,适合纯 CPU 或显存紧张的场景 ollama pull deepseek-r1:1.5b # 查看本地已下载的模型列表 ollama list逻辑说明:pull会从 Ollama 的模型仓库下载权重,默认走官方源。国内下载慢是高频问题,常见做法是配置镜像源环境变量:
# 临时生效,指向国内镜像加速下载 export OLLAMA_HOST=127.0.0.1:11434 export OLLAMA_MODELS=/data/ollama/models # 部分镜像通过 registry 配置,写入服务环境变量后重启 sudo systemctl edit ollama # 在编辑器中加入: # [Service] # Environment="OLLAMA_MODELS=/data/ollama/models"参数说明:OLLAMA_MODELS改的是模型存储路径,默认在~/.ollama/models,磁盘紧张时改到大数据盘。镜像源的具体地址各时期不同,建议以当前可用的镜像为准,不要硬编码过期地址。
2.3 显存与模型规模的匹配表
选错模型规模是本地部署最常见的翻车点。下表按量化后的显存占用给出参考:
| 模型规模 | 量化方式 | 显存占用(约) | 适用硬件 |
|---|---|---|---|
| 1.5B | Q4 | 1.5–2 GB | 纯 CPU / 4GB 显存 |
| 7B | Q4 | 5–6 GB | 8GB 显存 |
| 14B | Q4 | 10–12 GB | 16GB 显存 |
| 32B | Q4 | 20–24 GB | 24GB 显存 |
逻辑说明:Ollama 默认使用 Q4 量化,显存不够时会自动回退到 CPU 推理,速度会明显下降。判断是否跑在 GPU 上,用ollama ps看PROCESSOR列,显示100% GPU才是全量上卡。
3. Open WebUI 集成:用 Docker 起一个能对话的前端
3.1 Open WebUI 的 Docker 安装与端口映射
Ollama 自带命令行交互,但团队用起来还是图形界面顺手。Open WebUI 是目前集成度较高的选择,用 Docker 起最省事:
# 拉取 Open WebUI 镜像 docker pull ghcr.io/open-webui/open-webui:main # 启动容器,映射 3000 端口,并连接到宿主机的 Ollama docker run -d \ -p 3000:8080 \ --add-host=host.docker.internal:host-gateway \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:main逻辑说明:-p 3000:8080把容器内的 8080 映射到宿主机 3000,浏览器访问http://localhost:3000。--add-host让容器能通过host.docker.internal访问宿主机的 Ollama 服务,这是 Linux 上必须加的一行,否则容器内连不上11434。-v把数据卷持久化,重启容器不丢对话记录。
参数说明:如果你的 Ollama 跑在另一台机器上,把--add-host换成-e OLLAMA_BASE_URL=http://<ollama-ip>:11434。--restart always保证开机自启。
3.2 容器内连接宿主机 Ollama 的两种配置方式
连接方式取决于 Ollama 和 WebUI 是否在同一台机器:
# 方式一:同机部署,用 host.docker.internal docker run -d -p 3000:8080 \ --add-host=host.docker.internal:host-gateway \ -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \ -v open-webui:/app/backend/data \ ghcr.io/open-webui/open-webui:main # 方式二:Ollama 在远程机器,直接指定 IP docker run -d -p 3000:8080 \ -e OLLAMA_BASE_URL=http://192.168.1.100:11434 \ -v open-webui:/app/backend/data \ ghcr.io/open-webui/open-webui:main逻辑说明:OLLAMA_BASE_URL是 WebUI 找模型服务的地址。同机时用host.docker.internal比写127.0.0.1可靠,因为容器内的127.0.0.1指向容器自己。远程方式要确保 Ollama 监听了0.0.0.0而不是只监听本地:
# 让 Ollama 接受外部连接,写入服务环境变量 sudo systemctl edit ollama # [Service] # Environment="OLLAMA_HOST=0.0.0.0:11434" sudo systemctl restart ollama注意:开放
0.0.0.0后,同网段任何机器都能访问你的模型服务,内网环境也要评估一下是否需要加防火墙规则。
3.3 WebUI 里切换 DeepSeek 模型与对话参数
容器起来后,浏览器打开http://localhost:3000,首次进入要注册一个管理员账号(本地部署,账号只存在你自己的数据库里)。登录后在左上角模型下拉框里就能看到ollama list里的 DeepSeek 模型。
对话参数在设置里调,几个关键项:
| 参数 | 作用 | 建议值 |
|---|---|---|
| Temperature | 控制随机性 | 代码任务 0.2,创意任务 0.8 |
| Top P | 采样范围 | 0.9 |
| Context Length | 上下文窗口 | 按显存调,7B 建议 4096 |
| Max Tokens | 单次输出上限 | 2048 |
逻辑说明:Temperature 调低让输出更确定,适合代码和结构化任务;调高则发散。Context Length 拉太大会吃显存,7B 模型在 8GB 卡上建议不超过 8192。改完参数后新开对话才生效,旧对话沿用旧参数。
4. 深度模型运行调优:API 调用、性能排查与常见报错
4.1 用 Ollama API 直接调用 DeepSeek
WebUI 是给人用的,程序调用走 API 更直接。Ollama 兼容 OpenAI 风格的接口:
import requests # 调用本地 Ollama 的 DeepSeek 模型 response = requests.post( "http://localhost:11434/api/generate", json={ "model": "deepseek-r1:7b", # 模型名要和 ollama list 一致 "prompt": "用 Python 写一个快速排序", "stream": False, # False 一次性返回,True 流式返回 "options": { "temperature": 0.2, # 代码任务降低随机性 "num_ctx": 4096 # 上下文窗口 } } ) print(response.json()["response"])逻辑说明:/api/generate是单轮补全接口,/api/chat是多轮对话接口。stream设为True时返回的是逐块 JSON,需要循环读取。options里的参数和 WebUI 里调的是同一套,num_ctx直接对应上下文长度。
参数说明:model必须和ollama list输出的名字完全一致,写错会返回model not found。num_ctx调大显存占用上升,调太小长文档会被截断。
4.2 推理速度慢的三个排查方向
本地跑 DeepSeek 最常见的抱怨是「慢」。按下面顺序排查:
# 第一步:确认是否跑在 GPU 上 ollama ps # 看 PROCESSOR 列,100% GPU 才正常,出现 CPU 就是没上卡 # 第二步:看显存占用,确认模型是否被换出 nvidia-smi # 显存接近满载时,Ollama 会频繁换页,速度骤降 # 第三步:看服务日志有没有重试或超时 journalctl -u ollama -n 100逻辑说明:ollama ps显示的是当前加载的模型和它的处理器分配。如果显示100% CPU,说明显存不够,模型被放到内存里跑,速度差一个数量级。nvidia-smi看显存是否被其他进程占用。日志里如果有context canceled或反复加载,通常是上下文设太大导致显存溢出。
提示:7B 模型在 8GB 显存上跑,
num_ctx设 4096 比较稳,设 8192 就可能触发 CPU 回退。
4.3 模型加载失败与端口冲突的处理
几个高频报错和对策:
| 报错信息 | 原因 | 处理 |
|---|---|---|
model not found | 模型名写错或没拉取 | ollama list核对名字 |
connection refused | Ollama 服务没起 | systemctl start ollama |
address already in use | 11434 端口被占 | lsof -i:11434找到进程 |
out of memory | 显存或内存不足 | 换小模型或降num_ctx |
| WebUI 里看不到模型 | 容器连不上 Ollama | 检查OLLAMA_BASE_URL |
逻辑说明:connection refused在 Docker 场景里多半是OLLAMA_BASE_URL写成了127.0.0.1,容器内的本地回环不是宿主机。address already in use常见于重复启动 Ollama,或者别的服务占了 11434。
# 查端口占用 lsof -i:11434 # 或 ss -tlnp | grep 11434 # 确认 Ollama 实际监听地址 curl http://localhost:11434/api/tags逻辑说明:/api/tags返回本地模型列表,能通说明服务正常。返回空列表说明模型没拉取成功,返回连接错误说明服务没起或端口不对。
5. 进阶技巧:模型导出、多模型共存与 WebUI 反向代理
5.1 把 DeepSeek 模型导出为可迁移文件
Ollama 的模型存在~/.ollama/models下,直接拷贝整个目录可以迁移,但更干净的方式是用ollama show看模型结构再导出:
# 查看模型信息,包括参数规模和量化方式 ollama show deepseek-r1:7b # 查看模型存储路径 ls ~/.ollama/models/manifests/registry.ollama.ai/library/deepseek-r1/ # 迁移时打包整个 models 目录 tar -czf ollama-models.tar.gz ~/.ollama/models逻辑说明:Ollama 的模型由 manifest 和 blob 组成,manifest 记录层信息,blob 是实际权重。直接打包models目录最省事,目标机器解压到相同路径后ollama list就能看到。跨平台迁移要注意路径差异,Windows 的路径在%USERPROFILE%\.ollama\models。
5.2 多模型共存时的显存调度
同时加载多个模型会争抢显存,Ollama 默认会在空闲一段时间后卸载模型。控制这个行为:
# 设置模型常驻时间,默认 5 分钟,-1 表示常驻不卸载 ollama run deepseek-r1:7b --keepalive 30m # 或通过环境变量全局设置 export OLLAMA_KEEP_ALIVE=30m参数说明:--keepalive控制模型在内存里保留多久。频繁切换模型时设长一点避免反复加载,显存紧张时设短一点让不用的模型及时释放。多模型场景下,建议按使用频率排序,把最常用的模型设常驻。
5.3 用 Nginx 给 Open WebUI 加一层反向代理
团队访问时直接暴露 3000 端口不够规范,加一层 Nginx 做统一入口:
server { listen 80; server_name ai.internal; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 300s; # 长对话需要更长的读超时 } }逻辑说明:Upgrade和Connection两行是 WebSocket 支持,Open WebUI 的流式输出依赖它,缺了会表现为回复卡住不刷新。proxy_read_timeout默认 60 秒,长回答会超时断开,调到 300 秒以上。改完nginx -t测试配置再systemctl reload nginx。
注意:反向代理后如果 WebUI 出现静态资源 404,检查
proxy_set_header Host是否传递了正确的域名,Open WebUI 生成资源链接时会用到。
本文还有配套的精品资源,点击获取