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

    模型部署与在线体验

    目录

    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

    上一篇
    图形化任务
    下一篇
    数据集