写点什么

Serverless 架构下 PaddleOCR 项目开发与部署

作者:刘宇
  • 2021 年 12 月 15 日
  • 本文字数:1828 字

    阅读完需:约 6 分钟

Serverless架构下PaddleOCR项目开发与部署

PaddlePaddle 团队首次开源文字识别模型套件 PaddleOCR,目标是打造丰富、领先、实用的文本识别模型/工具库。该模型套件是一个实用的超轻量 OCR 系统。主要由 DB 文本检测、检测框矫正和 CRNN 文本识别三部分组成。该系统从骨干网络选择和调整、预测头部的设计、数据增强、学习率变换策略、正则化参数选择、预训练模型使用以及模型自动裁剪量化 8 个方面,采用 19 个有效策略,对各个模块的模型进行效果调优和瘦身,最终得到整体大小为 3.5M 的超轻量中英文 OCR 和 2.8M 的英文数字 OCR。

本地开发

根据 PaddleOCR 的项目案例,采用轻量级 Python Web 框架 Bottle 框架进行项目开发:


# index.pyimport base64import bottleimport randomfrom paddleocr import PaddleOCR
ocr = PaddleOCR(use_gpu=False)
@bottle.route('/ocr', method='POST')def login(): filePath = './temp/' + (''.join(random.sample('zyxwvutsrqponmlkjihgfedcba', 5))) with open(filePath, 'wb') as f: f.write(base64.b64decode(bottle.request.body.read().decode("utf-8").split(',')[1])) ocrResult = ocr.ocr(filePath, cls=False) return {'result': [[line[1][0], float(line[1][1])] for line in ocrResult]}
bottle.run(host='0.0.0.0', port=8080)
复制代码


开发完成之后,运行该项目:


python index.py
复制代码


可以看到服务已经启动:



然后通过 Postman 工具进行测试,首先准备一张图片(此处以 PaddleOCR 项目内置的测试图片为例):



通过将图片转换为 Base64 编码,并以 POST 方法请求刚刚启动的 Web 服务,可以看到 PaddleOCR 的执行结果:


部署到 Serverless 架构

部署前准备

首先需要完成 Dockerfile 文件:


FROM python:3.7-slimRUN apt update && apt install gcc libglib2.0-dev libgl1-mesa-glx libsm6 libxrender1 -y && pip install paddlepaddle bottle scikit-build paddleocr# Create app directoryWORKDIR /usr/src/app# Bundle app sourceCOPY . .
复制代码


编写符合 Serverless Devs 规范的 Yaml 文档:


edition: 1.0.0name: paddle-ocraccess: default
services: paddle-ocr: component: fc props: region: cn-shanghai service: name: paddle-ocr description: paddle-ocr service function: name: paddle-ocr-function runtime: custom-container caPort: 8080 codeUri: ./ timeout: 60 customContainerConfig: image: 'registry.cn-shanghai.aliyuncs.com/custom-container/paddle-ocr:0.0.1' command: '["python"]' args: '["index.py"]' triggers: - name: httpTrigger type: http config: authType: anonymous methods: - GET - POST customDomains: - domainName: auto protocol: HTTP routeConfigs: - path: /*
复制代码
项目部署

首先构建镜像,此处可以通过 Serverless Devs 进行构建:


 s build --use-docker
复制代码



构建完成之后,可以通过工具直接进行部署:


s deploy --use-local -y
复制代码


部署完成,可以看到系统返回的测试地址:


项目测试

此时,可以通过该测试地址进行测试,同样得到了预期效果:


项目优化

通过对部署在 Serverless 架构上的项目进行请求,可以看到冷启动和热启动的时间消耗:



通过冷启动与热启动的对比,我们可以发现,在热启动时,整个系统的性能是相对优秀的。但是遇到冷启动整个项目的响应时常是不可控的,此时可以考虑一下途径进行优化:


  1. 缩减容器镜像的体积,减少不必要的依赖、文件等,清理掉安装依赖时留下的缓存等;因为函数计算的冷启动包括镜像拉取时间;

  2. 部分流程进行优化,例如在 PaddleOCR 项目中有明确说明:“paddleocr 会自动下载 ppocr 轻量级模型作为默认模型”,所以这就意味着该项目在 Serverless 架构的冷启动过程中,相对比热启动还增加了一个模型下载和解压的流程,所以这一部分在必要时是可以打入到容器镜像中,进而减少冷启动带来的影响;

  3. 开启镜像加速,可以有效降低容器镜像的冷启动,在阿里云函数计算官方文档中有相关镜像加速的性能测试描述:“开启函数计算的镜像加速后,可提速 2~5 倍,将分钟级的镜像拉取缩短至秒级”;

  4. 实例预留,最大程度上降低冷启动率。通过实例预留,可以通过多种算法/策略进行实例的预热和预启动,可以最大程度上降低 Serverless 架构冷启动带来的影响;

发布于: 4 小时前阅读数: 7
用户头像

刘宇

关注

阿里云Serverless云布道师 2020.01.04 加入

阿里云Serverless产品经理,国防科大在读博士,《Serverless架构》、《Serverless实践》、《人人都能学会的Serverless架构》等书籍作者,Serverless Devs发起人,Anycodes在线编程负责人。

评论

发布
暂无评论
Serverless架构下PaddleOCR项目开发与部署