使用Docker Compose部署DeepSeek-OCR 2开发测试环境
使用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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐
所有评论(0)