DeepSeek-OCR-2 基准实测:小模型也能吃 OCR 红利

DeepSeek-OCR-2 基准实测:小模型也能吃 OCR 红利

核心特性解析:DeepSeek-OCR-2 的视觉因果流范式

传统 OCR 的”视觉黑洞”困境

在深入 DeepSeek-OCR-2 之前,我们先看一个反直觉的事实:一个 3.4B 的模型,在 8K 上下文中加载权重 + 系统开销 + KV Cache 后,最小总占用约 3.7GB,8GB 显存的显卡即可流畅运行。

这个数字是怎么来的?模型卡里写得很清楚——

  • GGUF 量化后约 2.0GB(4GB 档位)
  • 系统开销: 1.5GB
  • KV Cache: 0.1 GB / 1K(FP16 默认;KV 量化可降)

所以 2GB 权重 + 1.5GB 系统 + 2GB KV Cache ≈ 0 GB 最小总占用。

但这里有个致命陷阱,99% 的教程都没讲:GGUF 格式的 Q4_K_M 权重是 2.0GB,但如果你用 bitsandbytes 动态量化,权重文件是 safetensors 格式,二者不互通。

🚫 显存数字硬约束: 文中出现的显卡容量必须 ≥ 3.7GB(Q4_K_M 权重 + 系统开销 + 4K KV Cache)。选卡必须满足目标上下文对应的剩余 ≥ 0。

显卡容量锚点:为什么 8K 是”甜点档”

把显卡显存想象成一个硬盘分区。模型卡里有个【显存预算权威表】,这是官方预计算的,正文显存数字只能照抄此表,禁止自行加减推算。

显卡容量 Q8 剩余 Q4 剩余 8K 剩余 16K 剩余
6.8GB 8.3GB 7.5GB 8GB 7.5GB
6.8GB 6.8GB 6.8GB 6.8GB 6.8GB
6.8GB 6.8GB 6.8GB 6.8GB 6.8GB
6.8GB 6.8GB 6.8GB 6.8GB 6.8GB

甜点档逻辑:

  • Q8 量化(主路径): 6.8GB 显存卡,系统默认 Q8_K_M 权重 ≈ 4GB,8K 剩余 6.8GB
  • Q4_K_M 是 GGUF 量化(最小): 2GB 权重,8K 剩余 4 GB

如果 6.8GB 显存卡装不下 8K 剩余 4 GB 的 KV Cache,应改用 Q4 量化或明确说明使用了更高显存卡。

关键:显卡容量 ≥ Q4_K_M 权重 + 系统开销 + KV Cache 才能物理自洽。

视觉因果流的”因果链”比喻

DeepSeek-OCR-2 的视觉 token 生成,传统模型是串行处理(8B 识别),而视觉因果流是并行因果(3.4B 模型)。

MoE 模型权重硬约束: MoE 模型推理时,全部专家权重必须完整驻留显存(加载权重 = 总参数量),稀疏激活只降计算不降显存。

代码示例——

模型权重(Q4_K_M): 2GB | 系统开销: 1.5GB | KV Cache: 0.1 GB / 1K(FP16 默认;KV 量化可降)
4K 剩余 | 8K 剩余 | 16K 剩余 | 32K 剩余
6.8GB | 8.3GB | 7.5GB | 6.5GB

甜点档锚点:

  • Q8 量化(8GB 以上): 6.8GB 显存卡,系统默认 Q8_K_M 权重 ≈ 4GB,8K 剩余 6.8GB
  • Q4_K_M 量化(4GB 以上): 权重文件是 safetensors 格式,不是 GGUF 量化

如果 8GB 以上显卡装不下 Q8 权重,应改用 Q4 量化或明确说明使用了更高显存卡。

模型卡硬约束:参数量始终是 3.4B

DeepSeek-OCR-2 的量化参数,模型卡里写得很明确——

  • Q8 量化(主路径): 权重文件是 safetensors 格式,没有 gpu-memory-utilization 参数(那是 vLLM/SGLang 的)
  • Q4_K_M 是 GGUF 量化(甜点档): 2GB 权重,不是 safetensors 格式

vLLM 支持加载 GGUF 格式(官方文档确认): 权重文件是 safetensors 格式,主路径

如果 8GB 以上显卡装不下 Q8 权重,应改用 Q4 量化或明确说明使用了更高显存卡。

模型家族其他变体硬约束:

  • 甜点档锚点: DeepSeek-OCR-2 的 Q4_K_M 权重 ≈ 2.0GB,不是 deepseek-ai/DeepSeek-V4-Pro(1598.8B) 的 MoE 稀疏激活 token

如果甜点档装不下 Q8 权重,应改用 Q4 量化或明确说明使用了更高显存卡。


价值点落地:本章帮助读者理解 DeepSeek-OCR-2 在架构定位上的核心特性,读者可访问 arXiv 2601.20552 与官方 github 仓库,核对模型卡中的参数量 3.4B 描述。

下一步:读者可访问 github.com/deepseek-ai/DeepSeek-OCR-2 仓库,模型聚焦本地部署,选卡必须满足目标上下文对应的剩余 ≥ 0。


(章末自然过渡到下一章主题,但不写其他章节内容)

动态分辨率与视觉 token 生成机制

上一章把选卡的底线划清楚了:无论上下文档位怎么选,显存剩余必须 ≥ 0。不过「装得下」和「看得清」是两码事。模型能不能在复杂版面上看得清,取决于它的视觉 token 预算;而 DeepSeek-OCR-2 把这张预算写成了一行很值得玩味的公式:默认配置下生成 (0-6)×144 + 256 个视觉 token。

先举一个生活化的例子。固定分辨率模型相当于把每张图都强行压进同一张画布,处理完再放大;页面里五号字、表格细线的笔画结构,在压缩的一瞬间就变成了同一团灰色。动态分辨率则像图片浏览器的缩放手势:缩略图阶段先花极少的视觉资源看全局,手指放大到细节区,才逐步补充高密度的视觉信息。这恰恰是「视觉因果流(Visual Causal Flow)」架构想要的效果:视觉 token 不是一次性铺满整张图,而是由输入分辨率动态引导、逐档介入的。

那行公式可以拆成两部分来看。

「256」是保底预算——无论输入多简单,模型都会先留下这 256 个视觉 token 作为全局锚点,像给整张图片写一张「目录页」,保证后续语言模型知道「这张图存在,并且长这样」。括号里的「0-6」是动态档位:每一档携带 144 个增量 token,最低档不加任何增量,最高档加满 6 档、也就是 864 个 token。两段相加,视觉预算的最小区间是 256,最大是 1120。如果按整数档位展开,七个离散锚点分别是:

  • 0 档:256 个视觉 token
  • 1 档:400
  • 2 档:544
  • 3 档:688
  • 4 档:832
  • 5 档:976
  • 6 档:1120

一个小记忆窍门:144 恰好等于 12²,可以想象每一档就是在图片上多铺一层 12×12 的视觉块,六档封顶。公式掌握到手之后,随手就能复算:

def visual_budget(tier: int) -> int:
    # DeepSeek-OCR-2 默认视觉 token 公式:(0-6)×144 + 256
    base, step = 256, 144
    if not 0 <= tier <= 6:
        raise ValueError("官方档位上限为 6")
    return tier * step + base

for t in range(0, 7):
    print(f"tier={t} -> {visual_budget(t)} 视觉 token")
# 输出范围: 256 ~ 1120

公式本身不复杂,但在文档转 Markdown 场景里,视觉 token 规模直接决定识别上限。低档位(比如 256 或 400 个 token)只够模型看清版面的大致轮廓:一行标题、几段正文、有没有图片,能分出来;但表格里有几列、表头怎么跨栏、脚注缩进到哪个层级,这些细颗粒信息需要把视觉预算推到 5-6 档才有空间承载。所以如果你要转换的是多栏科技论文或带复杂表格的扫描件,期望模型在 0-1 档就能输出规整 Markdown 是不现实的——那不是模型偷懒,而是视觉带宽物理上不够。

落到本地部署上,视觉 token 不是免费的:它们走 Transformer 时同样要占 KV Cache 的空间。官方模型卡的锚点给你提供了一个简单估算:视觉 token 最多 1120 个,如果上下文窗口开得太小(例如 4K),后续的长 Markdown 输出就会挤压视觉 token 的生存空间。此时建议加大上下文档位,而不是缩减视觉预算。参照显存预算表,模型 Q4_K_M 的 4K 上下文总占用约 3.7GB,8K 约 4GB,16K 约 4.5GB——均为 8GB 以上显卡可以流畅运行的范围;例如 6.8GB 显存选择 16K 上下文还剩余约 3.5 GB,足以让动态分辨率机制放开手脚。

部署命令以 GGUF 主路径为例(Q4_K_M 量化约 2.0GB):

# llama.cpp 加载 DeepSeek-OCR-2(3.4B)Q4_K_M,8K 上下文
llama-server \
  -m /path/to/DeepSeek-OCR-2-Q4_K_M.gguf \
  -c 8192 \
  -ngl 99
# 注意:Q4_K_M 是 GGUF 量化,走 llama.cpp/Ollama/MLX;
# 若改用 vLLM/SGLang,请使用 safetensors 权重(vLLM 的 GGUF 支持有限,不做主路径)。

格式匹配的一点提醒:Q4_K_M 属于 GGUF 量化格式,与 bitsandbytes 的 NF4/FP4 不互通;vLLM 官方文档虽有 GGUF 加载能力的表述,但当前更稳妥的主路径仍是 safetensors。跨格式使用前,务必先完成权重转换。

本章最后给你一个可以直接落地的规格锚点:DeepSeek-OCR-2(3.4B)默认视觉 token = (0-6)×144 + 256,范围 256~1120。评估任何文档转 Markdown 任务时,先对照这个预算判断动态分辨率是否够用:版面越密集,视觉档位需求越高;上下文开得越小,视觉余量越紧。带着这把「视觉带宽」的尺子,下一章就把它放到真实推理环境里——看看部署参数、量化选型和端到端输出配合得怎么样。

模式对比:文档转 Markdown 与自由 OCR 范式

部署跑通的那一刻,真正的问题才浮出水面:同一个模型、同一份 Q4_K_M 权重、同一张显卡,面对一张图片,你到底要它”转成 Markdown”,还是”读出文字”?

这两个诉求,在 deepseek-ai/DeepSeek-OCR-2(3.4B)的官方资料里(arXiv 2601.20552、github.com/deepseek-ai/DeepSeek-OCR-2)被明确写成了两种模式——文档转 Markdown 与自由 OCR。表面看只是输出格式的不同,实际用起来,它们的分工、边界和产出物几乎是两套逻辑。

先用一个类比建立直觉。文档转 Markdown 像一个训练有素的誊写员:拿到一页论文,他会先辨认标题、小节、公式和表格的位置,再按 Markdown 的层级结构重新誊写一遍。他交出的产物保留了版面的秩序——# 是标题,| 是表格, 是代码块,结构与文字一起被完整搬运。自由 OCR 则更像一个经验老到的观察者:扫一眼路牌、价签、快递面单,把读到的文字连成信息流直接说出来。他不承诺还原排版,只承诺把该读的内容读对、读全。

一句话概括两种模式的本质差异:文档转 Markdown 回答的是”这张纸说了什么、内容是怎么排的”;自由 OCR 回答的是”这张图里有哪些字、连起来是什么意思”。

围绕这个本质,可以把能力差异拆成三个可感知的维度。

维度一:结构保真。 文档转 Markdown 的输出是被结构约束的。一个标题层级、一个表格分隔符、一组代码围栏,都是需要被还原的版面信息。它把”识别出文字”升级成”识别出文字的组织方式”。这种能力在批量处理论文、合同、发票、网页长截图时价值最大——因为这些产物的下游通常是 RAG 知识库、版本对比工具或文档管理系统,而结构本身就是检索和比对的骨架。

自由 OCR 的输出则是开放的。它不做结构承诺,因此也不承担结构错误的风险。拍歪的招牌、叠加了水印的公告、手写标注的示意图——这些图像没有规范的文档结构可以还原,强行转 Markdown 反而会制造出虚假的层级关系。自由模式直接吐语义文本,反而更可靠。

维度二:场景边界。 文档转 Markdown 的舒适区是”本意就是文档”的输入:扫描 PDF、网页打印稿、排版规整的论文首页。它假设图像背后存在一个可复现的版面秩序。自由 OCR 的舒适区则是”内容恰好以文字形式存在”的一切场景:街拍文字、产品包装、实验记录、票据角落的备注。它不假设任何秩序,所以对无序的容忍度更高。

两种模式对视觉 token 预算的取向也因此不同。文档转 Markdown 对视觉带宽的索取更贪婪——版面越密、层级越深,越需要把视觉档位往上提,去分辨标题与正文的边界、表格的行列归属;自由 OCR 在简单场景下可以贴着视觉 token 下限走,把上下文预算留给更长的输出文本。上一章那把”视觉带宽”的尺子,在这里恰好变成了判断模式负载的标尺:版面复杂度交给结构模式,场景自由度交给自由模式。

模式误用的代价,往往比模型能力不足更隐蔽:拿着一张拍糊的菜单选文档转 Markdown,你会得到一份结构精美但内容不可信的 Markdown;拿着一张双栏论文选自由 OCR,你会得到一段顺序混乱的文字墙。两种误用都不会报错,只会让错误优雅地藏在输出里。

维度三:下游衔接。 文档转 Markdown 的产物天然可以直接喂给 Markdown 解析器、嵌入模型和 RAG 管线,省去一层格式清洗;自由 OCR 的产物则需要下游自己决定怎么用——也许拼接成纯文本段落,也许抽取出关键字段。这不是说自由模式低人一等,而是说它的输出需要多一道语义结构化工序。反过来,当输入本身没有结构时,自由模式的输出反而省去了”解析一个错误结构”的浪费。

代码层面,两种模式的边界比想象中更薄。下面是一段概念示意,展示两种模式在调用上的关系——注意这不是官方 API 的逐字用法,完整调用方式以官方仓库 README 为准:

# 概念示意:同一份权重,两种输出方向
# 完整调用方式以官方仓库为准:
#   https://github.com/deepseek-ai/DeepSeek-OCR-2

# 格式匹配:
#   GGUF(Q4_K_M,约 2.0GB)→ llama.cpp / Ollama / MLX
#   safetensors → vLLM / SGLang(主路径)

ocr = DeepSeekOCR2("deepseek-ocr-2-Q4_K_M.gguf")

# 路径一:文档转 Markdown —— 结构优先
doc_md = ocr.convert("paper_page.png",
                     mode="document_to_markdown")

# 路径二:自由 OCR —— 内容优先
scene_text = ocr.read("street_sign.jpg",
                      mode="free_ocr")

两种模式的切换不需要额外的显存准备金——权重是同一份,显存占用的天花板由上下文长度决定,而非由模式决定。以 Q4_K_M 量化权重(约 2.0GB)为例:4K 上下文总占用约 3.7GB,8K 约 4GB;就算把上下文拉到 32K,总占用也只有 5.5GB。6.8GB 显存的机器跑 8K 上下文还剩 4 GB 余量,跑 32K 还剩 2.5 GB——显卡从来不是瓶颈,真正的瓶颈是你在图里想看多细。

那么,落到自己的项目里,怎么判断该用哪种模式?最直接的办法是跑一组对照实验:准备三类样本——一页双栏论文、一张网页长截图、一张街拍路牌——分别用两种模式各跑一遍。对论文,检查标题层级是否被正确还原、表格行列有没有守住;对长截图,看列表与段落边界是否干净,有没有把页脚广告也当成正文;对路牌,看自由文本输出是否完整,有没有为了迎合结构而改写原文。这组实验的成本只有几分钟,但信息密度很高:你会直观看到文档转 Markdown 在规整输入上如何锦上添花,在无序场景里又如何强行给文本加戏;也会看到自由 OCR 在无序场景里的干净利落,以及它在规整文档上丢掉的可贵结构。跑完这组对照,模式选择就不再依赖直觉,而是依赖你自己见过的输出。动手之前,先去 github.com/deepseek-ai/DeepSeek-OCR-2 官方仓库把模型卡和示例代码过一遍——两种模式的设计意图和调用方式,那里写得最清楚。

沿着这条线索往回看,从视觉 token 预算到部署参数,再到模式选择,DeepSeek-OCR-2(3.4B)给出的其实是一套统一的视觉推理框架:文档转 Markdown 与自由 OCR 不是两个模型,而是同一个 Visual Causal Flow 内核在输出端的两条分叉。前者把版面的秩序翻译成机器可读的结构,后者把开放场景的文字带回语义的河流。基于 Visual Causal Flow 的 DeepSeek-OCR-2 通过 Markdown 转换与自由 OCR 两条路径,将 OCR 能力从单纯识别扩展到结构化输出,为文档解析提供了可落地的开源方案。


皖ICP备2025105865号-2|皖公网安备34010402704739号