# deepseek-ai/deepseek-ocr-2 architecture

> Architecture diagram of the GitHub repository deepseek-ai/deepseek-ocr-2, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/deepseek-ai/deepseek-ocr-2
- Repository: https://github.com/deepseek-ai/deepseek-ocr-2

## Overview

DeepSeek-OCR 2 turns images or PDF pages into OCR/document text, including Markdown with grounding/layout output. The main vLLM workflow is configured by config.py, prepares image inputs, submits them to the registered model for generation, and writes results; PDF and batch evaluation are separate entry points. The repository also documents a Transformers inference route. Model internals and runner relationships are supported by the supplied excerpts and SOURCE INDEX; unsampled behavior is not inferred beyond those references.

Main entry points: [`DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py`](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py) (Image inference), [`DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py`](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py) (PDF inference), [`DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepseek_ocr2.py`](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepseek_ocr2.py) (vLLM OCR model), [`DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py`](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py) (Batch evaluation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_inputs["Input preparation"]
  node_imageproc["Image processor<br/>[image_process.py]"]
end

subgraph group_inference["Model inference"]
  node_model["vLLM OCR model<br/>[deepseek_ocr2.py]"]
  node_vision["Vision encoder<br/>[sam_vary_sdpa.py]"]
  node_visualdecoder["Visual decoder<br/>[qwen2_d2e.py]"]
  node_projector["Feature projector<br/>[build_linear.py]"]
  node_ngram["Repeat suppression<br/>[ngram_norepeat.py]"]
end

subgraph group_runners["Inference workflows"]
  node_config["Runtime settings<br/>[config.py]"]
  node_imageflow["Image inference"]
  node_pdfflow["PDF inference"]
  node_batchflow["Batch evaluation"]
end

subgraph group_transformers["Transformers route"]
  node_hfscript["Transformers example<br/>[run_dpsk_ocr2.py]"]
end

node_user(("User"))
node_images["Images"]
node_pdf["PDF document"]
node_textout["OCR results"]
node_hfmodel["Hugging Face model"]

node_user -->|"runs"| node_imageflow
node_user -->|"runs"| node_pdfflow
node_user -->|"runs"| node_batchflow
node_user -->|"runs"| node_hfscript
node_images -->|"supplies images"| node_imageflow
node_pdf -->|"supplies document"| node_pdfflow
node_imageflow -->|"reads settings"| node_config
node_pdfflow -->|"reads settings"| node_config
node_batchflow -->|"reads settings"| node_config
node_imageflow -->|"prepares images"| node_imageproc
node_pdfflow -->|"prepares page images"| node_imageproc
node_batchflow -->|"prepares images"| node_imageproc
node_imageflow -->|"generates with"| node_model
node_pdfflow -->|"generates with"| node_model
node_batchflow -->|"generates with"| node_model
node_imageflow -->|"uses suppression"| node_ngram
node_pdfflow -->|"uses suppression"| node_ngram
node_batchflow -->|"uses suppression"| node_ngram
node_model -->|"processes multimodal input"| node_imageproc
node_model -->|"uses encoder"| node_vision
node_model -->|"uses decoder"| node_visualdecoder
node_model -->|"projects features"| node_projector
node_imageflow -->|"writes OCR output"| node_textout
node_pdfflow -->|"writes document output"| node_textout
node_batchflow -->|"writes evaluation output"| node_textout
node_hfscript -->|"loads and infers"| node_hfmodel
node_hfscript -->|"saves results"| node_textout

click node_config "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/config.py"
click node_imageproc "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/process/image_process.py"
click node_model "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepseek_ocr2.py"
click node_vision "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepencoderv2/sam_vary_sdpa.py"
click node_visualdecoder "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepencoderv2/qwen2_d2e.py"
click node_projector "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepencoderv2/build_linear.py"
click node_ngram "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/process/ngram_norepeat.py"
click node_imageflow "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py"
click node_pdfflow "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py"
click node_batchflow "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py"
click node_hfscript "https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-hf/run_dpsk_ocr2.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_imageproc,node_user toneBlue
class node_model,node_vision,node_visualdecoder,node_projector,node_ngram toneAmber
class node_config,node_imageflow,node_pdfflow,node_batchflow toneMint
class node_hfscript toneRose
class node_images,node_pdf,node_textout,node_hfmodel toneIndigo
```

## Components

### Input preparation

- [Image processor](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/process/image_process.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/process/image_process.py`

### Model inference

- [vLLM OCR model](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepseek_ocr2.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepseek_ocr2.py`
- [Vision encoder](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepencoderv2/sam_vary_sdpa.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepencoderv2/sam_vary_sdpa.py`
- [Visual decoder](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepencoderv2/qwen2_d2e.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepencoderv2/qwen2_d2e.py`
- [Feature projector](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepencoderv2/build_linear.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepencoderv2/build_linear.py`
- [Repeat suppression](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/process/ngram_norepeat.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/process/ngram_norepeat.py`

### Inference workflows

- [Runtime settings](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/config.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/config.py`
- [Image inference](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py`
- [PDF inference](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py`
- [Batch evaluation](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py`

### Transformers route

- [Transformers example](https://github.com/deepseek-ai/deepseek-ocr-2/blob/main/DeepSeek-OCR2-master/DeepSeek-OCR2-hf/run_dpsk_ocr2.py): `DeepSeek-OCR2-master/DeepSeek-OCR2-hf/run_dpsk_ocr2.py`

### Other components

- **User**
- **Images**
- **PDF document**
- **OCR results**
- **Hugging Face model**

## Connections

- User → Image inference: runs (evidence: `README.md`)
- User → PDF inference: runs (evidence: `README.md`)
- User → Batch evaluation: runs (evidence: `README.md`)
- User → Transformers example: runs (evidence: `README.md`)
- Images → Image inference: supplies images (evidence: `README.md`)
- PDF document → PDF inference: supplies document (evidence: `README.md`)
- Image inference → Runtime settings: reads settings (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py`)
- PDF inference → Runtime settings: reads settings (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py`)
- Batch evaluation → Runtime settings: reads settings (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py`)
- Image inference → Image processor: prepares images (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py`)
- PDF inference → Image processor: prepares page images (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py`)
- Batch evaluation → Image processor: prepares images (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py`)
- Image inference → vLLM OCR model: generates with (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py`)
- PDF inference → vLLM OCR model: generates with (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py`)
- Batch evaluation → vLLM OCR model: generates with (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py`)
- Image inference → Repeat suppression: uses suppression (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py`)
- PDF inference → Repeat suppression: uses suppression (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py`)
- Batch evaluation → Repeat suppression: uses suppression (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py`)
- vLLM OCR model → Image processor: processes multimodal input (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepseek_ocr2.py`)
- vLLM OCR model → Vision encoder: uses encoder (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepseek_ocr2.py`)
- vLLM OCR model → Visual decoder: uses decoder (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepseek_ocr2.py`)
- vLLM OCR model → Feature projector: projects features (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/deepseek_ocr2.py`)
- Image inference → OCR results: writes OCR output (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_image.py`)
- PDF inference → OCR results: writes document output (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_pdf.py`)
- Batch evaluation → OCR results: writes evaluation output (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-vllm/run_dpsk_ocr2_eval_batch.py`)
- Transformers example → Hugging Face model: loads and infers (evidence: `DeepSeek-OCR2-master/DeepSeek-OCR2-hf/run_dpsk_ocr2.py`)
- Transformers example → OCR results: saves results (evidence: `README.md`)
