AI达人创造营|第六课:基于Hub Serving的微信小程序模型部署
收藏
基于Hub Serving的微信小程序模型部署
Hub模型转换 服务部署
小程序开发
简介:什么是PaddleHub
飞桨生态下的预训练模型管理工具 通过PaddleHub便捷地获取飞桨生态下的预训练模型,结合Fine-tune API 快速完成迁移学习到应用部署的全流程工作
特点:快速推理:基于“模型即软件”的设计理念,通过Python API或命令行实现快速预测 迁移学习:结合Fine-tune,在短时间内完成模型训练 一键部署:简单命令搭建自己的模型的API服务
Hub模型转换
大前提:① PaddlePaddle 2.x 训练、预测代码 ② .pdparams参数字典 转换基于原始代码
小前提:读懂代码
Hub预训练模型
导库 装饰器,可以轻松添加命令行预测、服务部署功能 把二进制图片转换成 Image.open 可以读取的格式 解析命令行参数import paddlehub as hub from paddlehub.module.module import moduleinfo, runnable, serving from io import BytesIO import argparse import json@moduleinfo( name="mnist_predict", version="1.0.0", summary="This is a PaddleHub Module. Just for test.", author="7hinc", author_email="", type="cv/my_mnist",
定义类 我们原先的网络可能基于一个类去定义,并且该类继承 paddle.nn.Layer 。在模型转换的时候,我们需要 新建 一个类,把原来的网络放到全局去实例化,然后在需要的时候从新建的类中调用。 这个类用来实现Hub的预测功能,包括Python调用、命令行调用和服务部署。 其中命令行调用和服务部署需要添加对应的装饰器 class MnistPredict: def __init__(self): self.parser = argparse.ArgumentParser( description="Run the mnist_predict module.", prog='hub run mnist_predict', usage='%(prog)s’, add_help=True) self.parser.add_argument( '--input_img’, type=str, default=None, help="img to predict") def mnist_predict(self, img_path): print('forward’) model.eval() tensor_img = load_image(img_path) paddle.disable_static() result = model(paddle.to_tensor(tensor_img)) return result.numpy().astype('int32')
装饰器 如果希望Module可以支持命令行调用,则需要提供一个经过runnable修饰的接口,接口负责解析传入数据并进行预测,将结果返回。如果不需要提供命令行预测功能,则可以不实现该接口,PaddleHub在用命令行执行时,会自动发现该Module不支持命令行方式,并给出提示。 @runnable def runnable(self, argvs): print('runnable’) args = self.parser.parse_args(argvs) return self.mnist_predict(args.input_img) @serving def serving(self, img_b64): print('serving') model.eval() img_b = base64.b64decode(img_b64) tensor_img = load_image(BytesIO(img_b)) paddle.disable_static() result = model(paddle.to_tensor(tensor_img)) # 应该返回JSON格式数据 # 从numpy读出的数据格式是 numpy.int32 res = { 'res': int(result.numpy().astype('int32')[0][0]) } return json.dumps(res)
Hub模型安装
使用PaddleHub现成的模型进行测试
1. 挑模型 https://www.paddlepaddle.org.cn/hublist
2. 创建 conda 环境,安装 PaddleHub 在模型页面中有相关参数介绍和预测代码示例,可以作为参考 $ pip install paddlehub paddlepaddle $ hub install senta_bilstm
3.开启模型服务 配置好服务端,在客户端通过POST请求获取预测结果 如何让别的电脑访问呢?# predict.py import requests import json text = [“Paddle开发者各个都是人才,说话又好听,我超喜欢这里的"] data = {"texts": text, "batch_size": 1} url = “127.0.0.1/predict/senta_bilstm" headers = {"Content-Type": "application/json"} r = requests.post(url=url, headers=headers, data=json.dumps(data)) print(json.dumps(r.json(), indent=4, ensure_ascii=False)
服务部署
内网穿透–端口映射 把在公网的地址转翻译成私有地址,采用路由方式的ADSL宽带路由器拥有一个动态或固定的公网IP。
通过新地址就可以用外网访问服务啦!
小程序开发
1. 样式 主要是针对表单的提交。有两种请求接口的方法,一个是利用ajax实现POST请求,一种是表单。ajax可能会遇到跨域问题,解决起来比较麻烦,表单只需要在提交的时候触发事件。
2. 逻辑 在表单提交中绑定方法,在JS中实现逻辑功能。这里需要格外注意数据格式,一个是texts应为列表而非字符串,一个是batch_size应该是数值而非字符串。 JS中的{}已经是JSON格式,不转换也行
Debug日记
0
收藏
请登录后评论