跳到内容

DeepSeek-OCR 使用指南

简介

DeepSeek-OCR 是一个前沿的 OCR 模型,为 LLM 探索光学上下文压缩。

安装 vLLM

uv venv
source .venv/bin/activate
uv pip install -U vllm --torch-backend auto

运行 DeepSeek-OCR

离线 OCR 任务

在本指南中,我们将演示如何为离线 OCR 批量处理任务设置 DeepSeek-OCR。

from vllm import LLM, SamplingParams
from vllm.model_executor.models.deepseek_ocr import NGramPerReqLogitsProcessor
from PIL import Image

# Create model instance
llm = LLM(
    model="deepseek-ai/DeepSeek-OCR",
    enable_prefix_caching=False,
    mm_processor_cache_gb=0,
    logits_processors=[NGramPerReqLogitsProcessor]
)

# Prepare batched input with your image file
image_1 = Image.open("path/to/your/image_1.png").convert("RGB")
image_2 = Image.open("path/to/your/image_2.png").convert("RGB")
prompt = "<image>\nFree OCR."

model_input = [
    {
        "prompt": prompt,
        "multi_modal_data": {"image": image_1}
    },
    {
        "prompt": prompt,
        "multi_modal_data": {"image": image_2}
    }
]

sampling_param = SamplingParams(
            temperature=0.0,
            max_tokens=8192,
            # ngram logit processor args
            extra_args=dict(
                ngram_size=30,
                window_size=90,
                whitelist_token_ids={128821, 128822},  # whitelist: <td>, </td>
            ),
            skip_special_tokens=False,
        )
# Generate output
model_outputs = llm.generate(model_input, sampling_param)

# Print output
for output in model_outputs:
    print(output.outputs[0].text)

在线 OCR 服务

在本指南中,我们将演示如何通过与 OpenAI 兼容的 API 服务器设置 DeepSeek-OCR 以实现在线 OCR 服务。

vllm serve deepseek-ai/DeepSeek-OCR --logits_processors vllm.model_executor.models.deepseek_ocr:NGramPerReqLogitsProcessor --no-enable-prefix-caching --mm-processor-cache-gb 0
import time
from openai import OpenAI

client = OpenAI(
    api_key="EMPTY",
    base_url="https://:8000/v1",
    timeout=3600
)

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://ofasys-multimodal-wlcb-3-toshanghai.oss-accelerate.aliyuncs.com/wpf272043/keepme/image/receipt.png"
                }
            },
            {
                "type": "text",
                "text": "Free OCR."
            }
        ]
    }
]

start = time.time()
response = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-OCR",
    messages=messages,
    max_tokens=2048,
    temperature=0.0,
    extra_body={
        "skip_special_tokens": False,
        # args used to control custom logits processor
        "vllm_xargs": {
            "ngram_size": 30,
            "window_size": 90,
            # whitelist: <td>, </td>
            "whitelist_token_ids": [128821, 128822],
        },
    },
)
print(f"Response costs: {time.time() - start:.2f}s")
print(f"Generated text: {response.choices[0].message.content}")

配置技巧

  • 务必使用自定义 logits processor 与模型一起使用,以获得最佳的 OCR 和 markdown 生成性能。
  • 与多轮聊天用例不同,我们不期望 OCR 任务能从前缀缓存或图像重用中显著受益,因此建议关闭这些功能以避免不必要的哈希和缓存。
  • DeepSeek-OCR 在使用普通提示时比指令格式效果更好。在官方 DeepSeek-OCR 仓库中查找 用于各种 OCR 任务的更多示例提示
  • 根据您的硬件能力,调整 max_num_batched_tokens 以获得更好的吞吐量性能。
  • 有关多模态输入的批量推理的更多信息,请查看 vLLM 文档