← 返回文章列表

本地跑模型

在自己的電腦上執行小模型,記錄環境準備、模型選擇和推理實踐。

自己還有一臺筆記本,配置還可以,閒來無事,跑一些簡單的小模型。

這是之前記錄的配置:

=== 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 整理。實際創作日期尚無法確認。

原始日期: 2025-01-11 09:57:21 +0800