先把定位说清楚:DocFormer 不是 OCR 引擎。它吃的是 OCR 的输出——词级文本 token 加上每个词的 bounding box,再叠加页面像素,做的是表单键值抽取、收据字段提取、文档分类、DocVQA 这类下游理解任务。论文作者是 Srikar Appalaraju、Bhavan Jasani、Bhargava Urala Kota、Yusheng Xie、R. Manmatha(arXiv:2106.11539)。架构上它有两处和同期 LayoutLM 系列明显不同:视觉分支用的是一个朴素的 ResNet50 而非 Faster R-CNN 之类的目标检测网络,以及空间注意力权重在视觉和语言两条流之间共享,预训练靠 MM-MLM、LTR(Learn To Reconstruct)、TDI(Text Describes Image)三个自监督任务在 IIT-CDIP 的 500 万页文档上完成。
然后是所有想本地部署 DocFormer 的人都会撞上的那堵墙:没有官方权重。在 Hugging Face Hub 上搜 docformer,返回的是空列表;transformers 库里也没有 DocFormer 这个模型类。DocFormerv2(AAAI 2024,arXiv:2306.01733)同样只有论文和 Amazon Science 的页面,没有 repo,没有 checkpoint。今天能跑起来的只有一份 MIT 许可的社区复现 github.com/shabie/docformer(维护者 uakarsh 与 shabie,约 290 star、42 fork、280 次提交),作者自己用 IDL 数据集的一个子集做了 MLM 预训练并把权重放在了 Kaggle 上——注意那不是论文那套 MM-MLM + LTR + TDI 三任务权重,指标对不上是正常的。
所以这页只讲两件真事:一,如果你就是要复现 DocFormer——微调要多少显存、从零预训练一个 epoch 花多少钱,我们把论文里给出的 17 小时/epoch on A100 40GB 直接换算成账单;二,如果你的实际目标是把文档解析这件事在自己机器上跑起来,2026 年更该看的是 DeepSeek-OCR、dots.ocr 这类文档 VLM。两条路都要 GPU,NexGPU 从 $0.188/卡·时的 Tesla V100 32GB 到 141GB 的 H200 都能按秒计费开出来。
01 —
DocFormer 各变体与显存口径
参数量、层数、指标全部来自原论文;显存按 AdamW 混合精度 16 bytes/参数 的训练态估算,不含激活。
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| DocFormer-base(ICCV 2021) | 183M | fp16 权重 ~0.37GB / 训练态 ~2.9GB + 激活,16GB 卡够用 | 512 text token | 12 层、hidden 768、12 头,视觉分支为朴素 ResNet50。论文成绩:FUNSD 83.34 F1、CORD 96.33 F1、RVL-CDIP 96.17%、Kleister-NDA 85.8 F1。绝大多数复现工作用的都是这一档。 |
| DocFormer-large | 536M | fp16 权重 ~1.1GB / 训练态 ~8.6GB + 激活,24GB 起步、48GB 从容 | 512 text token | 24 层、hidden 1024、16 头。FUNSD 84.55 F1、CORD 96.99 F1。有个反直觉的真实结果:它在 RVL-CDIP 文档分类上 95.50%,反而输给 base 的 96.17%——上 large 之前先确认你的任务真的吃得下这个容量。 |
| DocFormerv2-small(AAAI 2024) | 66M | 训练态 ~1.1GB + 激活,任意 16GB 卡随便跑 | 编码器-解码器,128 image token | v2 最大的改动是把重型视觉编码器整个砍掉:不用 Swin、不用 ViT,只保留一层 linear(conv 2×2),随机初始化。small 档是做消融和小规模验证的性价比选择。 |
| DocFormerv2-base | 232M | 训练态 ~3.7GB + 激活,16–24GB 卡舒适 | 编码器-解码器 | 自回归生成式,直接吐答案而不是做序列标注,因此 DocVQA、InfoVQA、TabFact 这类任务不需要额外接 head。预训练任务改成编码器上的 Token-to-Line 与 Token-to-Grid,加解码器上的去噪 MLM。 |
| DocFormerv2-large | 750M | fp16 权重 ~1.5GB / 训练态 ~12GB + 激活,24–32GB 起,48GB 更稳 | 编码器-解码器 | 论文的 SOTA 档:DocVQA 87.84 ANLS、FUNSD 88.89 F1、CORD 97.70 F1、TabFact 83.2、InfoVQA 48.8、OCR-VQA 71.5、TextVQA 64.0、ST-VQA 71.8。论文强调它在场景文字 VQA 上压过体量大得多的 GIT2、PaLI、Flamingo。 |
| 社区实现 shabie/docformer | 对齐 base 的 183M | 同 base,单卡 16GB 可跑通前向与微调 | max_position_embeddings 512 | MIT 许可,是今天唯一能真正跑起来的 DocFormer 代码。默认 config 里 coordinate_size 96、shape_size 96、max_2d_position_embeddings 1000、max_relative_positions 8、image_feature_pool_shape [7,7,256],编码器输出 (1, 512, 768)。Kaggle 上的权重只做过 IDL 子集的 MLM,不等于论文权重。 |
02 —
按你要干的事选卡
DocFormer 这个体量的模型,瓶颈从来不是权重大小,而是 OCR 预处理吞吐和你打算跑多少组实验。
复现 FUNSD / CORD 微调,DocFormer-base 183M
Tesla V100 32GB$0.188/卡·时
论文的下游微调本来就是在 V100 16GB 上做的,32GB 版本让你把 batch 和 OCR 缓存都开大,而它恰好是我们整个货架上最便宜的一张卡。
DocFormer-large 536M 或 DocFormerv2-large 750M 全参数微调
RTX A6000 48GB$0.817/卡·时
750M 的 AdamW 训练态约 12GB,加上 512 token 注意力和图像分支的激活,48GB 能让你不必为了塞下去而反复调 batch size 和梯度累积。
照论文从零预训练:MM-MLM + LTR + TDI,IIT-CDIP 量级语料
A100 PCIE 80GB$0.824/卡·时
论文明确给了 A100 40GB 上 17 小时/epoch 这个数,80GB 版本能直接放大 batch;单节点最多 14 卡、节点显存上限 2,152GB,数据并行不用跨机。
放弃复现,直接上文档 VLM:DeepSeek-OCR 3B 或 dots.ocr
RTX 4090 24GB$0.540/卡·时
3B 的 bf16 权重约 6GB,剩下十几 GB 全给 vLLM 的 KV cache 和高分辨率图像 token,是这一档模型最划算的常驻推理卡。
03 —
在 NexGPU 上把 DocFormer 跑起来
四步,从空实例到一次成功的前向;第四步是分叉口,看你走复现还是走生产。
- 01
开实例并装好 OCR 链路
从 2,000+ 预置镜像里挑 PyTorch 镜像开机,SSH 或 Jupyter 进去。重点:DocFormer 自己不做 OCR,它要的是词级文本加 bounding box,所以 tesseract 是硬依赖,不是可选项。社区实现的 dataset.create_features 直接调 pytesseract。
sudo apt update && sudo apt install -y tesseract-ocr && pip install pytesseract transformers torch - 02
拉社区实现(官方代码从未公开)
不用去 Hugging Face 上找 model id,搜 docformer 是空结果。唯一可用的是 MIT 许可的 shabie/docformer。它没有打成 pip 包,用法是 clone 之后把 src 目录塞进 sys.path。Kaggle 上有维护者用 IDL 子集做 MLM 预训练的权重和一份 FUNSD 微调 notebook,可以当起点。
git clone https://github.com/shabie/docformer.git - 03
跑通一次前向,确认拿到 (1, 512, 768)
用 BertTokenizerFast 加载 bert-base-uncased 的分词器,把一页文档图像喂进 create_features,再经 ExtractFeatures 和 DocFormerEncoder。输出形状对上 (1, 512, 768) 就说明视觉、文本、空间三路特征都接好了。这一步在 V100 上几秒钟就能验完,别拿 A100 做冒烟测试。
v_bar, t_bar, v_bar_s, t_bar_s = feature_extractor(encoding); output = docformer(v_bar, t_bar, v_bar_s, t_bar_s) # -> (1, 512, 768) - 04
分叉:继续复现,还是切到文档 VLM
要论文级指标,就得自己补上 MM-MLM + LTR + TDI 的预训练,换 A100 多卡按下面的账单跑。要的是今天就能解析发票、合同、表格的能力,那就直接在同一台机器上换镜像起 vLLM——DeepSeek-OCR 和 dots.ocr 都是 MIT 许可、都支持 vLLM,单张 4090 就能常驻服务。实例停了计费就停,切换成本几乎为零。
vllm serve deepseek-ai/DeepSeek-OCR --trust-remote-code --gpu-memory-utilization 0.85
把论文里的 17 小时/epoch 换算成账单
复现 FUNSD 微调:FUNSD 只有 149 页训练样本,DocFormer-base 183M 在 Tesla V100 32GB 上跑完整轮次约 1.5 小时,$0.188 × 1.5 = $0.28。这是本页所有数字里最便宜的一个,比你为它开会讨论的时间成本低得多。一轮 large 级别的完整微调实验:RTX A6000 48GB,$0.817 × 12 小时 = $9.80。真正的大头是从零预训练:论文给的是 A100 40GB 上 17 小时/epoch,用 A100 PCIE 80GB 单卡算,17 × $0.824 = $14.01/epoch;换 8 卡数据并行,理想线性加速下 17 ÷ 8 ≈ 2.13 小时,8 × $0.824 × 2.13 ≈ $14.04/epoch——注意钱几乎没变,变的是墙钟时间从 17 小时压到两小时出头。跑 10 个 epoch 约 $140,8 卡约 21 小时收工。存储另算:IIT-CDIP 量级的图像加 OCR 缓存按 500GB 估,$0.414 × 500 = $207/月,摊到每天约 $6.9,跑完记得销毁卷——计算停了不计费,存储会一直算到你删掉为止。如果你走的是文档 VLM 那条路,RTX 4090 24GB 连开一整天是 $0.540 × 24 = $12.96,比预训练一个 epoch 还便宜。
04 —
