DeepSeek-OCR-2 vLLM部署指南:用AsyncLLMEngine构建流式输出OCR推理服务
【免费下载链接】DeepSeek-OCR-2Visual Causal Flow项目地址: https://gitcode.com/gh_mirrors/de/DeepSeek-OCR-2
DeepSeek-OCR-2 是 DeepSeek 推出的新一代视觉因果流(Visual Causal Flow)OCR 大模型,支持将文档图片高保真地转换为 Markdown。本文带你用 vLLM 部署 DeepSeek-OCR-2,通过AsyncLLMEngine实现逐 token 流式输出,并掌握图片流式推理与 PDF 高并发批处理两种服务模式,快速搭建你的 OCR 推理服务。
项目亮点:为什么选择 DeepSeek-OCR-2
DeepSeek-OCR-2 的视觉编码器DeepEncoder V2采用"LM as Vision Encoder"设计——用 Qwen2 语言模型代替传统 CLIP 作为视觉编码器,并引入因果可读顺序(new reading order),让模型像人眼一样按阅读顺序"扫描"文档。
对比 v1 架构可以看到,v2 在 non-causal 的 Tokenizer 之后新增了 causal 的 LM 视觉编码层,这正是文档理解能力跃升的关键。
环境准备:一键安装步骤
官方推荐环境为CUDA 11.8 + PyTorch 2.6.0 + vLLM 0.8.5:
# 1. 克隆仓库 git clone https://gitcode.com/gh_mirrors/de/DeepSeek-OCR-2 cd DeepSeek-OCR-2/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm # 2. 创建 Python 环境 conda create -n deepseek-ocr2 python=3.12.9 -y conda activate deepseek-ocr2 # 3. 安装依赖(torch cu118 + vllm 0.8.5 whl + flash-attn) pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu118 pip install vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl # 需提前下载该 whl pip install -r ../../requirements.txt pip install flash-attn==2.7.3 --no-build-isolation⚠️ 安装时若提示vllm 0.8.5+cu118 requires transformers>=4.51.1的版本冲突,可忽略——vLLM 与 Transformers 双端运行不受影响。
核心原理:AsyncLLMEngine 如何实现流式输出
流式推理的核心在 run_dpsk_ocr2_image.py 的stream_generate函数,关键只有三步:
- 注册模型:将自定义的多模态模型 DeepseekOCR2ForCausalLM 注册到 vLLM 的
ModelRegistry; - 构建异步引擎:
AsyncLLMEngine.from_engine_args(AsyncEngineArgs(...)),设置max_model_len=8192、gpu_memory_utilization=0.75; - 异步迭代增量文本:
async for request_output in engine.generate(request, sampling_params, request_id): full_text = request_output.outputs[0].text new_text = full_text[printed_length:] # 只打印新增部分 print(new_text, end='', flush=True) printed_length = len(full_text)async for每轮拿到的是累计全文,用printed_length切出增量即可实现打字机效果——这是构建 SSE 流式 OCR API 的标准做法。
此外还挂载了NoRepeatNGramLogitsProcessor(见 process/ngram_norepeat.py),通过 n-gram 去重防止长表格输出陷入重复循环,并对<td>、</td>加白名单保护 HTML 结构不被误杀。
场景一:图片流式 OCR(推荐入门)
python run_dpsk_ocr2_image.py运行流程:
- 读取
INPUT_PATH图片 →DeepseekOCR2Processor动态分块编码(见 process/image_process.py); - AsyncLLMEngine 逐 token 流式输出 Markdown;
- 自动后处理:解析
<|ref|>定位框 → 在图上绘制彩色边界框、裁出内嵌图片,最终产出 3 样文件:result.mmd:干净版 Markdown(含图片引用)result_with_boxes.jpg:带布局框标注的可视化图images/:从文档中裁剪出的子图
动态分辨率默认 (0~6)×768×768 + 1×1024×1024 分块,最大仅 256+144 个视觉 token,显存占用非常友好。
场景二:PDF 高并发批处理
python run_dpsk_ocr2_pdf.pyPDF 场景改用同步LLM接口 +max_num_seqs=MAX_CONCURRENCY(默认 100 并发),配合 64 个预处理的线程池,整体速度与 DeepSeek-OCR 持平。流程为:PDF 逐页 144 DPI 渲染 → 批量推理 → 合并输出带分页标记的.mmd,并用img2pdf回排出布局标注 PDF。
关键参数调优清单
所有参数集中在 config.py,上手必改 3 处:
| 参数 | 说明 | 建议 |
|---|---|---|
MODEL_PATH | 模型路径 | 填本地权重目录或deepseek-ai/DeepSeek-OCR-2 |
INPUT_PATH/OUTPUT_PATH | 输入输出目录 | 按你的数据改 |
MAX_CONCURRENCY | 并发数 | 显存不足时调低(如 32) |
PROMPT | 推理提示词 | 见下方两种模式 |
NUM_WORKERS | 图像预处理线程 | CPU 核多可上调 |
两种官方提示词:
- 文档转 Markdown(带布局):
<image>\n<|grounding|>Convert the document to markdown. - 纯文字 OCR(无布局):
<image>\nFree OCR.
批量评测基准(如 OmniDocBench v1.5)则使用 run_dpsk_ocr2_eval_batch.py。
常见问题速查
- 显存不够 OOM?调低
gpu_memory_utilization与MAX_CONCURRENCY,或换 24G 以上显存的 GPU; - 输出表格无限重复?确认已启用
NoRepeatNGramLogitsProcessor,PDF 场景可关闭SKIP_REPEAT观察; - 图片方向错乱?推理脚本内置 EXIF 转正(
ImageOps.exif_transpose),无需手动处理; - 想用 HuggingFace 直接推理?见 DeepSeek-OCR2-hf/run_dpsk_ocr2.py,基于
flash_attention_2,适合快速验证而非高吞吐服务。
总结
DeepSeek-OCR-2 的 vLLM 部署路径非常清晰:AsyncLLMEngine负责单图流式输出、LLM批量接口负责 PDF 高并发,二者共享同一套模型注册与动态分辨率编码逻辑。按照本指南 30 分钟内即可跑通首个流式 OCR 请求,并在此基础上轻松封装为 HTTP/SSE 推理服务。
【免费下载链接】DeepSeek-OCR-2Visual Causal Flow项目地址: https://gitcode.com/gh_mirrors/de/DeepSeek-OCR-2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考