使用Docker Compose部署DeepSeek-OCR 2开发测试环境

1. 引言

如果你正在开发一个需要OCR(光学字符识别)功能的应用,DeepSeek-OCR 2是个不错的选择。这个模型不仅能识别文字,还能理解文档结构,把复杂的版面转换成清晰的Markdown格式。

但部署OCR环境通常很麻烦:需要安装各种依赖、配置GPU驱动、设置数据库...这就是为什么我们要用Docker Compose。它能帮你一键启动所有需要的服务,让开发环境搭建变得简单快捷。

在这篇教程里,我会带你一步步用Docker Compose搭建完整的DeepSeek-OCR 2开发环境,包含OCR服务、数据库、缓存等组件。跟着做,你就能拥有一个随时可用的OCR开发环境。

2. 环境准备

在开始之前,确保你的系统已经安装了Docker和Docker Compose。如果你还没安装,可以去Docker官网下载对应版本的Docker Desktop,它自带了Docker Compose。

检查一下你的GPU是否支持CUDA,因为DeepSeek-OCR 2需要GPU加速。运行nvidia-smi命令,如果能看到GPU信息,说明驱动已经装好了。

3. 项目结构设计

我们先来规划一下整个开发环境需要哪些服务:

  • OCR服务:运行DeepSeek-OCR 2模型的核心服务
  • Redis:用作缓存,提升重复请求的处理速度
  • PostgreSQL:存储识别结果和用户数据
  • Nginx:反向代理,处理请求路由

创建一个项目目录,然后建立这样的文件结构:

deepseek-ocr2-dev/
├── docker-compose.yml
├── ocr-service/
│   ├── Dockerfile
│   ├── requirements.txt
│   └── app/
├── nginx/
│   └── nginx.conf
└── .env

4. 编写Docker Compose配置

现在我们来编写核心的docker-compose.yml文件:

version: '3.8'

services:
  # OCR服务
  ocr-service:
    build: ./ocr-service
    container_name: deepseek-ocr2
    ports:
      - "8000:8000"
    environment:
      - REDIS_HOST=redis
      - POSTGRES_HOST=postgres
      - MODEL_PATH=/app/models/deepseek-ocr2
    volumes:
      - ./ocr-service/app:/app
      - models-volume:/app/models
    depends_on:
      - redis
      - postgres
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

  # Redis缓存
  redis:
    image: redis:7-alpine
    container_name: ocr-redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data

  # PostgreSQL数据库
  postgres:
    image: postgres:13-alpine
    container_name: ocr-postgres
    environment:
      POSTGRES_DB: ocr_db
      POSTGRES_USER: ocr_user
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

  # Nginx反向代理
  nginx:
    image: nginx:alpine
    container_name: ocr-nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - ocr-service

volumes:
  models-volume:
  redis-data:
  postgres-data:

这个配置定义了四个服务,每个都有特定的用途。OCR服务需要GPU支持,所以我们在配置里加了GPU相关的设置。

5. 构建OCR服务

接下来创建OCR服务的Dockerfile:

# ocr-service/Dockerfile
FROM nvidia/cuda:11.8.0-runtime-ubuntu22.04

# 设置工作目录
WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    python3.10 \
    python3-pip \
    libgl1 \
    libglib2.0-0 \
    && rm -rf /var/lib/apt/lists/*

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY app/ .

# 下载模型(实际使用时可以从HuggingFace下载)
RUN python -c "
from transformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained('deepseek-ai/DeepSeek-OCR-2', trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained('deepseek-ai/DeepSeek-OCR-2', trust_remote_code=True)
"

# 启动服务
CMD ["python", "app.py"]

然后创建依赖文件requirements.txt

torch==2.6.0
transformers==4.46.3
tokenizers==0.20.3
fastapi==0.104.1
uvicorn==0.24.0
redis==4.6.0
asyncpg==0.28.0
python-multipart==0.0.6
flash-attn==2.7.3

6. 创建OCR应用

现在编写主要的应用代码app/app.py

from fastapi import FastAPI, File, UploadFile
from fastapi.middleware.cors import CORSMiddleware
import torch
from transformers import AutoModel, AutoTokenizer
import redis
import asyncpg
import os
import uuid
from datetime import datetime

app = FastAPI(title="DeepSeek-OCR2 API")

# 允许跨域请求
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

# 初始化模型
model = None
tokenizer = None

@app.on_event("startup")
async def startup():
    global model, tokenizer
    # 加载模型
    model_name = 'deepseek-ai/DeepSeek-OCR-2'
    tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
    model = AutoModel.from_pretrained(
        model_name, 
        _attn_implementation='flash_attention_2', 
        trust_remote_code=True, 
        use_safetensors=True
    )
    model = model.eval().cuda().to(torch.bfloat16)

# OCR处理端点
@app.post("/ocr")
async def process_image(
    file: UploadFile = File(...),
    prompt: str = "<image>\n<|grounding|>Convert the document to markdown."
):
    # 保存上传的文件
    file_path = f"/tmp/{uuid.uuid4()}_{file.filename}"
    with open(file_path, "wb") as f:
        f.write(await file.read())
    
    # 使用模型进行推理
    result = model.infer(
        tokenizer,
        prompt=prompt,
        image_file=file_path,
        output_path=None,
        base_size=1024,
        image_size=768,
        crop_mode=True,
        save_results=False
    )
    
    # 清理临时文件
    os.remove(file_path)
    
    return {
        "success": True,
        "result": result,
        "processed_at": datetime.now().isoformat()
    }

@app.get("/health")
async def health_check():
    return {"status": "healthy", "model_loaded": model is not None}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

7. 配置Nginx

创建Nginx配置文件nginx/nginx.conf

events {
    worker_connections 1024;
}

http {
    upstream ocr_backend {
        server ocr-service:8000;
    }

    server {
        listen 80;
        
        location / {
            proxy_pass http://ocr_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # 静态文件服务(如果需要)
        location /static/ {
            alias /app/static/;
        }
    }
}

8. 环境变量配置

创建.env文件来管理敏感信息:

# 数据库配置
POSTGRES_PASSWORD=your_secure_password_here
POSTGRES_USER=ocr_user
POSTGRES_DB=ocr_db

# Redis配置
REDIS_PASSWORD=

# 应用配置
MODEL_PATH=/app/models/deepseek-ocr2

记得把your_secure_password_here换成真正的强密码。

9. 启动和测试

现在一切就绪,可以启动整个环境了:

# 进入项目目录
cd deepseek-ocr2-dev

# 启动所有服务
docker-compose up -d

# 查看日志确认服务正常
docker-compose logs -f

等待所有服务启动完成后,测试一下OCR服务是否正常工作:

# 测试健康检查
curl http://localhost:8000/health

# 测试OCR功能(需要准备一个测试图片)
curl -X POST -F "file=@test.jpg" http://localhost:8000/ocr

如果一切正常,你会看到OCR服务返回识别结果。

10. 开发技巧和建议

在实际开发中,这里有一些实用建议:

性能优化

  • 调整Docker资源限制,给OCR服务分配更多GPU内存
  • 使用Redis缓存频繁处理的图片结果
  • 实现批处理功能,同时处理多个图片

开发调试

  • 使用docker-compose logs ocr-service查看特定服务的日志
  • 在开发阶段可以挂载代码卷实现热重载:
    volumes:
      - ./ocr-service/app:/app:ro
    

扩展功能

  • 添加用户认证和API密钥管理
  • 实现任务队列处理大量OCR请求
  • 添加结果导出功能(PDF、Word等格式)

11. 总结

用Docker Compose部署DeepSeek-OCR 2开发环境确实能省去很多麻烦。你不再需要手动安装各种依赖,也不用担心环境配置问题。整个开发环境都是容器化的,可以在任何支持Docker的机器上运行。

这个配置已经包含了OCR服务、数据库、缓存和反向代理,基本上满足了一个完整OCR应用的需求。你可以基于这个基础继续开发,添加更多业务功能。

在实际使用中,你可能需要根据具体需求调整配置,比如增加服务副本数来提升处理能力,或者调整GPU资源分配。但无论如何,这个Docker Compose配置为你提供了一个很好的起点。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐