LayoutLM 是微软 UniLM 团队做的文档理解预训练模型,核心思路很朴素:在 BERT 的一维位置编码之外,再给每个 token 加一组二维坐标嵌入(bbox),让模型知道「这个字在页面的哪个位置」。到了 LayoutLMv3,微软扔掉了 LayoutLMv2 那套 detectron2 CNN 视觉骨干,改成 ViT 式的 16×16 patch embedding,并用统一的 MLM + MIM + WPA(词-块对齐)三目标做预训练——这一改让部署难度断崖式下降,也是今天大家实际在用的那一版。
需要先说清楚一件事:LayoutLMv3 发布于 2022 年 4 月,之后微软 UniLM 仓库的 Document AI 线再没有出过 LayoutLMv4。想找「最新版 LayoutLM」的人会失望,但这不代表它过时了——microsoft/layoutlmv3-base 在 Hugging Face 上月下载量仍是百万级,Transformers 5.x 里 LayoutLM、LayoutLMv2、LayoutLMv3、LayoutXLM 四个模型全都还在维护,Optimum 的 ONNX 导出支持列表里也明确列着 LayoutLM 和 LayoutLM-v3。原因很现实:一个 133M 的编码器做 token 分类,输出是确定的标签而不是生成的文本,不会幻觉出一个不存在的税号,延迟以毫秒计,单卡能同时扛几十路并发。DeepSeek-OCR、PaddleOCR-VL 这类生成式文档 VLM 擅长开放式解析,但要在固定 schema 上稳定抽 20 个字段、还要审计每个字段的来源坐标,LayoutLMv3 至今仍是成本最低的答案。
这一页把自己部署 LayoutLM 会真正撞上的东西讲透:各个版本到底多大、真实显存占用是多少、bbox 为什么必须归一化到 0–1000(不归一化会直接 CUDA device-side assert)、CC BY-NC-SA 4.0 这条许可红线怎么绕、512 token 装不下一页 A4 怎么办,以及每种配置在 NexGPU 上该租哪张卡、一次微调到底花几美元。
01 —
LayoutLM 家族版本对照
四代模型架构差别很大,选错一代,坑也完全不同
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| microsoft/layoutlmv3-base | 133M(12 层 / 768 隐藏维 / 12 头) | fp32 权重 ~0.53GB;推理峰值 ~2GB;AMP 全参微调 batch 8 约 8–12GB | 512 文本 token + 196 图像 patch | 今天的默认选择。FUNSD 90.29 F1、CORD 96.56 F1、RVL-CDIP 95.44%。不依赖 detectron2,pip 装完就能跑,也是 Optimum 唯一支持 ONNX 导出的 v3 分支。 |
| microsoft/layoutlmv3-large | 368M(24 层 / 1024 隐藏维 / 16 头) | fp32 权重 ~1.5GB;推理峰值 ~4GB;全参微调建议留 16–24GB | 512 文本 token + 196 图像 patch | 冲指标用。FUNSD 92.08 F1、CORD 97.46 F1、DocVQA 83.37 ANLS。相对 base 提升 1–2 个点,但训练时间和显存翻倍,生产上多数团队还是回到 base。 |
| microsoft/layoutlmv3-base-chinese | 133M,中文预训练分支 | 与 base 同级:推理 ~2GB,微调 8–12GB | 512 文本 token + 196 图像 patch | 中文票据、表单、合同就用这个。XFUND 中文 92.02 F1,EPHOIE 平均 99.21%。注意它的下载量只有英文 base 的千分之几,社区示例少,得自己写数据管线。 |
| microsoft/layoutlmv2-base-uncased / microsoft/layoutxlm-base | base 规模:12 层 / 768 隐藏维 / 12 头 | 比 v3 高 30–50%,因为多挂一个 ResNeXt-FPN 视觉骨干 | 512 文本 token | 只在复现旧论文或需要 LayoutXLM 那 53 种语言时用。最大的坑是必须装 detectron2,在新 CUDA / PyTorch 上编译经常失败;图像还是 BGR 通道;Optimum 的 ONNX 列表里没有 v2。 |
| microsoft/layoutlm-base-uncased / layoutlm-large-uncased | 113M / 343M | 无视觉分支,最轻:推理 <1.5GB,微调 4–6GB | 512 文本 token | 初代,纯文本 + bbox,没有图像模态。指标不如 v3,但它是全家族唯一 MIT 许可的一代——如果项目要商用又不能改许可,这一行就是你要找的答案。 |
02 —
该租哪张卡
LayoutLM 是编码器不是生成模型,显存需求由 batch size 和图像预处理决定,不是由参数量
LayoutLMv3-base 全参微调(FUNSD / CORD / 自有票据数据集)
RTX 3090 24GB$0.193/卡·时
AMP 下峰值 8–12GB,24GB 显存足够把 batch 开到 16 以上;Ampere 支持 bf16 与 TF32,而且比 Tesla T4 更便宜、快好几倍——这是整张价目表里跑 LayoutLM 性价比最高的一张。
LayoutLMv3-large 全参微调,或想把 batch 拉大加速收敛
Tesla V100 32GB$0.188/卡·时
368M 的编码器配 32GB 显存绰绰有余,fp16 tensor core 对这种规模完全够用,是本表里每 GB 显存单价最低的训练卡。
生产环境批量抽取(ONNX / fp16 常驻服务)
Tesla T4 16GB$0.298/卡·时
推理峰值不到 4GB,16GB 能同时装下 LayoutLMv3 抽取模型和上游 OCR;T4 有 INT8 tensor core,低功耗适合 7×24 挂着跑抽取队列。
OCR → LayoutLMv3 → 版面检测整条流水线同机跑,或跑 PubLayNet Cascade R-CNN 版面分析
RTX 4090 24GB$0.540/卡·时
版面检测那一半要走 detectron2,显存和算力都吃得多;4090 单卡把 PaddleOCR、LayoutLMv3、检测头三段全塞下,省去跨机传图。
03 —
四步跑通 LayoutLMv3 私有化部署
从空机器到导出一个可上线的 ONNX 抽取模型
- 01
开机器、装依赖
在 NexGPU 控制台选一张 RTX 3090 24GB,直接用预置的 PyTorch 镜像开实例,SSH 或 Jupyter 进去。LayoutLMv3 不需要 detectron2,依赖非常干净;只有当你打算用 processor 自带的 Tesseract 时才要装系统包。
pip install transformers datasets seqeval pytesseract pillow && apt-get update && apt-get install -y tesseract-ocr - 02
跑 OCR,把 bbox 归一化到 0–1000
这是 LayoutLM 最大的坑,没有之一。模型的 max_2d_position_embeddings 是 1024,processor 要求每个框都是 [x0, y0, x1, y1] 且落在 0–1000 的整数区间。直接把 A4 200DPI 扫描件的像素坐标(动辄 1654×2339)喂进去,会得到 IndexError: index out of range in self,或者在 GPU 上变成一句毫无线索的 device-side assert。中文场景建议用 PaddleOCR 出词框,然后设 apply_ocr=False 自己传 words 和 boxes——processor 内置的 Tesseract 对中文基本不可用。
bbox = [int(1000 * x0 / W), int(1000 * y0 / H), int(1000 * x1 / W), int(1000 * y1 / H)] - 03
微调 token 分类头
信息抽取任务用 LayoutLMv3ForTokenClassification,num_labels 设成你的 BIO 标签数。tokenizer 默认 only_label_first_subword=True,也就是一个词被切成多个 subword 时只有第一个带标签,其余填 -100;标签对齐写错是第二常见的 bug。文档超过 512 token 时用 return_overflowing_tokens 加 stride 做滑窗,把一页拆成多段推理再合并。
processor = AutoProcessor.from_pretrained("microsoft/layoutlmv3-base-chinese", apply_ocr=False) - 04
导出 ONNX,换成推理卡上线
训练完不要留着 PyTorch checkpoint 直接上生产。Optimum 官方支持 LayoutLM 和 LayoutLM-v3 的 ONNX 导出,再做一次 INT8 动态量化,模型体积能压到一百多 MB,CPU 上都能跑得动,GPU 上延迟进入个位数毫秒。导完把训练实例停掉——NexGPU 按秒计量,实例一停计算费立刻归零。
optimum-cli export onnx --model ./layoutlmv3-invoice --task token-classification ./onnx/
一次中文票据抽取微调,到底花多少钱
假设你有 2,000 页标注好的中文发票,batch size 8、训练 20 轮:2000 × 20 ÷ 8 = 5,000 步。LayoutLMv3-base 只有 133M 参数、总序列长度 708(512 文本 + 196 patch),在 RTX 3090 上开 AMP,这 5,000 步是半小时量级的活儿。把整个流程算进去:OCR 预处理与标签对齐 1 小时,6 组学习率/warmup 网格搜索每组约 25 分钟共 2.5 小时,最终评估与导出 1 小时——机器总共开 4.5 小时。 计算费:4.5 小时 × $0.193/卡·时 = $0.87。 出网费:导出的 INT8 ONNX 约 0.13GB,0.13 × $0.0081/GB ≈ $0.001。 存储费:数据集加 checkpoint 约 8GB,按 $0.414/GB·月 计是 $3.31/月——但导完 ONNX 就销毁卷,这一项直接归零。 也就是说,从零训出一套自己的发票字段抽取模型,GPU 账单不到一美元。换成 LayoutLMv3-large 走 Tesla V100 32GB($0.188/卡·时),训练时间大约翻倍到 9 小时,也才 $1.69。没有最低消费、没有开通费、没有配额申请,跑完停机就不再计费。
04 —
