Files
FastDeploy/docs/Linux-Python-SDK-Serving.md
2022-06-27 18:23:21 +08:00

9.4 KiB
Raw Blame History

简介

本文档以千分类模型_MobileNetV3为例,介绍 FastDeploy中的模型SDK ,在Intel x86_64 / NVIDIA GPU Linux Python 环境下: 1)SDK 服务化推理部署步骤; 2介绍模型推流全流程API方便开发者了解项目后二次开发。 其中Linux C++请参考Linux C++环境下的服务化推理部署文档。

【注意】OCR Demo 暂不支持服务化部署。

环境准备

1. SDK下载

根据开发者模型、部署芯片、操作系统需要,在图像界面飞桨开源模型GIthub中选择对应的SDK进行下载。解压后SDK目录结构如下

EasyEdge-Linux-x86-[部署芯片]
├── RES       # 模型文件资源文件夹,可替换为其他模型
├── README.md
├── cpp       # C++ SDK
└── python    # Python SDK

2. Python环境

当前SDK仅支持Python 3.5, 3.6, 3.7

使用如下命令获取已安装的Python版本号。如果本机的版本不匹配建议使用pyenvanaconda等Python版本管理工具对SDK所在目录进行配置。

$python3 --version

接着使用如下命令确认pip的版本是否满足要求要求pip版本为20.2.2或更高版本。详细的pip安装过程可以参考官网教程

$python3 -m pip --version

3. 安装依赖

3.1 安装paddlepaddle

根据具体的部署芯片CPU/GPU安装对应的PaddlePaddle的whl包。

1.x86_64 CPU 平台可以使用如下命令进行安装:

```shell
python3 -m pip install paddlepaddle==2.2.2 -i https://mirror.baidu.com/pypi/simple 
```

2.x86_64 NVIDIA GPU 支持的CUDA和CUDNN版本与PaddlePaddle框架保持一致如下

*  CUDA 工具包10.1/10.2配合cuDNN 7 (cuDNN版本>=7.6.5, 如需多卡支持需配合NCCL2.7及更高)
*  CUDA 工具包11.0配合cuDNN v8.0.4(如需多卡支持需配合NCCL2.7及更高)
*  CUDA 工具包11.1配合cuDNN v8.1.1(如需多卡支持需配合NCCL2.7及更高)
*  CUDA 工具包11.2配合cuDNN v8.1.1(如需多卡支持需配合NCCL2.7及更高)

具体安装命令,参考[官网Paddle安装教程](https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/linux-pip.html)。  

使用 NVIDIA GPU 预测时,必须满足:

  1. 机器已安装 cuda, cudnn
    2. 已正确安装对应 cuda 版本的paddle 版本
    3. 通过设置环境变量FLAGS_fraction_of_gpu_memory_to_use设置合理的初始内存使用比例

3.2 安装EasyEdge Python Wheel 包

python目录下安装特定Python版本的EasyEdge Wheel包。对x86_64 CPUx86_64 Nvidia GPU平台 可以使用如下命令进行安装,具体名称以 Python SDK 包中的 whl 为准。

python3 -m pip install -U BaiduAI_EasyEdge_SDK-{SDK版本号}-cp{Python版本号}-cp{Python版本号}m-linux_x86_64.whl

armv8 CPU平台可以使用如下命令进行安装:

python3 -m pip install -U BaiduAI_EasyEdge_SDK-{SDK版本号}-cp36-cp36m-linux_aarch64.whl

快速开始

1. 文件结构说明

Python SDK文件结构如下

EasyEdge-Linux-x86--[部署芯片]
├──...
├──python  # Linux Python SDK
    ├──    # 特定Python版本的EasyEdge Wheel包, 二次开发可使用
    ├── BaiduAI_EasyEdge_SDK-1.2.8-cp35-cp35m-linux_x86_64.whl 
    ├── BaiduAI_EasyEdge_SDK-1.2.8-cp36-cp36m-linux_x86_64.whl
    ├── BaiduAI_EasyEdge_SDK-1.2.8-cp37-cp37m-linux_x86_64.whl
    ├── infer_demo           # demo体验完整文件
    │   ├──  demo_xxx.py     # 包含前后处理的端到端推理demo文件
    │   └──  demo_serving.py # 提供http服务的demo文件
    ├── tensor_demo          # 学习自定义算法前后处理时使用
    │   └──  demo_xxx.py

2. 测试Serving服务

模型资源文件默认已经打包在开发者下载的SDK包中 默认为RES目录。

2.1 启动HTTP预测服务

指定对应的模型文件夹(默认为RES、设备ip和指定端口号运行如下命令。

python3 demo_serving.py {模型RES文件夹} {host, default 0.0.0.0} {port, default 24401}

成功启动后,终端中会显示如下字样。

...
* Running on {host ip}:24401

如果是在局域网内的机器上部署,开发者此时可以打开浏览器,输入http://{host ip}:24401,选择图片来进行测试,运行效果如下。

如果是在远程机器上部署,那么可以参考demo_serving.py中的 http_client_test()函数请求http服务来执行推理。

HTTP API流程详解

本章节主要结合前文的Demo示例来对API进行介绍方便开发者学习并将运行库嵌入到开发者的程序当中更详细的API请参考对应的Python文件。http服务包含服务端和客户端Demo中提供了不使用图片base格式的方式一:浏览器请求的方式,其他几种方式开发者根据个人需要,选择开发。

1. 开启http服务

http服务的启动使用demo_serving.py文件

class Serving(object):
    """        SDK local serving    """

    def __init__(self, model_dir, license='', model_filename='model', params_filename='params'):

        self.program = None
        self.model_dir = model_dir
        self.model_filename = model_filename
        self.params_filename = params_filename
        self.program_lock = threading.Lock()
        self.license_key = license
        # 只有ObjectTracking会初始化video_processor
        self.video_processor = None

     def run(self, host, port, device, engine=Engine.PADDLE_FLUID, service_id=0, device_id=0, **kwargs):
      """          Args:              host : str              port : str              device : BaiduAI.EasyEdge.Device比如Device.CPU              engine : BaiduAI.EasyEdge.Engine 比如: Engine.PADDLE_FLUID      """
        self.run_serving_with_flask(host, port, device, engine, service_id, device_id, **kwargs)

2. 请求http服务

开发者可以打开浏览器,http://{设备ip}:24401,选择图片来进行测试。

2.1 http 请求方式:不使用图片base64格式

URL中的get参数

参数 说明 默认值
threshold 阈值过滤, 0~1 如不提供,则会使用模型的推荐阈值

HTTP POST Body即为图片的二进制内容。

Python请求示例

import requests

with open('./1.jpg', 'rb') as f:
    img = f.read()
    result = requests.post(
        'http://127.0.0.1:24401/',
        params={'threshold': 0.1},
        data=img).json()

3. http 返回数据

字段 类型说明 其他
error_code Number 0为成功,非0参考message获得具体错误信息
results Array 内容为具体的识别结果。其中字段的具体含义请参考预测图像-返回格式一节
cost_ms Number 预测耗时ms不含网络交互时间

返回示例

{
    "cost_ms": 52,
    "error_code": 0,
    "results": [
        {
            "confidence": 0.94482421875,
            "index": 1,
            "label": "IronMan",
            "x1": 0.059185408055782318,
            "x2": 0.18795496225357056,
            "y1": 0.14762254059314728,
            "y2": 0.52510076761245728,
            "mask": "...",  // 图像分割模型字段
            "trackId": 0,  // 目标追踪模型字段
        },

      ]
}

关于矩形坐标

x1 * 图片宽度 = 检测框的左上角的横坐标

y1 * 图片高度 = 检测框的左上角的纵坐标

x2 * 图片宽度 = 检测框的右下角的横坐标

y2 * 图片高度 = 检测框的右下角的纵坐标

关于分割模型

其中mask为分割模型的游程编码解析方式可参考 demo

FAQ

  1. 执行infer_demo文件时提示your generated code is out of date and must be regenerated with protoc >= 3.19.0

进入当前项目首先卸载protobuf

python3 -m pip uninstall protobuf

安装低版本protobuf

python3 -m pip install protobuf==3.19.0