图像识别 + 信息抽取(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. Linux系统如何查看内核版本信息

    使用如下命令: cat /etc/os-release 显示结果如下,系统内核不同,信息不同.

  2. 关于java中的super

    首当其冲先说一下super的用途和含义.他是用于调用一些被重写的方法. 这里还可以复习一下子这个重写:重写是把新的方法放在被重写的方法前面.在被重写的子类中,优先调用重写后的方法.但是如果想要调用原本 ...

  3. 【Python基础】集合的基本使用

    Python中的集合是一种无序且唯一的数据结构.集合是通过花括号{}或者set()函数来创建的. 创建集合 s = set() 声明空集合 s = {1,2,3,4,5} 声明非空集合 添加元素 s. ...

  4. 2022-09-27:给定一个棵树, 树上每个节点都有自己的值,记录在数组nums里, 比如nums[4] = 10,表示4号点的值是10, 给定树上的每一条边,记录在二维数组edges里, 比如ed

    2022-09-27:给定一个棵树, 树上每个节点都有自己的值,记录在数组nums里, 比如nums[4] = 10,表示4号点的值是10, 给定树上的每一条边,记录在二维数组edges里, 比如ed ...

  5. 2022-01-17:单词规律 II。 给你一种规律 pattern 和一个字符串 str,请你判断 str 是否遵循其相同的规律。 这里我们指的是 完全遵循,例如 pattern 里的每个字母和字符

    2022-01-17:单词规律 II. 给你一种规律 pattern 和一个字符串 str,请你判断 str 是否遵循其相同的规律. 这里我们指的是 完全遵循,例如 pattern 里的每个字母和字符 ...

  6. 2022-01-13:K 个不同整数的子数组。 给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定不同的子数组为好子数组。 (例如,[1,2,3,1

    2022-01-13:K 个不同整数的子数组. 给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续.不一定不同的子数组为好子数组. (例如,[1,2,3,1 ...

  7. Velocity 不用愁!Velocity 系统的前端工程化之路

    Velocity是一个基于Java的Web页面模版引擎.十多年前,Velocity将Java代码从Web页面中分离出来,使得开发者能够并行网页开发和Java开发.随着十年前后端分离的浪潮涌动,回首再面 ...

  8. git从配置到使用

    一 .安装git 1.1 官方地址为:https://git-scm.com/download/win 1.2 双击下载的.exe文件 1.3 直接下一步 1.4 自定义安装目录 1.5 勾选命令行和 ...

  9. python如何利用算法解决业务上的【分单问题】

    分单是很多企业日常工作中非常典型的一项内容,它非常复杂,但同时又极为重要,如何合理的分单是企业管理中一个很重要的课题. 之所以说分单很复杂,是因为影响单据该分给谁,分多少量这个事儿本身就有太多的影响因 ...

  10. Linux,会这些就够了

    在测试当中,其实对Linux的要求不高,我们在工作中需要记住常用的一些命令,不常用的实际用到的时候再查在记即可,最重要我们要使用命令可以查看日志,定位bug   目录篇: 可用  pwd  命令查看用 ...