PaddlePaddle:在Serverless架构上十几行代码实现OCR能力

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个自主研发、功能完备、 开源开放的产业级深度学习平台,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。飞桨深度学习框架采用基于编程逻辑的组网范式,对于普通开发者而言更容易上手,同时支持声明式和命令式编程,兼具开发的灵活性和高性能。另外飞桨不仅广泛兼容第三方开源框架训练的模型部署,并且为不同的场景的生产环境提供了完备的推理引擎,包括适用于高性能服务器及云端推理的原生推理库 Paddle Inference,面向分布式、流水线生产环境下自动上云、A/B测试等高阶功能的服务化推理

飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个自主研发、功能完备、 开源开放的产业级深度学习平台,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。

飞桨深度学习框架采用基于编程逻辑的组网范式,对于普通开发者而言更容易上手,同时支持声明式和命令式编程,兼具开发的灵活性和高性能。另外飞桨不仅广泛兼容第三方开源框架训练的模型部署,并且为不同的场景的生产环境提供了完备的推理引擎,包括适用于高性能服务器及云端推理的原生推理库 Paddle Inference,面向分布式、流水线生产环境下自动上云、A/B测试等高阶功能的服务化推理框架 Paddle Serving,针对于移动端、物联网场景的轻量化推理引擎 Paddle Lite,以及在浏览器、小程序等环境下使用的前端推理引擎 Paddle.js。同时,透过与不同场景下的主流硬件高度适配优化及异构计算的支持, 飞桨的推理性能也领先绝大部分的主流实现。

安装飞桨

飞桨可以被认为是一个Python的依赖库,官方提供了pip,conda,源码编译等多种安装方法。以pip安装方法为例,飞桨提供了CPU和GPU两个版本安装方法:

  • CPU版本安装方法:

    pip install paddlepaddle
  • GPU版本安装方法:

    pip install paddlepaddle-gpu

实践:手写数字识别任务

MNIST是非常有名的手写体数字识别数据集,在无论是Tensorflow的官方网站还是PaddlePaddle的新手入门,都是通过它做实战讲解,它由手写体数字的图片和相对应的标签组成,如:

MNIST数据集分为训练图像和测试图像。训练图像60000张,测试图像10000张,每一个图片代表0-9中的一个数字,且图片大小均为28*28的矩阵。这一小节将会以PaddlePaddle官方提供的MNIST手写数字识别任务为例,进行PaddlePaddle框架的基本学习。与其他深度学习任务一样,飞桨同样要通过以下四个步骤完成一个相对完整的深度学习任务:

  1. 数据集的准备和加载;
  2. 模型构建;
  3. 模型训练;
  4. 模型评估。

加载内置数据集

飞桨框架内置了一些常见的数据集,在这个示例中,开发者可以加载飞桨框架的内置数据集,例如本案例所涉及到的手写数字体数据集。这里加载两个数据集,一个用来训练模型,一个用来评估模型。

import paddle.vision.transforms as T
transform = T.Normalize(mean=[127.5], std=[127.5], data_format='CHW')

# 下载数据集
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
val_dataset =  paddle.vision.datasets.MNIST(mode='test', transform=transform)

模型搭建

通过 Sequential 将一层一层的网络结构组建起来。注意,需要先对数据进行 Flatten 操作,将[1, 28, 28]形状的图片数据改变形状为[1, 784]。

mnist = paddle.nn.Sequential(
    paddle.nn.Flatten(),
    paddle.nn.Linear(784, 512),
    paddle.nn.ReLU(),
    paddle.nn.Dropout(0.2),
    paddle.nn.Linear(512, 10)
)

模型训练

在训练模型前,需要配置训练模型时损失的计算方法与优化方法,开发者可以使用飞桨框架提供的 prepare 完成,之后使用 fit 接口来开始训练模型。

# 预计模型结构生成模型对象,便于进行后续的配置、训练和验证
model = paddle.Model(mnist)

# 模型训练相关配置,准备损失计算方法,优化器和精度计算方法
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
                paddle.nn.CrossEntropyLoss(),
                paddle.metric.Accuracy())

# 开始模型训练
model.fit(train_dataset,
            epochs=5,
            batch_size=64,
            verbose=1)

训练结果:

The loss value printed in the log is the current step, and the metric is the average value of previous steps.
Epoch 1/5
step 938/938 [==============================] - loss: 0.1801 - acc: 0.9032 - 8ms/step
Epoch 2/5
step 938/938 [==============================] - loss: 0.0544 - acc: 0.9502 - 8ms/step
Epoch 3/5
step 938/938 [==============================] - loss: 0.0069 - acc: 0.9595 - 7ms/step
Epoch 4/5
step 938/938 [==============================] - loss: 0.0094 - acc: 0.9638 - 7ms/step
Epoch 5/5
step 938/938 [==============================] - loss: 0.1414 - acc: 0.9670 - 8ms/step

模型评估

开发者可以使用预先定义的验证数据集来评估前一步训练得到的模型的精度。

model.evaluate(val_dataset, verbose=0)

结果如下:

{'loss': [2.145765e-06], 'acc': 0.9751}

可以看出,初步训练得到的模型效果在97.5%附近,在逐渐了解飞桨后,开发者可以通过调整其中的训练参数来提升模型的精度。

与Serverless架构结合

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

本地开发

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

# index.py
import base64
import bottle
import random
from 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架构

目前各大云厂商的FaaS平台均已经逐渐支持容器镜像部署。所以,可以将项目打包成镜像,并通过Serverless Devs部署到阿里云函数计算。

部署前准备

首先需要完成Dockerfile文件:

FROM python:3.7-slim

RUN apt update && apt install gcc libglib2.0-dev libgl1-mesa-glx libsm6 libxrender1 -y && pip install paddlepaddle bottle scikit-build paddleocr

# Create app directory
WORKDIR /usr/src/app

# Bundle app source
COPY . .

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

# s.yaml
edition: 1.0.0
name: paddle-ocr
access: 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 --push-registry acr-internet --use-local -y

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

项目测试

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

项目优化

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

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

  1. 缩减容器镜像的体积,减少不必要的依赖、文件等,清理掉安装依赖时留下的缓存等;因为函数计算的冷启动包括镜像拉取时间;
  2. 部分流程进行优化,例如在PaddleOCR项目中有明确说明:“paddleocr会自动下载ppocr轻量级模型作为默认模型”,所以这就意味着该项目在Serverless架构的冷启动过程中,相对比热启动还增加了一个模型下载和解压的流程,所以这一部分在必要时是可以打入到容器镜像中,进而减少冷启动带来的影响;
  3. 开启镜像加速,可以有效降低容器镜像的冷启动,在阿里云函数计算官方文档中有相关镜像加速的性能测试描述:“开启函数计算的镜像加速后,可提速2~5倍,将分钟级的镜像拉取缩短至秒级”;
  4. 实例预留,最大程度上降低冷启动率。通过实例预留,可以通过多种算法/策略进行实例的预热和预启动,可以最大程度上降低Serverless架构冷启动带来的影响;
相关实践学习
通过ACR快速部署网站应用
本次实验任务是在云上基于ECS部署Docker环境,制作网站镜像并上传至ACR镜像仓库,通过容器镜像运行网站应用,网站运行在Docker容器中、网站业务数据存储在Mariadb数据库中、网站文件数据存储在服务器ECS云盘中,通过公网地址进行访问。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
5月前
|
数据采集 运维 Serverless
云函数采集架构:Serverless模式下的动态IP与冷启动优化
本文探讨了在Serverless架构中使用云函数进行网页数据采集的挑战与解决方案。针对动态IP、冷启动及目标网站反爬策略等问题,提出了动态代理IP、请求头优化、云函数预热及容错设计等方法。通过网易云音乐歌曲信息采集案例,展示了如何结合Python代码实现高效的数据抓取,包括搜索、歌词与评论的获取。此方案不仅解决了传统采集方式在Serverless环境下的局限,还提升了系统的稳定性和性能。
158 0
|
2月前
|
文字识别 运维 监控
架构解密|一步步打造高可用的 JOCR OCR 识别服务
本文深入解析了JOCR OCR识别服务的高可用架构设计,涵盖从用户上传、智能调度、核心识别到容错监控的完整链路,助力打造高性能、低成本的工业级OCR服务。
137 0
架构解密|一步步打造高可用的 JOCR OCR 识别服务
|
5月前
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
513 69
|
4月前
|
数据采集 运维 监控
Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
随着互联网数据采集需求的增长,传统爬虫架构因固定IP易封禁、资源浪费及扩展性差等问题逐渐显现。本文提出基于Serverless与代理IP技术的新一代爬虫方案,通过动态轮换IP、弹性调度任务等特性,显著提升启动效率、降低成本并增强并发能力。架构图与代码示例详细展示了其工作原理,性能对比数据显示采集成功率从71%提升至92%。行业案例表明,该方案在电商情报与价格对比平台中效果显著,未来有望成为主流趋势。
109 0
Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
|
5月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
339 12
|
6月前
|
机器学习/深度学习 文字识别 开发者
使用OCR库Pix2Text执行p2t.recognize()时出现list index out of range的错误信息(附有Pix2Text识别图片内容和laTex公式的代码)
有时候报错并不是你代码有问题,源码出错也是很常见的情况,比如之前使用mxgraph也出现了不知名bug,最后也是修改的源码解决的。有疑问欢迎交流~ 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
6月前
|
存储 消息中间件 人工智能
基于 Apache RocketMQ 的 ApsaraMQ Serverless 架构升级
基于 Apache RocketMQ 的 ApsaraMQ Serverless 架构升级
124 0
|
运维 Cloud Native 关系型数据库
活动回顾|阿里云 Serverless 技术实战与创新成都站回放&PPT下载
7月29日“阿里云 Serverless 技术实战与创新”成都站圆满落幕。可免费下载成都站|阿里云 Serverless 沙龙演讲 PPT。
|
人工智能 弹性计算 运维
阿里云宣布 Serverless 应用引擎 SAE2.0 将公测上线,多款产品全新升级
阿里云宣布 Serverless 应用引擎 SAE2.0 将公测上线,多款产品全新升级
70536 53

相关产品

  • 函数计算