paddlepaddle:在serverless架构上十几行代码实现ocr能力

阿里云云栖号 阿里云云栖号     2023-01-14     463

关键词:

简介: 飞桨深度学习框架采用基于编程逻辑的组网范式,对于普通开发者而言更容易上手,同时支持声明式和命令式编程,兼具开发的灵活性和高性能。

飞桨 (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 Ttransform = 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/5step 938/938 [==============================] - loss: 0.1801 - acc: 0.9032 - 8ms/stepEpoch 2/5step 938/938 [==============================] - loss: 0.0544 - acc: 0.9502 - 8ms/stepEpoch 3/5step 938/938 [==============================] - loss: 0.0069 - acc: 0.9595 - 7ms/stepEpoch 4/5step 938/938 [==============================] - loss: 0.0094 - acc: 0.9638 - 7ms/stepEpoch 5/5step 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。

本地开发

# 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 paddleocrle 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 架构冷启动带来的影响;

原文链接
本文为阿里云原创内容,未经允许不得转载。 

全开源深度学习平台paddlepaddle入手之路----利用docker在windows10专业版环境下配置paddlepaddle

利用Docker在Windows10专业版环境下配置PaddlePaddle    对于PaddlePaddle的安装,查询官网信息,PaddlePaddle提供pip安装和Docker安装运行的使用方式。我们已经了解到Docker在避免环境配置难题上的的巨大优势,加上本人用的是... 查看详情

paddlepaddle-github的正确打开姿势

...项目版本管理工具,会使用它是程序员入门的必备技能。PaddlePaddle也不例外,所有的源码及项目进展都在GitHub上开源公布。但对于刚入门写程序的同学来说,一打开GitHub看起来云里雾里,会有种无从下手的感觉,本文给同学介绍... 查看详情

paddlepaddle使用

paddlepaddle是百度提出来的深度学习的框架,个人感觉其实和tensorflow差不多(语法上面),因为本人也是初学者,也不是很懂tensorflow,所以,这些都是个人观点。百度的paddlepaddle提出貌似有一段时间了,我是最近才知道的,好奇去... 查看详情

在 Windows 10 上安装 serverless 后,我无法在命令提示符下运行“serverless”

】在Windows10上安装serverless后,我无法在命令提示符下运行“serverless”【英文标题】:AfterinstallingserverlessonWindows10,Ican\'trun"serverless"atthecommandprompt【发布时间】:2017-03-1601:30:01【问题描述】:我安装了NodeJS,它似乎工作正... 查看详情

serverless介绍篇云开发在serverless方面取得了怎样的新成果?

过去几年间,Serverless发展迅猛,与其相伴的还有从小程序、移动端等到前后端一体化的演进与实践,也正因如此,从云计算到前端,众多开发者都极为关注。本文介绍了腾讯云CloudBase的Serverless实践,相信会对关注Serverless以及研... 查看详情

paddlepaddle系列手写数字识别(代码片段)

 最近百度为了推广自家编写对深度学习框架PaddlePaddle不断推出各种比赛。百度声称PaddlePaddle是一个“易学、易用”的开源深度学习框架,然而网上的资料少之又少。虽然百度很用心地提供了许多文档,而且还是中英双语具备... 查看详情

serverless基本概念入门

从行业趋势看,Serverless是云计算必经的一场革命2019年,Serverless被Gartner称为最有潜力的云计算技术发展方向,并被赋予是必然性的发展趋势。Serverless从底层开始变革计算资源的形态,为软件架构设计与应用服务部署带来了新的... 查看详情

深度学习系列关于paddlepaddle的一些避“坑”技巧

...遇到了一些问题,并找到了解决方法,跟大家分享一下:PaddlePaddle的Anaconda的兼容问题  之前我是在服务器上安装的PaddlePaddle的gpu版本,我想把BROAD数据拷贝到服务器上面,结果发现我们服务器的22端口没开,不能用scp传上去,... 查看详情

serverless选型:深度解读serverless架构及平台选择

...在每个阶段要面对的问题,然后组合解决方案,提炼面向Serverless的开发模型,并与业界提出的Serverless产品形态做对应,为开发者采用Serverless架构和服务提供参考。近两年来,Serverless概念在开发者中交流的越来越多,主题分享... 查看详情

serverless选型:深度解读serverless架构及平台选择

...在每个阶段要面对的问题,然后组合解决方案,提炼面向Serverless的开发模型,并与业界提出的Serverless产品形态做对应,为开发者采用Serverless架构和服务提供参考。近两年来,Serverless概念在开发者中交流的越来越多,主题分享... 查看详情

serverless应用架构转型

Serverless架构是一种全新的软件架构方式,虽然其有各种各样独有的特点,但是Serverless应用和传统的软件应用一样,软件的设计、开发到交付需要经历一个完整的软件生命周期,需要通过具体的手段保证应用的交付质量。敏捷开... 查看详情

aws + serverless + webpack => 在 prod 中找不到模块 xxx

】aws+serverless+webpack=>在prod中找不到模块xxx【英文标题】:aws+serverless+webpack=>cannotfindmodulexxxinprod【发布时间】:2017-08-1203:24:29【问题描述】:我想创建一个包以使用serverless和webpack在AWS上部署。在serverless.yml我想声明所有资源... 查看详情

从函数计算到serverless架构(代码片段)

前言随着Serverless架构的不断发展,各云厂商和开源社区都已经在布局Serverless领域,一方面表现在云厂商推出传统服务/业务的Serverless化版本,或者Serverless计算平台,另一方面表现在开源社区中Serverless相关项目逐... 查看详情

serverless开源引擎knative

...合:工作负载管理(和动态扩缩)以及事件模型来实现的Serverless标准,也叫容器化Serverless。Knative社区的主要贡献者有:Google、Pivotal、IBM、RedHat,可见其阵容强大。还有,CloudFoundry、OpenShift这些PaaS提供商都在积极地参与Knative的... 查看详情

paddlepaddle模型训练和预测之基础api(代码片段)

导读在上篇文章paddlepaddle模型训练和预测之高级API我们已经介绍过了如何通过高级API来搭建网络模型进行模型的训练和预测,这篇文章我们主要来介绍如何通过paddlepaddle的基础API来实现模型的训练,其实高级的API接口也... 查看详情

paddlepaddle模型训练和预测之基础api(代码片段)

导读在上篇文章paddlepaddle模型训练和预测之高级API我们已经介绍过了如何通过高级API来搭建网络模型进行模型的训练和预测,这篇文章我们主要来介绍如何通过paddlepaddle的基础API来实现模型的训练,其实高级的API接口也... 查看详情

paddlepaddle模型训练和预测之基础api(代码片段)

导读在上篇文章paddlepaddle模型训练和预测之高级API我们已经介绍过了如何通过高级API来搭建网络模型进行模型的训练和预测,这篇文章我们主要来介绍如何通过paddlepaddle的基础API来实现模型的训练,其实高级的API接口也... 查看详情

从函数计算到serverless架构(代码片段)

作者:秋雨陈前言随着Serverless架构不断发展,各云厂商和开源社区都已经布局Serverless领域,一方面表现在云厂商推出传统服务/业务的Serverless化版本,或者Serverless计算平台;另一方面表现在开源社区中Serverles... 查看详情