DeepSeek-OCR-2 OpenAI 兼容 API 服务器

DeepSeek-OCR-2 的生产环境 Docker 部署,提供 OpenAI 兼容的 API。

文件结构

.
├── backend          # 后端服务
├── frontend         # 前端页面
├── docker-compose.yaml       # docker compose 配置
├── Dockerfile       # 生产环境 Docker 镜像
└── README-zh-CN.md        # 本文件

为什么需要 openai_server.py

DeepSeek-OCR-2 自带原生 vLLM 模型实现 (deepseek_ocr2.py),但 不能直接使用 vLLM 自带的 OpenAI 服务器,原因在于图像预处理:

  1. vLLM 的 OpenAI 服务器 会将原始 PIL 图像传给模型处理器
  2. DeepSeek 的处理器 需要图像先经过 tokenize_with_images() 方法处理 —— 该方法会进行动态分辨率裁剪、切片和特征提取

如果直接使用 vllm serve,会报错,例如:

TypeError: cannot unpack non-iterable Image object
TypeError: 'Image' object is not subscriptable

我们的 openai_server.py 解决方法是:

  • 从 OpenAI 格式请求中提取 base64 图像
  • 使用 DeepSeek 的 tokenize_with_images() 方法进行预处理(与官方脚本 run_dpsk_ocr2_image.py 一致)
  • 将处理后的特征传入 vLLM 的 AsyncLLMEngine
  • 返回 OpenAI 兼容响应,并支持流式输出

这种方式使用与 DeepSeek 官方脚本完全相同的预处理流程,保证结果正确。

环境要求

  • 安装 Docker 并配置 NVIDIA Container Toolkit
  • NVIDIA GPU,CUDA 版本 11.8+
  • 显存 ≥ 8GB(模型约占用 6.3GB)

快速开始

构建镜像

docker build -t deepseek-ocr2 .

运行容器

docker run --gpus all -p 8000:8000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  deepseek-ocr2

API 使用

列出模型

curl http://localhost:8000/v1/models

带布局识别的 OCR

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-OCR-2",
    "messages": [{
      "role": "user",
      "content": [
        {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,'$(base64 -w0 image.jpg)'"}} ,
        {"type": "text", "text": "<|grounding|>Convert the document to markdown."}
      ]
    }],
    "max_tokens": 8192
  }'

仅文本 OCR(不保留布局)

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-OCR-2",
    "messages": [{
      "role": "user",
      "content": [
        {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,'$(base64 -w0 image.jpg)'"}} ,
        {"type": "text", "text": "Free OCR."}
      ]
    }],
    "max_tokens": 8192
  }'

远程图片识别的 OCR

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-OCR-2",
    "messages": [{
      "role": "user",
      "content": [
        {"type": "image_url", "image_url": {"url": "http://127.0.0.1/image_url.png"}} ,
        {"type": "text", "text": "<|grounding|>Convert the document to markdown."}
      ]
    }],
    "max_tokens": 8192
  }'

流式输出

在请求体中添加 "stream": true 即可启用流式响应。

环境变量

变量 默认值 描述
GPU_MEMORY_UTILIZATION 0.90 使用的 GPU 显存比例
MAX_MODEL_LEN 8192 最大序列长度(输入 + 输出)
TENSOR_PARALLEL_SIZE 1 张量并行的 GPU 数量

Token 限制

  • 总上下文窗口:8192 tokens(输入 + 输出总和)
  • 视觉 tokens:每张图像最多 1120 tokens ((0-6)×144 + 256)
  • 默认 max_tokens:8192(受输入上下文限制)
  • 实际输出限制:典型图像约 7000 tokens

Prompt 示例

Prompt 描述
`< grounding >Convert the document to markdown.` OCR + 布局检测(包含边界框)
Free OCR. 仅提取纯文本,不保留布局

健康检查

curl http://localhost:8000/health

注意事项

  • 第一次请求会较慢,因为模型需要加载(约 30-40 秒)
  • 模型权重缓存于 ~/.cache/huggingface
  • 支持 base64 编码的 JPEG / PNG 图像
  • 表格内容会返回 Markdown 格式 + HTML 表格

Dockerfile

# DeepSeek-OCR-2 OpenAI-compatible API Server
# Build: docker build -t deepseek-ocr2 .
# Run: docker run --gpus all -p 8000:8000 -v ~/.cache/huggingface:/root/.cache/huggingface deepseek-ocr2

FROM nvidia/cuda:11.8.0-devel-ubuntu22.04

ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONUNBUFFERED=1
ENV VLLM_USE_V1=0

# Install system dependencies (Ubuntu 22.04 has Python 3.10)
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    python3-dev \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/* \
    && ln -sf /usr/bin/python3 /usr/bin/python

WORKDIR /app

# Clone the repository
RUN git clone https://github.com/deepseek-ai/DeepSeek-OCR-2.git /app

# Download vLLM wheel (cp38-abi3 works with Python 3.8+)
RUN curl -LO https://github.com/vllm-project/vllm/releases/download/v0.8.5/vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl

COPY vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl /app/

# Install PyTorch first
RUN pip install --no-cache-dir torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 \
    --index-url https://download.pytorch.org/whl/cu118

# Install vLLM
RUN pip install --no-cache-dir vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl \
    && rm vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl

# Install requirements
RUN pip install --no-cache-dir -r requirements.txt

# Install flash-attention (requires ninja for faster build)
RUN pip install --no-cache-dir ninja \
    && pip install --no-cache-dir flash-attn==2.7.3 --no-build-isolation

# Install additional dependencies for the server
RUN pip install --no-cache-dir fastapi uvicorn

# Set working directory to vLLM scripts
WORKDIR /app/DeepSeek-OCR2-master/DeepSeek-OCR2-vllm

# Copy the OpenAI server script
COPY openai_server.py .

EXPOSE 8000

# Health check
HEALTHCHECK --interval=30s --timeout=30s --start-period=120s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

# Override NVIDIA entrypoint
ENTRYPOINT []
CMD ["python", "openai_server.py"]

docker-compose.yaml

version: "3.9"

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    #image: deepseek-ocr2:latest
    container_name: deepseek-ocr2
    runtime: nvidia
    ipc: host
    privileged: true
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
      - /root/.cache/huggingface:/root/.cache/huggingface
    environment:
      - CUDA_VISIBLE_DEVICES=0
      - TZ=Asia/Shanghai
      - HF_HOME=/root/.cache/huggingface
      - HF_HUB_OFFLINE=1
      - TRANSFORMERS_OFFLINE=1
    restart: unless-stopped

DeepSeek-OCR2-WebUI

一个纯前端、仅限浏览器的文档处理工具,利用 DeepSeek-OCR2 将扫描图像和多页 PDF 转换为 Markdown, DOCX, PDF等多种可编辑格式。

🚀 概览

DeepSeek-OCR2-WebUI 旨在完全在浏览器内处理文档转换任务。通过利用 Web Workers 和 IndexedDB 等现代 Web 技术,它提供了一个功能强大、注重隐私的替代方案,取代了服务器端文档处理。

  • 仅限前端:无需后端服务(除了调用 DeepSeek-OCR2 API)。
  • 隐私至上:文档处理过程中绝不会离开您的浏览器。
  • 支持大文档:通过虚拟列表和高效的内存管理,针对数百页文档进行了优化。
  • 状态持久化:利用 IndexedDB,任务进度和中间结果在页面刷新后依然存在。

🛠️ 技术栈

  • 框架: Vue 3 (Composition API)
  • 语言: TypeScript
  • UI 库: Naive UI
  • 状态管理: Pinia
  • 数据库: Dexie.js (IndexedDB)
  • PDF 核心: pdfjs-dist (渲染) & pdf-lib (生成)
  • 转换器: markdown-it (Markdown) & docx (Word)
  • 构建工具: Vite
  • 测试: Vitest & Playwright

地址:https://github.com/westhack/deepseek-ocr2-webui