开放能力
开发平台
行业应用
生态合作
开发与教学
资讯 社区 控制台
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术
AR与VR
数据智能
场景方案
部署方案
行业应用
智能教育
智能医疗
智能零售
智能工业
企业服务
智能政务
信息服务
智能园区

模型部署与在线体验

目录

  1. 功能说明
  2. 通过训练生成静态图模型文件
  3. 创建一个趣味体验馆
    3.1 第一步 选择模型文件
    3.2 第二步 设置模型输入输出
    3.3 第三步 制作输入输出转换器
    3.4 第四步 生成沙盒
  4. 部署测试
    4.1 第一步 点击【启动】部署沙盒
    4.2 第二步 点击【测试】打开测试页面
    4.3 第三步 填写参数字段
    4.4 第四步 点击【发送请求】获取沙盒测试结果
  5. 创建在线API服务
  6. 创建趣味体验馆
  7. 创建趣味体验馆
    7.1 体验馆使用方式
    7.2 API请求使用方式
    7.3 调用示例

功能说明

模型部署是为开发者提供的将模型向应用化API转化的功能,可生成面向私人的API接口和面向全部用户的趣味体验馆。

开发者在AI Studio平台通过NoteBook项目完成模型训练后,在Notebook详情页通过模型部署完成部署设置,生成在线API,创建趣味体验馆。目前, 该功能暂时仅对Notebook项目开放。

注:目前模型部署时代码部分仅支持 PaddlePaddle1.X API,近期我们将会支持 PaddlePaddle 2.X 的API,敬请期待。 image.png

通过训练生成静态图模型文件

  • 在训练过程中, 可以通过调用[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项目页面点击【模型部署】

image.png

第一步 选择模型文件

  • 勾选模型文件。本模块需要上传静态图模型结构文件和模型参数文件。例如model或xxx.pdmodel为模型结构文件;params或xxx.pdiparams为模型参数文件。
  • 模型结构文件需要带有主程序图标,同时主程序图标支持更改。

image.png

第二步 设置模型输入输出

  • 本模块需要用户定义模型的输入和输出,用于生成图形化的在线体验界面和转化器的参数设置. 以房价预测的线性回归模型为例(参数参考)。
  • 由于波士顿房价预测案例的输入包含13个字段,每个字段单独设置较为复杂,因此考虑将13个字段拼接成1个字符串,在转换器中进行分割处理即可。添加参数如下图所示。

image.png

第三步 制作输入输出转换器

参数转换器帮助用户转化合法输入并完成数据预处理。目前仅支持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

image.png

转换器代码示例, 以房价预测为例.

输入参数转换器:

# -*- 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]}

第四步 生成沙盒

用户可以同时部署至多五个沙盒服务, 用来对比模型优化结果. 点击【暂存】可将沙盒保存到草稿箱.

image.png

image.png

部署测试

对沙盒列表中的沙盒进行部署测试,验证配置是否正确。

第一步 点击【启动】部署沙盒

image.png

第二步 点击【测试】打开测试页面

沙盒测试提供两种方式:1.代码 2.可视化

image.png

第三步 填写参数字段

  • 代码:填写json格式请求参数。

image.png

  • 可视化:在输入框中填写对应的参数。

image.png

以房价预测为例,输入为: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 服务,反之需要重新编辑部署设置。

image.png

image.png

image.png

创建在线API服务

点击【正式部署】创建在线API服务.

  • 一个项目可以创建至多五个沙盒服务, 并选择其中一个沙盒服务部署为线上服务.
  • 沙盒服务如果连续超过24小时无调用将自动调整为暂停状态.
  • 线上服务如果连续超过14天无调用将自动调整为暂停状态.

image.png

创建趣味体验馆

填写体验馆介绍以及参数说明创建趣味体验馆。

image.png

image.png

使用方式

体验馆使用方式

  • 体验馆的使用权限与项目本身相关,若项目为公开项目,趣味体验馆则面向全体用户开发使用。
  • 输出可通过【下载输出】打包下载。

image.png

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()

image.png

上一篇
图形化任务
下一篇
Pipeline 使用教程