\u200E
如何在飞桨 x 昆仑芯上部署PP-OCR模型 | 洞见AI硬件
发布日期:2021-12-24T11:58:00.000+0000 浏览量:1709次

部署"桨"坛栏目聚焦AI硬件部署,分享多款厂商硬件部署方案及教程,帮助开发者们实现模型训练与推理的一体化开发和多硬件设备间的无缝切换。


本期让我们将目光聚焦到飞桨与AI芯片公司——昆仑芯的适配合作。昆仑芯在实际业务场景中深耕AI加速领域已十余年,是一家在体系结构、芯片实现、软件系统和场景应用均有深厚积累的AI芯片企业。


自飞桨2.0版本之后,飞桨对昆仑芯一代XPU上的训练和推理已有较完善支持。本文以飞桨文字识别套件PaddleOCR中的PP-OCR模型为例,演示了如何使用昆仑芯AI加速卡进行部署的推理加速,开发者可参考下文中的详细步骤进行体验。




1.软硬件环境准备

  • CPU架构要求:x86、arm。比如:Intel、海光等
  • AI加速卡:昆仑芯一代AI加速卡 - K200
  • 操作系统要求:centos、ubuntu、kylin
  • 驱动要求:昆仑芯驱动3.8版本以上
  • Docker(建议版本):docker18.09



2.解决方案技术栈


本解决方案从上层到下层包含以下核心模块:
  • 飞桨文字识别套件PaddleOCR
  • 飞桨深度学习框架;飞桨服务化部署框架Paddle Serving
  • 基础环境与昆仑SDK环境
  • 系统层与底层硬件,其中包括昆仑芯K200 AI加速卡,一张K200包含两个计算单元





3.目前支持的开源模型


飞桨自2.0版本起支持在昆仑XPU上运行,经验证的训练和预测的模型支持情况包括:图像分类、目标检测、图像分割、NLP、推荐、强化学习、OCR等领域的模型。详细的模型支持情况可以参考官网“飞桨对昆仑XPU芯片的支持”一文。地址:

https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/09_hardware_support/xpu_docs/paddle_2.0_xpu_cn.html




4.部署步骤


  • 环境准备
(1)首先需要确保昆仑卡插卡能识别: 插卡后,执行如下命令检查是否有输出。
1.    # 检查pci插卡正常
2.    lspci -vvd 1d22:

如果插卡正常,输出类似下图所示:


如果没有输出,说明没有找到卡,可能pcie链路有问题。建议换插槽、重启机器,反复尝试,直到lspci有输出。


(2) 确保runtime和驱动安装正常: 因驱动需要跟客户目标机器内核版本完全对应,可以先通过如下命令检查内核版本,并把内核版本信息同步给昆仑芯接口人以便提供对应的runtime和驱动。
1.    # 查看内核版本信息
2.    uname -a

输出类似下图所示:

接着输入以下命令,检查芯片信息和以及状态是否正常:

1.    # 检查芯片信息和状态正常
2.    wget https://baidu-kunlun-public.su.bcebos.com/runtime_release_x86/xpu_smi
3.    sudo chmod +x xpu_smi
4.    ./xpu_smi


如果驱动安装正常,输出类似下图所示:


上图显示,这台机器上有两个计算单元(pd),分别是/dev/xpu0和/dev/xpu1(K200有两个计算单元,K100有一个计算单元)。部分字段意义:



  • 下载部署包及安装
(1) 安装准备:建议切换成root用户,在下载之前创建一个文件夹,比如workspace:
1.    # 切换root
2.    sudo su
3.    mkdir workspace
4.    cd workspace

(2)下载PP-OCR推理部署包:

a.下载包含飞桨轻量化推理引擎Paddle Lite 与 PP-OCR 模型的本地部署包:

注:该版本只支持使用一个计算单元。

1.    wget https://baidu-kunlun-public.su.bcebos.com/haiguangx86/ocr_infer_paddle2.1_lite_xpu.tar
2.    tar -xvf ocr_infer_paddle2.1_lite_xpu.tar


b.下载包含飞桨服务化部署框架Paddle Serving 与 PP-OCR 模型的服务化部署包:
https://baidu-kunlun-public.su.bcebos.com/haiguangx86/ocr_infer_paddle2.2_lite_multi_xpu_serving.tar
注:该版本只支持使用一个计算单元。
1.    wget https://baidu-kunlun-public.su.bcebos.com/haiguangx86/ocr_infer_paddle2.2_lite_multi_xpu_serving.tar
2.    tar -xvf ocr_infer_paddle2.2_lite_multi_xpu_serving.tar


(3) 下载docker镜像并导入docker(docker镜像配置为:ubuntu16.04、glibc 2.23):

a.检查docker环境是否正常安装:执行命令

1.    docker images

如果正常则会输出类似如下图信息:


执行命令:
1.    docker ps -a

会输出类似如下图信息:


b.进入容器
1.    docker start ppocr
2.    docker exec -it ppocr bash

(4)飞桨推理环境配置:根据所选择的部署方式对应的安装包,分别进入workspace目录下对应的解压目录如ocr_infer_paddle2.1_lite_xpu或ocr_infer_paddle2.2_lite_multi_xpu_serving。


  • 基于昆仑XPU + Paddle Lite的PP-OCR推理
(1) 进入PaddleOCR目录
1.    cd PaddleOCR

(2)执行推理
1.    # 执行推理。命令较长,复制粘贴请注意无效空格
2.    python3.7 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer/"  --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False --rec_batch_num=1


如果执行成功,会输出如下类似信息:

  • 基于昆仑XPU + Paddle Serving的PP-OCR服务化部署
(1) 启动serving server:首先进入ocr_infer_paddle2.2_lite_multi_xpu_serving/PaddleOCR目录,执行
1.    cd deploy/pdserving/
2.    bash start.sh

(2) 查看serving 进程:
1.    bash ps.sh

serving 正常启动,会看到如下进程信息:

(3) 发送客户端http请求:发送http请求
1.    bash send.sh

HTTP Client发送请求的具体代码可参考脚本“pipeline_http_client.py”中内容:
import numpy as np
import requests
import json
import base64
import os
def cv2_to_base64(image):
    return base64.b64encode(image).decode('utf8')
url = "http://127.0.0.1:9998/ocr/prediction"
test_img_dir = "../../doc/test_detect_3/"
for idx, img_file in enumerate(os.listdir(test_img_dir)):
    with open(os.path.join(test_img_dir, img_file), 'rb'as file:
        image_data1 = file.read()
    image = cv2_to_base64(image_data1)
    for i in range(1):
        data = {"key": ["image"], "value": [image]}
        r = requests.post(url=url, data=json.dumps(data))
        print(r.json())
#test_img_dir = "../../doc/imgs/"
print("==> total number of test imgs: ", len(os.listdir(test_img_dir)))

RPC Client发送请求的具体代码可参考脚本“pipeline_rpc_client.py”中内容:
try:
    from paddle_serving_server_gpu.pipeline import PipelineClient
except ImportError:
    from paddle_serving_server.pipeline import PipelineClient
import numpy as np
import requests
import json
import cv2
import base64
import os
client = PipelineClient()
client.connect(['127.0.0.1:18091'])
def cv2_to_base64(image):
    return base64.b64encode(image).decode('utf8')
test_img_dir = "imgs/"
for img_file in os.listdir(test_img_dir):
    with open(os.path.join(test_img_dir, img_file), 'rb'as file:
        image_data = file.read()
    image = cv2_to_base64(image_data)
for i in range(1):
    ret = client.predict(feed_dict={"image": image}, fetch=["res"])
    print(ret)

若执行正常终端输出识别结果如下:

(4)关闭serving server:

1.    cd PaddleOCR/deploy/pdserving/
2.    bash kill.sh
3.    bash ps.sh


关闭成功如下图所示:

至此,飞桨PP-OCR模型已经可以在昆仑芯AI加速卡K200上运行。开发者也可以根据自己的应用需求,训练模型进行部署。



昆仑芯AI加速卡

K200介绍



采用昆仑芯1代芯片,256 TOPS@INT8 算力,HBM 16GB 高速显存,512GB/s 访存带宽可广泛支持自然语言处理、计算机视觉、语音以及传统机器学习等各类人工智能任务万片级别规模落地,并经过了互联网核心算法对稳定性、可用性、可靠性和鲁棒性的考验,业界领先。下图是K200参数介绍。


图:参数来源来自昆仑芯官网介绍:

http://www.kunlunxin.com.cn/k200-100


关注公众号,获取更多技术内容~