← 返回文章列表

本地跑模型

在自己的电脑上运行小模型,记录环境准备、模型选择和推理实践。

自己还有一台笔记本,配置还可以,闲来无事,跑一些简单的小模型。

这是之前记录的配置:

=== 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 或自动化流程。否则界面看起来能用,也不一定知道模型在哪些输入上会出问题。

关于这篇文章的日期

旧日期 2025-01-11 与文章发布记录不符,现按旧站可确认的首次发布日 2026-02-15 整理。实际创作日期尚无法确认。