百度开源 Unlimited-OCR一次前向解析长文档,支持 Transformers、vLLM 与 SGLang 部署

发布时间:2026/7/1 9:59:56

百度开源 Unlimited-OCR一次前向解析长文档,支持 Transformers、vLLM 与 SGLang 部署 前言最近 OCR 方向又火了起来尤其是端到端 OCR、多模态大模型解析 PDF、图片文档、表格和长文档的能力已经不只是“识别几个字”这么简单了。传统 OCR 通常要经历图片预处理 → 版面分析 → 文本检测 → 文本识别 → 表格还原 → Markdown / JSON 后处理而新一代文档解析模型更倾向于直接把图片、PDF 页面输入模型然后输出结构化文本、Markdown 或可编辑内容。百度开源的Unlimited-OCR就是这类模型中的一个代表。它的定位不是普通单页 OCR而是面向长文档、长上下文、一次性解析、多页 PDF的文档解析模型。一、Unlimited-OCR 是什么Unlimited-OCR 是百度开源的一个文档解析模型项目标题是Unlimited OCR Works官方描述是面向One-shot Long-horizon Parsing也就是“一次性长文档解析”。它的核心目标可以理解为让 OCR 不再只能一页一页、分块分段地识别而是尽可能在一次前向推理中解析更长的文档内容。传统长文本 OCR 输出越长 → KV Cache 越大 → 显存越高 → 速度越慢 Unlimited-OCR 通过 R-SWA 控制注意力范围 → 降低长序列推理成本 → 更适合长文档解析二、传统 OCR 与 Unlimited-OCR 有什么不同传统 OCR 更像一条固定流水线检测文字区域 → 识别文字 → 排版恢复 → 后处理它的优点是成熟、稳定、速度快但面对复杂版面时经常会遇到表格结构丢失段落顺序错乱多栏文本识别混乱图片、公式、标题层级难以还原长 PDF 需要拆页、拆块处理Unlimited-OCR 更像是“文档理解模型”图片 / PDF 页面 → 视觉编码器 → 多模态语言模型解码 → Markdown / 文本结果它不仅识别文字还尝试理解版面结构并输出更接近可阅读、可编辑的结果。三、技术工作流从整体流程看Unlimited-OCR 的处理链路可以理解为图片 / PDF 页面 ↓ PDF 页面转图片 ↓ 视觉编码器提取图像与版面特征 ↓ R-SWA 控制长上下文注意力 ↓ 语言模型生成 Markdown / 文本 ↓ 结果保存、入库、检索或进入 RAG其中比较关键的是R-SWA。它的目标是降低长文档解析时的注意力计算压力让模型在长序列输出时更稳定。四、模型基本信息项目内容模型名称baidu/Unlimited-OCR任务类型Image-Text-to-Text框架Transformers权重格式Safetensors许可证MIT模型规模约 3B 参数上下文长度32768典型输出文本 / Markdown主要能力图片 OCR、多页解析、PDF 解析、长文档解析推理方式Transformers、vLLM、SGLang、Docker五、环境准备1. 推荐环境建议使用 Linux NVIDIA GPU 环境操作系统Ubuntu 22.04 / 24.04 Python3.12 GPUNVIDIA 显卡 CUDA按本机驱动选择 显存建议 8GB 以上起步生产环境越大越好2. 创建虚拟环境mkdirunlimited-ocr-democdunlimited-ocr-demo python3-mvenv .venvsource.venv/bin/activate pipinstall-Upip setuptools wheel如果你使用的是 Windows也建议通过 WSL2 Ubuntu 来跑尤其是涉及 GPU、CUDA、vLLM 时Linux 环境会少很多坑。六、安装依赖先安装基础依赖pipinstalltransformers accelerate safetensors pillow pymupdf requests然后根据自己的 CUDA 版本安装 PyTorch。示例pipinstalltorch torchvision --index-url https://download.pytorch.org/whl/cu121如果你是 CUDA 12.4、12.6 或 12.9需要根据 PyTorch 官方提供的 wheel 版本来选择。七、使用 Transformers 进行单图 OCRimportosimporttorchfromtransformersimportAutoModel,AutoTokenizer MODEL_NAMEbaidu/Unlimited-OCROUTPUT_DIR./ocr_outputsos.makedirs(OUTPUT_DIR,exist_okTrue)tokenizerAutoTokenizer.from_pretrained(MODEL_NAME,trust_remote_codeTrue)modelAutoModel.from_pretrained(MODEL_NAME,trust_remote_codeTrue,use_safetensorsTrue,torch_dtypetorch.bfloat16)modelmodel.eval().cuda()image_pathyour_image.jpgmodel.infer(tokenizer,promptimagedocument parsing.,image_fileimage_path,output_pathOUTPUT_DIR,base_size1024,image_size640,crop_modeTrue,max_length32768,no_repeat_ngram_size35,ngram_window128,save_resultsTrue,)print(OCR 完成结果已保存到,OUTPUT_DIR)这里有几个关键点参数说明trust_remote_codeTrue允许加载模型仓库中的自定义代码promptimagedocument parsing.提示词必须带imagebase_size1024图像基础尺寸image_size640单图模式下的图像尺寸crop_modeTrue开启裁剪模式max_length32768最大生成长度no_repeat_ngram_size35减少重复生成ngram_window128单图推荐窗口八、PDF 解析先转图片再多页识别很多实际业务不是识别单张图片而是识别 PDF比如合同 PDF招投标文件扫描报告论文产品手册发票合集舆情材料汇编Unlimited-OCR 的常见做法是PDF → 每页转成 PNG 图片 → 多页图片一起输入模型 → 输出 Markdown / 文本下面是完整示例importosimporttempfileimportfitzimporttorchfromtransformersimportAutoModel,AutoTokenizer MODEL_NAMEbaidu/Unlimited-OCRPDF_PATHyour_doc.pdfOUTPUT_DIR./pdf_ocr_outputsos.makedirs(OUTPUT_DIR,exist_okTrue)defpdf_to_images(pdf_path:str,dpi:int300): 将 PDF 每一页转成 PNG 图片 :param pdf_path: PDF 文件路径 :param dpi: 渲染清晰度300 比较适合 OCR :return: 图片路径列表 docfitz.open(pdf_path)tmp_dirtempfile.mkdtemp(prefixpdf_ocr_)matrixfitz.Matrix(dpi/72,dpi/72)image_paths[]forpage_index,pageinenumerate(doc):image_pathos.path.join(tmp_dir,fpage_{page_index1:04d}.png)pixpage.get_pixmap(matrixmatrix)pix.save(image_path)image_paths.append(image_path)doc.close()returnimage_paths tokenizerAutoTokenizer.from_pretrained(MODEL_NAME,trust_remote_codeTrue)modelAutoModel.from_pretrained(MODEL_NAME,trust_remote_codeTrue,use_safetensorsTrue,torch_dtypetorch.bfloat16)modelmodel.eval().cuda()image_filespdf_to_images(PDF_PATH,dpi300)model.infer_multi(tokenizer,promptimageMulti page parsing.,image_filesimage_files,output_pathOUTPUT_DIR,image_size1024,max_length32768,no_repeat_ngram_size35,ngram_window1024,save_resultsTrue,)print(PDF OCR 完成输出目录,OUTPUT_DIR)九、vLLM 部署方式如果只是本地测试Transformers 方式已经够用。但如果你想把 Unlimited-OCR 做成一个服务比如前端上传 PDF → 后端调用 OCR 服务 → 返回 Markdown → 存入数据库 / 知识库那就需要 vLLM 或 SGLang 这类推理服务框架。1. 拉取 vLLM 镜像默认 CUDA 13.0 镜像dockerpull vllm/vllm-openai:unlimited-ocrHopper GPU / CUDA 12.9 镜像dockerpull vllm/vllm-openai:unlimited-ocr-cu1292. 启动 vLLM 服务dockerrun--rm\--gpusall\--networkhost\--ipchost\vllm/vllm-openai:unlimited-ocr\baidu/Unlimited-OCR\--trust-remote-code\--logits_processorsvllm.model_executor.models.unlimited_ocr:NGramPerReqLogitsProcessor\--no-enable-prefix-caching\--mm-processor-cache-gb03. Python 客户端调用fromopenaiimportOpenAI clientOpenAI(api_keyEMPTY,base_urlhttp://localhost:8000/v1,timeout3600)messages[{role:user,content:[{type:text,text:imagedocument parsing.},{type:image_url,image_url:{url:file:///data/test.jpg}}]}]responseclient.chat.completions.create(modelbaidu/Unlimited-OCR,messagesmessages,max_tokens8192,temperature0.0,extra_body{skip_special_tokens:False,vllm_xargs:{ngram_size:35,window_size:128}})print(response.choices[0].message.content)十、SGLang 部署方式除了 vLLM也可以使用 SGLang 部署 Unlimited-OCR。python-msglang.launch_server\--modelbaidu/Unlimited-OCR\--served-model-name Unlimited-OCR\--attention-backend fa3\--page-size1\--mem-fraction-static0.8\--context-length32768\--enable-custom-logit-processor\--disable-overlap-schedule\--skip-server-warmup\--host0.0.0.0\--port10000SGLang 更适合你想做高性能推理、自定义调度、自定义服务端参数的场景vLLM 更适合想快速做 OpenAI API 兼容服务的场景。十一、生产系统架构建议如果要把 Unlimited-OCR 接入企业系统可以参考下面的架构上传文件 → 对象存储 → OCR 任务队列 → 推理服务 → 结果入库 → 检索 / RAG / 人工校验这种设计的好处是OCR 服务和业务系统解耦文件可以异步处理失败任务可以重试结果可以全文检索后续可以接入 RAG、知识库、智能问答十二、参数速查表场景推荐方式关键参数单张图片model.inferimage_size640、crop_modeTrue、ngram_window128多页图片model.infer_multiimage_size1024、ngram_window1024PDF 文件PDF → PNG → infer_multidpi200~300、max_length32768服务部署vLLM / SGLangOpenAI API、自定义 logits processor十三、常见问题1. 为什么必须加trust_remote_codeTrue因为 Unlimited-OCR 使用了自定义模型结构不是 Transformers 内置的普通模型类。加载时需要允许执行模型仓库里的自定义 Python 代码。注意这也意味着你应该只对可信来源使用trust_remote_codeTrue。2. 为什么输出为空常见原因有几个问题解决办法prompt 没有image必须使用imagedocument parsing.没有设置skip_special_tokensFalsevLLM 调用时需要设置没有传 ngram 参数设置ngram_size35多页 PDF 仍用单图窗口多页建议window_size1024图片路径错误检查文件是否存在显存不足降低页数、降低 DPI、换更大显卡3. PDF 识别很慢怎么办可以从几个方向优化1. 降低 PDF 转图片 DPI 2. 控制单次输入页数 3. 使用 vLLM / SGLang 服务化 4. 做任务队列异步处理 5. 多 GPU 并发处理不同文件 6. 结果落库避免重复 OCR如果是生产系统不建议用户上传后直接阻塞等待可以采用上传文件 → 生成任务 ID → 后台 OCR 队列 → 推理服务 → 结果入库 → 前端轮询 / WebSocket 通知十四、适合落地的业务方向Unlimited-OCR 不只是一个 Demo 模型实际可以尝试落地到很多系统中。1. 企业文档解析合同、报告、扫描件、内部制度、项目文档解析成 Markdown 后可以进入知识库。2. 招投标文档解析标书 PDF → OCR → 章节结构 → 关键字段抽取 → 风险提示适合政企项目、采购系统。3. 舆情材料入库截图 / PDF / 网页打印件 → OCR → 结构化文本 → Elasticsearch 检索适合舆情系统、网信系统、内容审核系统。4. RAG 知识库构建PDF → Markdown → 分块 → Embedding → 向量库 → 智能问答这是目前大模型应用中非常常见的一条链路。十五、总结Unlimited-OCR 的价值不只是“识别文字”而是把 OCR 往长文档解析、Markdown 生成、结构化理解、知识库构建方向推进了一步。它比较适合多页 PDF 解析扫描文档识别文档转 Markdown企业知识库建设OCR RAG 应用文档智能处理平台如果你正在做文档解析、知识库、智能办公、PDF 结构化、合同识别或 OCR 服务化Unlimited-OCR 非常值得测试。

相关新闻