在AI Studio上部署外部可以直接调用的云端服务
简 介: 按照 百度上的快速部署的两个平台:EasyDL以及AI Studio体验馆 的例子,对于在云端部署可以直接调用的服务进行了测试。但最后没有能够测试成功。后面还需要通过具体的例子来测试完整进行AI Studio云端服务的功能。
关键词
: Paddle,云端服务
Contents
§01 部署应用
对于一个训练好的模型,直接部署在云端可以减少对于局部运算资源的需求。这在一些局域网络通讯条件良好的情况下是快速验证和系统搭建的方式。
在 百度上的快速部署的两个平台:EasyDL以及AI Studio体验馆 中按照说明初步测试了 Ai Studio 中的趣味体验馆的搭建过程,不过最终测试结果并没有完成通过。下面计划使用一个更加简单的模型进行搭建,熟悉网络部署的过程。
1.1 简单模型
这个简单模型是使用单层的BP网络来实现 2021年人工神经网络第三题:函数逼近
▲ 图1.1.1 二维函数的3D图像
1.1.1 样本
▲ 图1.1.2 二维函数图像模型
from headm import * # =
from mpl_toolkits.mplot3d import Axes3Ddef fxy(x,y):return 3*(1-x)**2*exp(-(x**2+(y+1)**2))+\10*(x/5-x**3-y**5)*exp(-(x**2+y**2))-\exp(-((x+1)**2+y**2))/3grid_num = 100
x = linspace(-4,4,grid_num)
y = linspace(-4,4,grid_num)
x,y = meshgrid(x,y)xx = x.flatten()
yy = y.flatten()ff = fxy(xx,yy).reshape(x.shape)ax = Axes3D(plt.figure(figsize=(12,8)))
ax.plot_surface(x,y,ff,rstride=1,cstride=1,cmap=plt.cm.Blues)
plt.show()
▲ 图1.1.3 二维函数图像模型
1.2 建立BP网络
1.2.1 建立数据加载对象
(1)数据加载代码
def fxy(x,y):return 3*(1-x)**2*exp(-(x**2+(y+1)**2))+\10*(x/5-x**3-y**5)*exp(-(x**2+y**2))-\exp(-((x+1)**2+y**2))/3grid_num = 100
x = linspace(-4,4,grid_num)
y = linspace(-4,4,grid_num)
x,y = meshgrid(x,y)xx = x.flatten()
yy = y.flatten()ff = fxy(xx,yy)
xy = array(list(zip(xx,yy)))print(shape(ff), shape(xy))class Dataset(paddle.io.Dataset):def __init__(self, num_samples):super(Dataset, self).__init__()self.num_samples = num_samplesdef __getitem__(self, index):data = xy[index]label = ff[index]return paddle.to_tensor(data,dtype='float32'), paddle.to_tensor(label,dtype='float32')def __len__(self):return self.num_samples_dataset = Dataset(len(ff))
train_loader = paddle.io.DataLoader(_dataset, batch_size=1000, shuffle=True)
(2)测试数据加载代码
data = train_loader().next()
print("data: {}".format(data))
data: [Tensor(shape=[10, 2], dtype=float32, place=CPUPlace, stop_gradient=True,[[ 0.52525252, -3.19191909],[-1.57575762, 1.73737371],[ 3.27272725, -1.73737371],[ 4. , 2.78787875],[ 2.14141417, -2.38383842],[-3.35353541, 2.94949484],[ 0.68686867, -0.52525252],[ 1.73737371, -2.70707059],[ 2.30303025, -2.14141417],[ 3.83838391, -0.28282827]]), Tensor(shape=[10, 1], dtype=float32, place=CPUPlace, stop_gradient=True,[[ 0.09874938],[-0.50992441],[-0.00000177],[-0.00000011],[ 0.02933590],[-0.00000427],[-0.56279999],[ 0.04941760],[ 0.02375283],[-0.00019992]])]
1.2.2 构建网络
class bpnn(paddle.nn.Layer):def __init__(self, ):super(bpnn, self).__init__()self.L1 = paddle.nn.Linear(in_features=2, out_features=120)self.L2 = paddle.nn.Linear(in_features=120, out_features=1)def forward(self, x):x = self.L1(x)x = paddle.nn.functional.sigmoid(x)x = self.L2(x)return xmodel = bpnn()
---------------------------------------------------------------------------Layer (type) Input Shape Output Shape Param #
===========================================================================Linear-1 [[1000, 2]] [1000, 120] 360 Linear-2 [[1000, 120]] [1000, 1] 121
===========================================================================
Total params: 481
Trainable params: 481
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.01
Forward/backward pass size (MB): 0.92
Params size (MB): 0.00
Estimated Total Size (MB): 0.93
---------------------------------------------------------------------------
1.2.3 训练网络
optimizer = paddle.optimizer.Adam(learning_rate=0.1, parameters=model.parameters())def train(model):model.train()epochs = 50for epoch in range(epochs):for batch, data in enumerate(train_loader()):out = model(data[0])loss = paddle.nn.functional.square_error_cost(out, data[1])acc = fluid.layers.mean(loss)loss.backward()optimizer.step()optimizer.clear_grad()print('Epoch:{}, Accuracys:{}'.format(epoch, acc.numpy()))train(model)
paddle.summary(model, (1000,2))
paddle.save(model.state_dict(), './work/model.pdparams')
1.2.4 验证网络
(1)读取网络参数
class bpnn(paddle.nn.Layer):def __init__(self, ):super(bpnn, self).__init__()self.L1 = paddle.nn.Linear(in_features=2, out_features=120)self.L2 = paddle.nn.Linear(in_features=120, out_features=1)def forward(self, x):x = self.L1(x)x = paddle.nn.functional.sigmoid(x)x = self.L2(x)return xamodel = bpnn()model.set_state_dict(paddle.load('./work/model.pdparams'))
out = model(paddle.to_tensor(xy, dtype=float32)).numpy()
(2)计算网络预测误差
outdif = out.flatten() - ff
print(shape(outdif), shape(out), shape(ff))errff = outdif.reshape(x.shape)ax = Axes3D(plt.figure(figsize=(12,8)))
ax.plot_surface(x,y,errff,rstride=1,cstride=1,cmap=plt.cm.Blues)
plt.show()
▲ 图1.2.1 原始数据,恢复数据以及数据误差
1.3 部署应用
参考Paddle相关的资料: 模型保存与载入
根据 百度上的快速部署的两个平台:EasyDL以及AI Studio体验馆 介绍的 模型部署流程 中的内容,需要将模型转换成静态模型。
1.3.1 转换模型
在 PaddlePaddle文档:动态图转静态图 给出了动态图转换成静态图的方法。
(1)什么是动态图和静态图
在深度学习模型构建上,飞桨框架支持动态图编程和静态图编程两种方式,其代码编写和执行方式均存在差异。
动态图编程: 采用 Python 的编程风格,解析式地执行每一行网络代码,并同时返回计算结果。在 模型开发 章节中,介绍的都是动态图编程方式。
静态图编程: 采用先编译后执行的方式。需先在代码中预定义完整的神经网络结构,飞桨框架会将神经网络描述为 Program 的数据结构,并对 Program 进行编译优化,再调用执行器获得计算结果。
动态图编程体验更佳、更易调试,但是因为采用 Python 实时执行的方式,开销较大,在性能方面与 C++ 有一定差距;静态图调试难度大,但是将前端 Python 编写的神经网络预定义为 Program描述,转到 C++ 端重新解析执行,脱离了 Python 依赖,往往执行性能更佳,并且预先拥有完整网络结构也更利于全局优化。
(2)什么情况下将动态图转换成静态图?
飞桨框架在设计时,考虑同时兼顾动态图的高易用性和静态图的高性能优势,采用『动静统一』的方案:
在模型开发时,推荐采用动态图编程。 可获得更好的编程体验、更易用的接口、更友好的调试交互机制。
在模型训练或者推理部署时,只需添加一行装饰器 @to_static,即可将动态图代码转写为静态图代码,并在底层自动使用静态图执行器运行。 可获得更好的模型运行性能。
方案如下图所示:
▲ 图1.3.1 飞桨框架动静统一方案
▲ 图1.3.2 动静转换模式
(3)转换举例
Ⅰ.利用@to_static装饰forward函数
import paddle
from paddle.jit import to_staticclass SimpleNet(paddle.nn.Layer):def __init__(self):super(SimpleNet, self).__init__()self.linear = paddle.nn.Linear(10, 3)@to_static # 动静转换def forward(self, x, y):out = self.linear(x)out = out + yreturn outnet = SimpleNet()
net.eval()
x = paddle.rand([2, 10])
y = paddle.rand([2, 3])
out = net(x, y)
paddle.jit.save(net, './net')
Ⅱ.
import paddle
from paddle.jit import to_staticclass SimpleNet(paddle.nn.Layer):def __init__(self):super(SimpleNet, self).__init__()self.linear = paddle.nn.Linear(10, 3)def forward(self, x, y):out = self.linear(x)out = out + yreturn outnet = SimpleNet()
net.eval()
net = paddle.jit.to_static(net) # 动静转换
x = paddle.rand([2, 10])
y = paddle.rand([2, 3])
out = net(x, y)
paddle.jit.save(net, './net')
注意, 在paddle.jit.save() 直接需要通过 net.eval(),以及后面的out=net(x,y)能够进行input_spec。否则就会出错。
(4)将bpnn转换成静态图
import paddle
from paddle.jit import to_staticclass bpnn(paddle.nn.Layer):def __init__(self, ):super(bpnn, self).__init__()self.L1 = paddle.nn.Linear(in_features=2, out_features=120)self.L2 = paddle.nn.Linear(in_features=120, out_features=1)def forward(self, x):x = self.L1(x)x = paddle.nn.functional.sigmoid(x)x = self.L2(x)return xmodel = bpnn()model.set_state_dict(paddle.load('./work/model.pdparams'))
model = paddle.jit.to_static(model)out = model(paddle.rand([2,2]))
print("out: {}".format(out))paddle.jit.save(model, '/home/aistudio/work/net')
1.3.2 部署过程
在具体按照 百度上的快速部署的两个平台:EasyDL以及AI Studio体验馆 不说AI Studio体验馆的过程中,发现仍然出现了测试错误。
※ 总 结 ※
按照 百度上的快速部署的两个平台:EasyDL以及AI Studio体验馆 的例子,对于在云端部署可以直接调用的服务进行了测试。但最后没有能够测试成功。后面还需要通过具体的例子来测试完整进行AI Studio云端服务的功能。
■ 相关文献链接:
- 百度上的快速部署的两个平台:EasyDL以及AI Studio体验馆
- 2021年人工神经网络第一次作业要求
- 模型保存与载入
- 百度上的快速部署的两个平台:EasyDL以及AI Studio体验馆
- PaddlePaddle文档:动态图转静态图
● 相关图表链接:
- 图1.1.1 二维函数的3D图像
- 图1.1.2 二维函数图像模型
- 图1.1.3 二维函数图像模型
- 图1.2.1 原始数据,恢复数据以及数据误差
- 图1.3.1 飞桨框架动静统一方案
- 图1.3.2 动静转换模式
在AI Studio上部署外部可以直接调用的云端服务相关推荐
- 基于百度地图API在AI Studio上的卫星地图块图像处理与分类
基于百度地图API在AI Stduio上的瓦片地图块图像处理与分类 项目介绍 本项目基于百度地图API获取了不同的瓦片地图并进行合并等处理,可用于遥感和抽象地图的地图块的图像分类.分割.检测等数据的制 ...
- ruoyi(若依)微服务在多服务器上部署,feign远程调用不通的问题
情况: 分别将多个模块部署到不同的服务器上 出现不同模块之间调用不通 环境:阿里云服务器 框架:RuoYi-Cloud 容器引擎:Docker 前置条件 (这里默认已经完成打包,部署) 需要在阿里服务 ...
- 百度Ai studio上运行pytorch和tensorflow(转载)
转载 链接:https://www.zhihu.com/question/336485090/answer/1017905011 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- [文章存档]Azure上部署的java app在向第三方服务传送中文时出现乱码
https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-java ...
- 【AI达人创造营三期】在地平线X3上部署车牌识别系统
[AI达人创造营三期]在地平线X3上部署车牌识别系统 一. 项目介绍 本项目属于AI达人创造营三期项目,主要探索如何将PaddleOCR训练的车牌识别模型部署在地平线X3的板子上,并实现实时推理. 二 ...
- 百度AI Studio飞桨平台 “深度学习”结课总结
结课总结 2020.4.1-2020.4.8期间参加了百度AI Studio的"深度学习7日入门-CV疫情特辑"课程,这是今年自新冠疫情以来参加的第一次线上课程,偶尔通过paddl ...
- 如何将PaddleDetection模型在树莓派4B上部署?
[飞桨开发者说]侯继旭,海南师范大学本三自动化专业在读,人工智能开发爱好者,曾获2019中国高校计算机大赛-人工智能创意赛海南省一等奖.2019年度海南省高等学校科学研究"人工智能" ...
- 在AI Studio创建课程 : 2021 ANN课程
简 介: 在AI Studio建立ANN课程班级以及管理学生加入非常简单.本文记录了该建立过程,可以方便之后进行操作. 关键词: AI--Studio,ANN,2021 #mermaid-svg-r2 ...
- 【个人总结】基于项目的AI Studio平台下Linux深度学习环境配置心得
更新一下:现在AI Studio应该已经不能用其他深度学习框架了,用一会儿就会中断 前言 PS:本部分主要是对本周工作的总结,标题对应的内容可以跳过本部分 上周主要的工作是研究了一下项目utils文件 ...
最新文章
- opencv-python(PIL)图像处理之训练模型前的几种图预处理
- 三 volatile关键字
- Abiword对话框资源
- 深入解读EOS源代码之——区块链内核
- win7焦点总是不停丢失的解决方法
- [转载] python--isalnum()函数
- Win10系统 如何查看win10版本类型及版本号
- mysql date_default_timezone_set,date_default_timezone_set
- linux 更换 镜像源
- Excel技能培训之十五 函数使用rank,Frequency,subtotal超级表,切片器,iferor,常用错误代码
- IT运营新世界大会:广通软件开启双态运维大时代
- Android使用zxing实现二维码扫描
- SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
- 用project做项目计划之 项目成本、预算、基线工期、基线成本、基线时间
- Mac也能玩3A大作?苹果这是要弄游戏本了吗?
- Lumaqq移植到Android-登录篇
- 中国在6G专利上再进一步,申请量占比达五成,遥遥领先,美国的希望落空
- python自动群发_python---自动群发邮件
- Linux-生产中常用命令
- 被西南财经大学辞退的前院长,获得了今年的诺贝尔经济学奖