PP-OCRv6_medium_rec_onnx生产环境部署:Docker容器化与Kubernetes编排实践
【免费下载链接】PP-OCRv6_medium_rec_onnx项目地址: https://ai.gitcode.com/paddlepaddle/PP-OCRv6_medium_rec_onnx
PP-OCRv6_medium_rec_onnx是飞桨PaddlePaddle推出的高性能OCR文本识别模型,基于ONNX格式实现跨平台部署。本文将详细介绍如何通过Docker容器化技术和Kubernetes编排方案,在生产环境中快速部署这一强大的文本识别工具,实现高可用、可扩展的OCR服务架构。
为什么选择容器化部署OCR服务?
在企业级应用中,OCR服务需要面对高并发、多场景的文本识别需求。传统部署方式存在环境依赖复杂、资源利用率低、扩展能力弱等问题。采用Docker容器化+Kubernetes编排方案,可带来以下核心优势:
- 环境一致性:消除"开发环境能运行,生产环境跑不起来"的问题
- 资源隔离:为OCR模型分配独立计算资源,避免与其他服务相互干扰
- 弹性伸缩:根据识别请求量自动调整服务实例数量
- 滚动更新:实现模型版本的平滑升级,无感知切换
准备工作:环境与资源要求
在开始部署前,请确保您的环境满足以下要求:
硬件最低配置
- CPU:4核8线程
- 内存:8GB RAM
- 硬盘:20GB可用空间
- GPU(可选):NVIDIA GPU with CUDA 11.0+(推荐用于高并发场景)
软件环境
- Docker Engine 20.10+
- Kubernetes集群 1.21+
- kubectl命令行工具
- Git
获取项目代码
git clone https://gitcode.com/paddlepaddle/PP-OCRv6_medium_rec_onnx cd PP-OCRv6_medium_rec_onnx项目核心文件说明:
- inference.onnx:ONNX格式的预训练模型文件
- inference.yml:模型配置文件
- README.md:项目说明文档
第一步:构建Docker镜像
创建Dockerfile
在项目根目录下创建Dockerfile,内容如下:
# 基础镜像选择Python 3.8 FROM python:3.8-slim # 设置工作目录 WORKDIR /app # 复制项目文件 COPY . /app # 安装系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ libglib2.0-0 \ libsm6 \ libxext6 \ libxrender-dev \ && rm -rf /var/lib/apt/lists/* # 安装Python依赖 RUN pip install --no-cache-dir \ paddleocr \ onnxruntime-gpu \ fastapi \ uvicorn \ python-multipart # 暴露服务端口 EXPOSE 8000 # 启动命令 CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]创建OCR服务API
创建app.py文件,实现基于FastAPI的OCR服务接口:
from fastapi import FastAPI, File, UploadFile from paddleocr import TextRecognition import io from PIL import Image app = FastAPI(title="PP-OCRv6_medium_rec_onnx Service") # 加载模型 model = TextRecognition( model_name="PP-OCRv6_medium_rec", engine="onnxruntime", model_path="./inference.onnx", params_path="./inference.yml" ) @app.post("/recognize") async def recognize_text(file: UploadFile = File(...)): # 读取图片 contents = await file.read() image = Image.open(io.BytesIO(contents)) # 模型预测 result = model.predict(input=image, batch_size=1) # 处理结果 return {"text": result[0].rec_text, "score": float(result[0].rec_score)} @app.get("/health") async def health_check(): return {"status": "healthy"}构建镜像
执行以下命令构建Docker镜像:
docker build -t pp-ocrv6-medium-rec-onnx:latest .第二步:本地测试Docker容器
在部署到Kubernetes之前,先进行本地容器测试,确保服务正常运行:
# 运行容器 docker run -d -p 8000:8000 --name ocr-service pp-ocrv6-medium-rec-onnx:latest # 检查容器状态 docker ps | grep ocr-service # 测试健康检查接口 curl http://localhost:8000/health如果一切正常,将返回{"status":"healthy"}。
第三步:Kubernetes部署配置
创建命名空间
为OCR服务创建独立的Kubernetes命名空间:
# ocr-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: ocr-service应用配置:
kubectl apply -f ocr-namespace.yaml创建Deployment
创建ocr-deployment.yaml文件:
apiVersion: apps/v1 kind: Deployment metadata: name: pp-ocrv6-deployment namespace: ocr-service spec: replicas: 3 selector: matchLabels: app: pp-ocrv6 template: metadata: labels: app: pp-ocrv6 spec: containers: - name: pp-ocrv6-container image: pp-ocrv6-medium-rec-onnx:latest ports: - containerPort: 8000 resources: requests: cpu: "1" memory: "2Gi" limits: cpu: "2" memory: "4Gi" livenessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 5 periodSeconds: 5创建Service
创建ocr-service.yaml文件:
apiVersion: v1 kind: Service metadata: name: pp-ocrv6-service namespace: ocr-service spec: selector: app: pp-ocrv6 ports: - port: 80 targetPort: 8000 type: ClusterIP创建HPA(自动扩缩容)
创建ocr-hpa.yaml文件,实现基于CPU利用率的自动扩缩容:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: pp-ocrv6-hpa namespace: ocr-service spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: pp-ocrv6-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80第四步:部署到Kubernetes集群
应用所有Kubernetes配置文件:
# 部署Deployment kubectl apply -f ocr-deployment.yaml # 部署Service kubectl apply -f ocr-service.yaml # 部署HPA kubectl apply -f ocr-hpa.yaml检查部署状态:
# 查看Pod状态 kubectl get pods -n ocr-service # 查看Service状态 kubectl get svc -n ocr-service # 查看HPA状态 kubectl get hpa -n ocr-service第五步:服务访问与负载均衡
内部访问
在Kubernetes集群内部,其他服务可以通过以下地址访问OCR服务:
http://pp-ocrv6-service.ocr-service.svc.cluster.local/recognize外部访问
如需从集群外部访问,可配置Ingress或NodePort。以下是NodePort方式的配置修改:
# 修改ocr-service.yaml中的type spec: type: NodePort ports: - port: 80 targetPort: 8000 nodePort: 30080应用修改后,可通过集群节点IP:30080访问服务。
性能优化建议
模型优化
- 使用ONNX Runtime的优化选项,如启用图优化和内存优化
- 根据实际需求调整模型输入尺寸,平衡速度与精度
容器资源配置
- 对于GPU环境,使用
nvidia-device-plugin配置GPU资源 - 根据测试结果调整CPU和内存的requests与limits
缓存策略
- 对频繁识别的相同图片实施结果缓存
- 使用Redis等缓存服务存储识别结果
监控与维护
日志收集
配置日志收集,建议使用ELK Stack或Prometheus+Grafana组合:
# 在Deployment中添加日志配置 containers: - name: pp-ocrv6-container # ...其他配置 volumeMounts: - name: log-volume mountPath: /app/logs volumes: - name: log-volume emptyDir: {}性能监控
通过Prometheus监控OCR服务性能指标,如:
- 识别请求吞吐量
- 平均识别耗时
- 错误率
- 资源利用率
总结
通过Docker容器化和Kubernetes编排,我们成功实现了PP-OCRv6_medium_rec_onnx模型的生产环境部署。这种方案不仅解决了环境依赖问题,还提供了弹性伸缩、高可用和易维护的特性,非常适合企业级OCR服务的需求。
在实际应用中,建议根据业务场景进一步优化配置,如添加TLS加密、实现灰度发布、配置更精细的资源调度策略等,以确保OCR服务的稳定性和高效性。
附录:常用命令参考
# 查看Pod日志 kubectl logs -f <pod-name> -n ocr-service # 进入容器内部 kubectl exec -it <pod-name> -n ocr-service -- /bin/bash # 手动扩缩容 kubectl scale deployment pp-ocrv6-deployment --replicas=5 -n ocr-service # 更新镜像 kubectl set image deployment/pp-ocrv6-deployment pp-ocrv6-container=pp-ocrv6-medium-rec-onnx:v2 -n ocr-service【免费下载链接】PP-OCRv6_medium_rec_onnx项目地址: https://ai.gitcode.com/paddlepaddle/PP-OCRv6_medium_rec_onnx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考