模型部署与在线体验
更新时间:2021-09-02
目录
- 功能说明
- 通过训练生成静态图模型文件
- 创建一个趣味体验馆
3.1 第一步 选择模型文件
3.2 第二步 设置模型输入输出
3.3 第三步 制作输入输出转换器
3.4 第四步 生成沙盒 - 部署测试
4.1 第一步 点击【启动】部署沙盒
4.2 第二步 点击【测试】打开测试页面
4.3 第三步 填写参数字段
4.4 第四步 点击【发送请求】获取沙盒测试结果 - 创建在线API服务
- 创建趣味体验馆
- 创建趣味体验馆
7.1 体验馆使用方式
7.2 API请求使用方式
7.3 调用示例
功能说明
模型部署是为开发者提供的将模型向应用化API转化的功能,可生成面向私人的API接口和面向全部用户的趣味体验馆。
开发者在AI Studio平台通过NoteBook项目完成模型训练后,在Notebook详情页通过模型部署完成部署设置,生成在线API,创建趣味体验馆。目前, 该功能暂时仅对Notebook项目开放。
注:目前模型部署时代码部分仅支持 PaddlePaddle1.X API,近期我们将会支持 PaddlePaddle 2.X 的API,敬请期待。
通过训练生成静态图模型文件
- 在训练过程中, 可以通过调用[paddle.jit.to_static]或[paddle.fluid.io.save_inference_model]实现静态图模型文件的保存。
- 我们以Paddle1.8环境下的房价预测线性回归任务为例, 具体代码如下:
import paddle
import paddle.fluid as fluid
import numpy
import math
import sys
BATCH_SIZE = 20
train_reader = paddle.batch(
paddle.reader.shuffle(
paddle.dataset.uci_housing.train(), buf_size=500),
batch_size=BATCH_SIZE)
test_reader = paddle.batch(
paddle.reader.shuffle(
paddle.dataset.uci_housing.test(), buf_size=500),
batch_size=BATCH_SIZE)
params_dirname = "model2"
x = fluid.layers.data(name='x', shape=[13], dtype='float32')
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
y_predict = fluid.layers.fc(input=x, size=1, act=None)
main_program = fluid.default_main_program()
startup_program = fluid.default_startup_program()
cost = fluid.layers.square_error_cost(input=y_predict, label=y)
avg_loss = fluid.layers.mean(cost)
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
sgd_optimizer.minimize(avg_loss)
#clone a test_program
test_program = main_program.clone(for_test=True)
use_cuda = False
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
exe = fluid.Executor(place)
num_epochs = 100
# For training test cost
def train_test(executor, program, reader, feeder, fetch_list):
accumulated = 1 * [0]
count = 0
for data_test in reader():
outs = executor.run(program=program,
feed=feeder.feed(data_test),
fetch_list=fetch_list)
accumulated = [x_c[0] + x_c[1][0] for x_c in zip(accumulated, outs)]
count += 1
return [x_d / count for x_d in accumulated]
params_dirname = "fit_a_line.inference.model"
feeder = fluid.DataFeeder(place=place, feed_list=[x, y])
naive_exe = fluid.Executor(place)
naive_exe.run(startup_program)
step = 0
exe_test = fluid.Executor(place)
# main train loop.
for pass_id in range(num_epochs):
for data_train in train_reader():
avg_loss_value, = exe.run(main_program,
feed=feeder.feed(data_train),
fetch_list=[avg_loss])
if step % 10 == 0: # record a train cost every 10 batches
print (step, avg_loss_value[0])
if step % 100 == 0: # record a test cost every 100 batches
test_metics = train_test(executor=exe_test,
program=test_program,
reader=test_reader,
fetch_list=[avg_loss.name],
feeder=feeder)
print (step, test_metics[0])
# If the accuracy is good enough, we can stop the training.
if test_metics[0] < 10.0:
break
step += 1
if math.isnan(float(avg_loss_value[0])):
sys.exit("got NaN loss, training failed.")
if params_dirname is not None:
# We can save the trained parameters for the inferences later
fluid.io.save_inference_model(params_dirname, ['x'],
[y_predict], exe)
- 使用已有模型, 可以通过
!wget
在Notebook中传输模型文件到环境目录。以房价预测的线性回归模型为例, 通过!wget https://ai.baidu.com/file/4E1D1FCC670E4A5E8441634201658107 -O fit_a_line.inference.model
传输文件, 解压后直接使用.
创建一个趣味体验馆
完成模型训练后, 在Notebook项目页面点击【模型部署】
第一步 选择模型文件
- 勾选模型文件。本模块需要上传静态图模型结构文件和模型参数文件。例如model或xxx.pdmodel为模型结构文件;params或xxx.pdiparams为模型参数文件。
- 模型结构文件需要带有主程序图标,同时主程序图标支持更改。
第二步 设置模型输入输出
- 本模块需要用户定义模型的输入和输出,用于生成图形化的在线体验界面和转化器的参数设置. 以房价预测的线性回归模型为例(参数参考)。
- 由于波士顿房价预测案例的输入包含13个字段,每个字段单独设置较为复杂,因此考虑将13个字段拼接成1个字符串,在转换器中进行分割处理即可。添加参数如下图所示。
第三步 制作输入输出转换器
参数转换器帮助用户转化合法输入并完成数据预处理。目前仅支持fluid.DataFeeder的数据定义方式。
输入参数转换器方法
def reader_infer(data_args):
"""
reader_infer 输入参数转换器方法
:param data_args: 接口传入的数据,以k-v形式
:return [[]], feeder
"""
#构造内容
pass
输出参数转换器方法
def output(results, data_args):
"""
output 输出参数转换器方法
:param results 模型预测结果
:param data_args: 接口传入的数据,以k-v形式
:return array 需要能被json_encode的数据格式
"""
#构造内容
pass
转换器代码示例, 以房价预测为例.
输入参数转换器:
# -*- coding: utf-8 -*-
"""
input hook
@Author 友军的奸细
@Time 2021-08-30 14:00:12
"""
import paddle.fluid as fluid
def reader_infer(data_args):
'''
reader inter
:param data_args: 接口请求参数
:return [[]], feeder
'''
def reader():
# x <type 'string'> default value:''
arg_x = data_args['price'].split(',')
# todo
feed_x = fluid.layers.data(name='x',shape=[13],dtype='float32')
feeder = fluid.DataFeeder(place=fluid.CPUPlace(),feed_list=[feed_x])
return [[arg_x]], feeder
return reader
输出参数转换器:
# -*- coding: utf-8 -*-
def output(results, data_args):
"""
模型评测结果输出转换
:param results
:param data_args 请求参数
:return dict
"""
# todo
return {'y':results.tolist()[0]}
第四步 生成沙盒
用户可以同时部署至多五个沙盒服务, 用来对比模型优化结果. 点击【暂存】可将沙盒保存到草稿箱.
部署测试
对沙盒列表中的沙盒进行部署测试,验证配置是否正确。
第一步 点击【启动】部署沙盒
第二步 点击【测试】打开测试页面
沙盒测试提供两种方式:1.代码 2.可视化
第三步 填写参数字段
- 代码:填写json格式请求参数。
- 可视化:在输入框中填写对应的参数。
以房价预测为例,输入为:0.0137, -0.1136, 0.2553, -0.0692, 0.0582, -0.0727, -0.1583, -0.0584, 0.6283, 0.4919, 0.1856, 0.0795, -0.0332
第四步 点击【发送请求】获取沙盒测试结果
发送请求后,返回沙盒测试结果。测试通过可部署沙盒生成在线 API 服务,反之需要重新编辑部署设置。
创建在线API服务
点击【正式部署】创建在线API服务.
- 一个项目可以创建至多五个沙盒服务, 并选择其中一个沙盒服务部署为线上服务.
- 沙盒服务如果连续超过24小时无调用将自动调整为暂停状态.
- 线上服务如果连续超过14天无调用将自动调整为暂停状态.
创建趣味体验馆
填写体验馆介绍以及参数说明创建趣味体验馆。
使用方式
体验馆使用方式
- 体验馆的使用权限与项目本身相关,若项目为公开项目,趣味体验馆则面向全体用户开发使用。
- 输出可通过【下载输出】打包下载。
API请求使用方式
- HTTP请求URL: [服务地址] [?] [apiKey=xxx]
- HTTP请求方法: POST
- HTTP Body: 用户自定义参数
调用示例
以房价预测项目为例.
- Python
import json
import traceback
import urllib
from urllib import request,error
from urllib.request import urlopen
formdata = {"price":'0.0137, -0.1136, 0.2553, -0.0692, 0.0582, -0.0727, -0.1583, -0.0584, 0.6283, 0.4919, 0.1856, 0.0795, -0.0332'}
header = {"Content-Type": "application/json; charset=utf-8"}
url = "https://aistudio.baidu.com/serving/online/xxx?apiKey=xxxxxxxxxx"
data = bytes(json.dumps(formdata), 'utf8')
try:
request = request.Request(url, data, header)
response=urllib.request.urlopen(request).read().decode("utf-8")
print(response)
except error.HTTPError as e:
print("The server couldn't fulfill the request")
print(e.code)
print(e.read())
except error.URLError as e:
print("Failed to reach the server")
print(e.reason)
except:
traceback.print_exc()