自己还有一台笔记本,配置还可以,闲来无事,跑一些简单的小模型。
这是之前记录的配置:
=== Hardware Configuration ===
CPU: Intel(R) Core(TM) Ultra 5 125H
Cores: 18 logical cores
Memory: 30Gi
GPU: NVIDIA GeForce RTX 4050 Laptop GPU
VRAM: 6141 MiB
Disk: nvme0n1 953.9G
显存大约 6GB,所以选模型时得稍微克制一下。参数量、量化方式、上下文长度和图像分辨率都会影响占用,模型文件能下载下来,不代表推理时一定装得下。
下面补的是部署方法和验证顺序,不是这台电脑的实测成绩。具体速度和显存占用需要在相同输入下记录,不能拿上游结果代替。
1、相关工具先分清
- Ollama:负责加载模型和提供推理接口。
- Open WebUI:负责聊天界面,连接已经运行的推理服务。
nvidia-smi:在 NVIDIA 环境里检查驱动、显存和进程。
先让 Ollama 单独跑通,再接界面。这样出问题时,比较容易分清是模型没加载好,还是界面没连上。
ollama --version
nvidia-smi
安装与系统支持以 Ollama 官方说明为准;macOS 没有 NVIDIA GPU 时不用执行 nvidia-smi。
2、Qwen3-VL-2B-Instruct
这是视觉语言模型,可以同时接收文字和图片。先选小的 Instruct 版本,适合从截图描述和简单文档识别开始。
Ollama 的模型页列出了这个确切标签和最低版本要求:Qwen3-VL 需要 Ollama 0.12.7 或以上。这里不要只写 qwen3-vl,否则以后默认标签变化,会把不同的模型混在一起。
ollama pull qwen3-vl:2b-instruct
ollama show qwen3-vl:2b-instruct
ollama run qwen3-vl:2b-instruct
先发一个普通文字问题,确认能正常回应,再退出交互去试图片。
通过本地接口发送图片
下面保存为 vision_request.py。把一张测试截图放在同目录,命名为 sample.png。这里使用 Python 标准库,不用额外装 SDK。
import base64
import json
from pathlib import Path
from urllib.request import Request, urlopen
image = base64.b64encode(Path("sample.png").read_bytes()).decode("ascii")
payload = {
"model": "qwen3-vl:2b-instruct",
"messages": [{
"role": "user",
"content": "提取图片中能够看清的文字,保持行顺序。看不清的地方标注不确定,不要补写。",
"images": [image],
}],
"stream": False,
"options": {"num_ctx": 4096, "num_predict": 512},
}
request = Request(
"http://127.0.0.1:11434/api/chat",
data=json.dumps(payload).encode("utf-8"),
headers={"Content-Type": "application/json"},
)
with urlopen(request, timeout=180) as response:
result = json.load(response)
print(result["message"]["content"])
REST 接口里的 images 要传 Base64 数据,而不是本地文件路径;SDK 的用法不一定相同,见 Ollama 视觉接口。这里把上下文和最大输出收小,是为了先验证流程,不是模型的能力上限。
运行后可以另开终端看 ollama ps,NVIDIA 环境再看 nvidia-smi。不要只看“回答出来了”:对照原图检查数字、标点和换行,尤其是模型有没有把看不清的内容猜出来。
3、再接 Open WebUI
原来记的是 Docker 安装方式。Docker 的好处是环境容易隔离,但也多了一个网络问题:容器里的 localhost 指向容器自己,不是宿主机上的 Ollama。
下面先给一个同机运行的方法,减少网络变量。终端命令按 Bash 写;Windows 的虚拟环境激活脚本不同。
mkdir local-model-ui
cd local-model-ui
python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install open-webui
DATA_DIR="$PWD/data" OLLAMA_BASE_URL=http://127.0.0.1:11434 \
open-webui serve --host 127.0.0.1 --port 13000
打开 http://127.0.0.1:13000,完成首次账号设置,在模型列表中选择刚才下载的模型。数据目录固定在当前项目的 data,升级或更换环境之前要保留它。
官方快速开始当前支持 Python 3.11 和 3.12;这里使用 3.11。端口参数来自 官方 CLI。
如果继续采用 Docker,按同一份官方文档处理数据卷、固定密钥和 Ollama 的宿主机地址。Docker Desktop 与 Linux Docker 的容器到宿主机网络有区别,不能把 host.docker.internal 当成所有系统都能直接用的地址。
4、DeepSeek-OCR 2
OCR 2 主要用于文档识别,和通用图文聊天模型的用途不完全相同。先拿一页文字清楚的文档测试,再看表格、多栏排版和扫描件,比较容易定位问题。
它不能因为名字里有 DeepSeek,就直接套一个 Ollama 模型标签。官方仓库提供了 Transformers 与 vLLM 两条推理路线。上游参考环境使用 Python 3.12.9、PyTorch 2.6.0 和 CUDA 11.8,还涉及 FlashAttention;这些依赖应单独建环境,和前面的 WebUI 环境分开。
具体顺序是:先按上游安装章节准备依赖,下载官方模型,修改输入与输出路径,再跑单页脚本。Transformers 的入口是:
DeepSeek-OCR2-master/DeepSeek-OCR2-hf/run_dpsk_ocr2.py
在仓库对应目录执行:
python run_dpsk_ocr2.py
模型来源是 deepseek-ai/DeepSeek-OCR-2 模型卡。读清楚代码加载方式与图像参数,再运行它。6GB 显存能否满足某一套配置,需要实际测量;这里没有给出“肯定跑得动”的结论。
如果发生 OOM,先记录是加载权重还是处理图片时出错,再减少分辨率、裁切数量或批量大小。降低图像分辨率也可能损失小字,得同时检查识别质量。
5、怎么判断算跑通了?
准备几张自己能够核对答案的图片:一张普通截图、一张数字较多的表格、一张多栏文档。保留原图、提示词、模型标签和运行配置。
每次只改一个条件,再记录:
- 文字是否漏行,数字与小数点是否正确。
- 表格单元格、列顺序和段落顺序是否保留。
- 有没有不确定却被补写的内容。
- 实际运行时间、峰值显存,以及是否有 CPU 分担计算。
先得到一个能够重复的结果,再考虑接知识库、批量 PDF 或自动化流程。否则界面看起来能用,也不一定知道模型在哪些输入上会出问题。