图像识别 + 信息抽取(UIE-X),部署接口供别的应用调用

最终在自己部署的环境中识别时报错,不知道是不是和GPU有关,还在尝试中

流程

  • 在百度 BML CodeLab 中跑好模型(免费算力,玩玩够了)
  • 下载模型 (比较大,我这个有10G了,可以适当做裁剪)
  • Linux 上安装 Docker ,所以的事项在 Docker 中运行

版本

虚机配置:CentOS 7 、 内存:12G、CPU:4核

本文版本号:

Python 3.7.13 Docker 镜像已经集成

PaddlePaddle 2.4.0 Docker 镜像已经集成

PaddleNLP 2.5.2

PaddleOcr 2.6.1.3

注意: Python 版本 (Docker 镜像中的 Python 已经集成好)

PaddlePaddle 2.4.0 - => Python 3.7.4

PaddlePaddle 2.4.1 + => Python 3.9.0

查看版本 注意各个应用的版本关系

https://hub.docker.com/r/paddlepaddle/paddle/tags/?page=1&name=cpu

安装

虚机配置:CentOS 7 、 内存:12G、CPU:4核

镜像中集成好了 Python 3.7.12 比较方便

Docker 安装

# 切换进 opt/ppnlp 目录,后面 $PWD 挂载时会用到当前的路径
[root@localhost ~]# cd /opt/ppnlp/
[root@localhost ppnlp]# pwd
/opt/ppocr
[root@localhost ppnlp]# # 获取镜像 -- 没有GPU环境,使用CPU跑了玩玩
[root@localhost ppnlp]# docker pull registry.baidubce.com/paddlepaddle/paddle:2.4.0-cpu
# 创建一个名字为 ppnlp 的docker容器,并将当前目录映射到容器的/paddle目录下
[root@localhost ppnlp]# docker run --name ppnlp -v $PWD:/paddle --network=host -it registry.baidubce.com/paddlepaddle/paddle:2.4.0-cpu /bin/bash
# --name ppnlp:设定 Docker 的名称,ppnlp 是自己设置的名称;
# -it:参数说明容器已和本机交互式运行;
# -v $PWD:/paddle:指定将当前路径(PWD 变量会展开为当前路径的绝对路径--Linux宿主机的路径,所以执行命令的路径要选好)挂载到容器内部的 /paddle 目录;(相当于 /opt/ppnlp 挂载到容器内)
# registry.baidubce.com/paddlepaddle/paddle:2.4.0-cpu:指定需要使用的 image 名称,您可以通过docker images命令查看;/bin/bash 是在 Docker 中要执行的命令 # ctrl+P+Q可退出docker 容器,重新进入docker 容器使用如下命令
[root@localhost ppocr]# docker exec -it ppnlp /bin/bash
λ localhost /home

[root@localhost 开头的都是在Linux 服务器上执行

以下命令都是在容器中执行,防止混淆,下面命令省掉了 λ localhost /home

PaddleNLP 安装

# 升级 pip
pip install -U pip -i https://mirror.baidu.com/pypi/simple
# 容器中已经包含了 paddlepaddle 2.4.0
pip list
# 安装 PaddleNLP
pip install paddlenlp -i https://mirror.baidu.com/pypi/simple
# 安装 PaddleOCR
pip install paddleocr -i https://mirror.baidu.com/pypi/simple

环境准备

模型准备

前面已经训练好了:https://aistudio.baidu.com/aistudio/projectdetail/6518069?sUid=2631487&shared=1&ts=1689903307978

压缩模型

# 先重命名
mv checkpoint checkpoint2
# 创建目录
mkdir -p checkpoint/model_best
# 复制需要的文件
cp checkpoint2/model_best/model.pdiparams model.pdiparams
cp checkpoint2/model_best/model.pdiparams.info model.pdiparams
cp checkpoint2/model_best/model.pdmodel model.pdiparams
cp checkpoint2/model_best/model_state.pdparams model.pdiparams
cp checkpoint2/model_best/sentencepiece.bpe.model model.pdiparams

# 压缩文件 --大概要10G左右
tar cf checkpoint.tar checkpoint

下载模型

文件有点大,10G左右

模型部署

[root@localhost ~]# cd /opt/ppnlp
# 将模型,复制到容器中
[root@localhost ppnlp]# docker cp checkpoint.tar ppnlp:/home
# 进入容器
[root@localhost ppnlp]# docker exec -it ppnlp /bin/bash
λ localhost /home ll
total 9.5G
drwxr-xr-x. 1 root root 55 Jul 21 02:58 ./
drwxr-xr-x. 1 root root 66 Jul 21 02:58 ../
-rw-r--r--. 1 root root 9.5G Jul 21 02:24 checkpoint.tar
drwxr-xr-x. 6 root root 52 Aug 17 2022 cmake-3.16.0-Linux-x86_64/
λ localhost /home
λ localhost /home tar -xvf checkpoint.tar
# 容器中安装 tree
λ localhost /home apt-get install tree

环境配置

https://gitee.com/paddlepaddle/PaddleNLP/tree/v2.5.2/applications/information_extraction/document/deploy/simple_serving

将 server.py、client.py、test.jpg 根据环境修改配置后,上传至容器中

test.jpg

server.py

from paddlenlp import SimpleServer, Taskflow

# The schema changed to your defined schema
schema = ["开票日期", "名称", "纳税人识别号", "开户行及账号", "金额", "价税合计", "No", "税率", "地址、电话", "税额"]
# The task path changed to your best model path
uie = Taskflow(
"information_extraction",
schema=schema,
task_path="/home/checkpoint/model_best", # 注意路径
)
# If you want to define the finetuned uie service
app = SimpleServer()
app.register_taskflow("taskflow/uie", uie)

client.py


import json import requests from paddlenlp.utils.doc_parser import DocParser # Define the docuemnt parser
doc_parser = DocParser() image_paths = ["/home/test.jpg"] # 注意路径
image_base64_docs = [] # Get the image base64 to post
for image_path in image_paths:
req_dict = {}
doc = doc_parser.parse({"doc": image_path}, do_ocr=False)
base64 = doc["image"]
req_dict["doc"] = base64
image_base64_docs.append(req_dict) url = "http://0.0.0.0:8189/taskflow/uie"
headers = {"Content-Type": "application/json"}
data = {"data": {"text": image_base64_docs}} # Post the requests
r = requests.post(url=url, headers=headers, data=json.dumps(data))
datas = json.loads(r.text)
print(datas)

将文件传到容器内

# 将文件传至容器
[root@localhost ppnlp]# docker cp client.py ppnlp:/home
[root@localhost ppnlp]# docker cp server.py ppnlp:/home
[root@localhost ppnlp]# docker cp test.jpg ppnlp:/home
# 进入容器
[root@localhost ppnlp]# docker exec -it ppnlp /bin/bash
λ localhost /home ll
total 9.5G
-rw-r--r--. 1 root root 77 Jul 20 09:27 '='
drwxr-xr-x. 1 root root 105 Jul 21 05:24 ./
drwxr-xr-x. 1 root root 66 Jul 21 05:24 ../
drwxr-xr-x. 3 1000 1000 24 Jul 18 09:36 checkpoint/
-rw-r--r--. 1 root root 9.5G Jul 21 02:24 checkpoint.tar
-rw-r--r--. 1 root root 1.3K Jul 21 04:02 client.py
drwxr-xr-x. 6 root root 52 Aug 17 2022 cmake-3.16.0-Linux-x86_64/
-rw-r--r--. 1 root root 1.2K Jul 21 03:57 server.py
-rw-r--r--. 1 root root 1.4M Jul 21 03:55 test.jpg
λ localhost /home

启动服务

# 进入容器
[root@localhost ppnlp]# docker exec -it ppnlp /bin/bash
# 启动服务
λ localhost /home paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8189
# 后台运行 -- 测试时不要用后台运行,中间会报很多错误,开两个窗口,调试时方便
# λ localhost /home nohup paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8189 &>log.txt &

测试 -- 暂时还没通过

# 再开一个窗口执行
# 进入容器
[root@localhost ppnlp]# docker exec -it ppnlp /bin/bash
λ localhost /home python client.py

百度的环境重现了,问题就是我的服务器没有GPU

from pprint import pprint
from paddlenlp import Taskflow
schema = {
'项目名称': [
'结果',
'单位',
'参考范围'
]
}
my_ie = Taskflow("information_extraction", model="uie-x-base", schema=schema, task_path='./checkpoint/model_best') # 加上device_id=0,使用CPU,会就报
my_ie = Taskflow("information_extraction", model="uie-x-base", schema=schema, device_id=0, task_path='./checkpoint/model_best')

百度 BML CodeLab 环境中,加上device_id=0, 使用CPU,会就报下面错误 推测我的虚机里面错误,应该是没有GPU环境有关

重启

# 如果容器停止,重启容器
[root@localhost ppocr]# docker restart ppnlp
# 进入容器
[root@localhost ppocr]# docker exec -it ppnlp /bin/bash # 启动服务
λ localhost /home paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8189
# 后台运行 -- 测试时不要用后台运行,中间会报很多错误,开两个窗口,调试时方便
# λ localhost /home nohup paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8189 &>log.txt &

模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别 + 信息抽取(UIE-X)的更多相关文章

  1. 开源OA办公平台搭建教程:基于nginx的快速集群部署——端口分发

    主机信息 主机1:172.16.98.8(linux) 主机2:172.16.98.9(linux) 集群需求 172.16.98.8:WEB服务器,应用服务器,文件存储服务器,中心服务器 172.1 ...

  2. 服务化部署框架Paddle Serving

    服务化部署框架Paddle Serving 概述 常见的深度学习模型开发流程需要经过问题定义.数据准备.特征提取.建模.训练过程,以及最后一个环--将训练出来的模型部署应用到实际业务中.如图1所示,当 ...

  3. 基于云基础设施快速部署 RocketMQ 5.0 集群

    本文作者:蔡高扬,Apache RocketMQ Committer, 阿里云智能技术专家. 背景 上图左侧为 RocketMQ 4.x版本集群,属于非切换架构.NameServer 作为无状态节点可 ...

  4. 基于TensorFlow Serving的深度学习在线预估

    一.前言 随着深度学习在图像.语言.广告点击率预估等各个领域不断发展,很多团队开始探索深度学习技术在业务层面的实践与应用.而在广告CTR预估方面,新模型也是层出不穷: Wide and Deep[1] ...

  5. RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录

    RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架 ...

  6. [置顶] 基于.NET的快速信息化系统开发框架 — RDIFramework.NET — 系统目录

    基于.NET的快速信息化系统开发整合框架 —RDIFramework.NET—系统目录 框架简单介绍 .NET快速开发整合框架(RDIFramework.NET),基于.NET的快速信息化系统开发.整 ...

  7. 基于ubuntu16.04快速构建Hyperledger Fabric网络

    前言 最近在参加一个比赛,使用到了区块链的开源软件hyperledger,由于之前从未接触过区块链,以及和区块链开发相关的内容,所有在网上查阅了大量的资料,并且通过学习yeasy(杨宝华)开源的入门书 ...

  8. 基于HDP版本的YDB安装部署(转)

    第三章 YDB依赖环境准备 一.硬件环境 硬件如何搭配,能做到比较高的性价比,不存在短板.合理的硬件搭配,对系统的稳定性也很关键. 1.CPU不是核数越高越好,性价比才是关键. 经常遇到很多的企业级客 ...

  9. Linux上FTP部署:基于mariadb管理虚拟用户

    FTP原理 FTP 采用 Internet 标准文件传输协议 FTP 的用户界面, 向用户提供了一组用来管理计算机之间文件传输的应用程序.图1 FTP 的基本模型 FTP 是基于客户---服务器(C/ ...

  10. Serverless 初体验:快速开发与部署一个Hello World(Java版)

    昨天被阿里云的这个酷炫大屏吸引了! 我等85后开发者居然这么少!挺好奇到底什么鬼东西都是90.95后在玩?就深入看了一下. 这是一个关于Serverless的体验活动,Serverless在国内一直都 ...

随机推荐

  1. Java的final修饰符

    final 实例域 可以将实例域定义为 final.对于 final 域来说,构建对象时必须初始化 final 实例域,构造对象之后就不允许改变 final 实例域的值了.也就是说,必须确保在每一个构 ...

  2. StarRocks 3.0 集群安装手册

    本文介绍如何以二进制安装包方式手动部署最新版 StarRocks 3.0集群. 什么是 StarRocks StarRocks 是新一代极速全场景 MPP (Massively Parallel Pr ...

  3. Mac + IOS + Safari 抓取网络请求

    第一步:打开苹果手机 设置>Safari浏览器>高级>网页检查器 第二步:打开 Mac 上的Safari浏览器>偏好设置>高级>在菜单栏中显示"开发&qu ...

  4. TypeScript FromData添加数组

    本文解决的是,如何向FromData添加对象数组. 在FormData中添加数据并使用Axios向后台请求数据,参数是列表对象File[] 结果接口请求时,数据变成了字符串: 试试直接使用File[] ...

  5. [C++核心编程] 4.6、继承

    文章目录 4.6 继承 4.6.1 继承的基本语法 4.6.2 继承方式 4.6.3 继承中的对象模型 4.6.4 继承中构造和析构顺序 4.6.5 继承同名成员处理方式 4.6.6 继承同名静态成员 ...

  6. TOF和结构光

    文章目录 TOF和结构光 一.ToF 二.结构光 三.测量距离.分辨率.开发周期的对比 TOF和结构光 一.ToF ToF(Time of Flight)飞行时间 字面理解就是通过光的飞行时间来计算距 ...

  7. Prism Sample 10 10-CustomRegistrations

    作用同上节,这里是用修改注册的方式自定义View和ViewModel的关联. protected override void ConfigureViewModelLocator() { base.Co ...

  8. 学node 之前你要知道这些

    初识nodejs   19年年底一个偶然的机会接到年会任务,有微信扫码登录.投票.弹幕等功能,于是决定用node 来写几个服务,结果也比较顺利.   当时用看了下koa2的官方文档,知道怎么连接数据库 ...

  9. sh: vue-cli-service: command not found

    mac环境下运行vue项目报错sh: vue-cli-service: command not found 解决方法:cd到项目目录下,执行命令sudo rm -rf node_modules pac ...

  10. 2020-10-30:给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标。即求出: maxValue = max{arr[j]-arr[i] and j >= i}?

    福哥答案2020-10-30:1.双重遍历法.2.一次遍历法.golang代码如下: package main import "fmt" const INT_MAX = int(^ ...