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



    图像识别 + 信息抽取(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
    image

    安装

    虚机配置: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

    压缩模型

    image

    # 先重命名 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
    

    image

    下载模型

    文件有点大,10G左右
    image

    模型部署

    image

    [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
    image

    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 &
    

    image

    测试 -- 暂时还没通过

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

    image

    百度的环境重现了,问题就是我的服务器没有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环境有关
    image

    重启

    # 如果容器停止,重启容器
    [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 &
    
  • 相关阅读:
    mysql 索引优化
    Direct3D光照
    【Docker】Docker File
    电脑入门:路由器访问控制列表基础知识
    UI自动化测试之selenium工具(浏览器窗口的切换)
    Ubuntu14.04离线安装gcc-5.3.0
    Mysql的卸载流程
    android WebRtc 视频通话(P2P)
    MAXScript实现简单的碰撞检测教程
    微信撤回时间延长至3小时,真的?
  • 原文地址:https://www.cnblogs.com/vipsoft/p/17568862.html