既然要从零开始,咱们就避开那些复杂的文档,直接按生产环境的最小闭环来。DeepSeek 的 OCR 能力现在主要承载在 DeepSeek-VL2 系列模型上(特别是 Tiny 和 Small 版本),或者专门的 DeepSeek-OCR 模型。

在 2026 年,最稳、效率最高的方法是使用 vLLM 配合 4-bit 量化。以下是针对 Linux(Ubuntu)环境的安装指南。


零、 硬件与环境检查

在动手之前,先确认你的“工位”:

  • 显存: 8GB 显存是门槛(RTX 3060/4060 及以上)。
  • 驱动: 确保 nvidia-smi 能跑通,CUDA 版本建议 $\ge$ 12.1。
  • Python: 建议 3.10+。

一、 环境隔离(Conda)

别在系统环境里乱搞,直接起个干净的 Conda:

Bash

conda create -n ds_ocr python=3.10 -y
conda activate ds_ocr

# 安装核心依赖
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
pip install "transformers>=4.45.0" accelerate vllm qwen-vl-utils

二、 部署:追求极致性能(vLLM 方案)

不要用原生的 transformers 加载,速度太慢。我们用 vLLM 把它起成一个 OpenAI 兼容的 API 服务。

1. 启动服务端

打开一个 Terminal,直接压榨显存利用率(假设你用的是 DeepSeek-OCR 模型):

Bash

# 建议使用 GPTQ 或 AWQ 量化版,如果没有,vLLM 会尝试自动处理
python -m vllm.entrypoints.openai.api_server \
    --model deepseek-ai/DeepSeek-OCR \
    --trust-remote-code \
    --gpu-memory-utilization 0.8 \
    --max-model-len 4096 \
    --limit-mm-per-prompt image=1 \
    --port 8000

注意: gpu-memory-utilization 设置为 0.8 是为了给图像处理留点“呼吸空间”。


三、 调用:实战 OCR 脚本

起好服务后,你只需要写个简单的客户端脚本就能批量处理图像了。

Python

import httpx
import base64
import asyncio

async def deepseek_ocr(image_path):
    # 1. 图像转 Base64
    with open(image_path, "rb") as f:
        img_b64 = base64.b64encode(f.read()).decode("utf-8")

    # 2. 构造请求 Payload
    payload = {
        "model": "deepseek-ai/DeepSeek-OCR",
        "messages": [
            {
                "role": "user",
                "content": [
                    {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img_b64}"}},
                    {"type": "text", "text": "请将图片中的文字提取出来,保留原始表格和段落结构,输出为 Markdown。"}
                ]
            }
        ],
        "temperature": 0.1
    }

    async with httpx.AsyncClient(timeout=None) as client:
        response = await client.post("http://localhost:8000/v1/chat/completions", json=payload)
        return response.json()['choices'][0]['message']['content']

if __name__ == "__main__":
    res = asyncio.run(deepseek_ocr("test_document.png"))
    print(res)

四、 针对 8GB 显存的“保命”建议

如果你在安装或运行中遇到 OOM(显存溢出)

  1. 限制分辨率: 在前端用 PILOpenCV 把图片先 Resize 到 1024 像素宽。传大图(如 4K 扫描件)给 API 是新手最常犯的错。
  2. 量化加载: 如果显存实在吃紧,在启动服务时加上 --quantization gptq
  3. 关闭 Prefix Caching: 在 OCR 这种单轮且图像不重复的任务中,缓存没有意义。启动时加 --no-enable-prefix-caching

五、 总结

这套方案走的是生产级流水线逻辑:

  • 后端: vLLM 负责高效调度和显存池管理。
  • 模型: DeepSeek 的光学压缩层负责把像素浓缩成 Token。
  • 前端: 异步 API 调用负责高并发吞吐。