前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开工的欲望 | AI Studio悄然上线新功能,用你的模型生成在线预测服务

开工的欲望 | AI Studio悄然上线新功能,用你的模型生成在线预测服务

作者头像
用户1386409
发布2019-03-07 11:29:37
9050
发布2019-03-07 11:29:37
举报
文章被收录于专栏:PaddlePaddlePaddlePaddle

开工第一天,小伙伴们是不是还没有从过年的状态转换过来?今天给大家介绍一个AI Studio新功能,能让大家用自己训练好的模型,轻松生成在线预测服务,通过在线API调用,而且是免费的哦~

大家是不是已经跃跃欲试了呢?那就快到AI Studio亲自体验一下吧。希望这个开年小“福利”,能帮助大家尽快找到开工的感觉。

经常登录AI Studio的朋友可能早就发现——AI Studio改版了:

这次升级,AI Studio不光调整了前端页面,还增加了不少新功能,其中就包含我们今天要说的在线部署及预测功能。

功能说明

在线部署与预测为开发者提供训练模型向应用化API转换的功能. 开发者在AI Studio平台通过单机项目NoteBook页面完成模型训练后, 通过创建一个在线服务, 应用模型生成在线API, 使用该API可以直接检验模型效果或实际应用到开发者的私有项目中.目前, 该功能暂时仅对单机项目开放。

通过训练任务生成模型文件

  • 在训练任务过程中, 通过调用paddle.fluid.io.save_inference_model`实现模型的保存,保存后的目录需要可以被在线服务使用. 我们以房价预测的线性回归任务为例, 具体代码如下
import paddleimport paddle.fluid as fluidimport numpyimport mathimport sys
from __future__ import print_functionBATCH_SIZE = 20train_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_programtest_program = main_program.clone(for_test=True)use_cuda = Falseplace = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()exe = fluid.Executor(place)num_epochs = 100# For training test costdef 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 = 0exe_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传输文件, 解压后直接被在线服务使用.

创建一个在线服务

完成模型训练后, 在单机项目页面点击【创建预测服务】

第一步 选择模型文件

  • 勾选模型文件
  • 设置主程序, 主程序为paddle.fluid.io.save_inference_model中参数main_program配置的程序, 在房价预测的示例中,我们使用默认参数调用save_inference_model, 因此将__model__文件设置为主程序.

第二步 确认输入输出

填写模型的输入输出参数. 以房价预测的线性回归模型为例(参数参考), 添加参数如下图所示.

第三步 制作参数转换器

参数转换器帮助用户转化合法输入并完成数据预处理.

  • 方式一:自定义转换器(Python2.7)(推荐).

输入参数转换器方法

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

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

输入参数转换器:

import osimport sys
sys.path.append("..")from PIL import Imageimport numpy as npimport paddle.fluid as fluidfrom home.utility import base64_to_imagedef reader_infer(data_args):
   """
   reader_infer 输入参数转换器方法
   :param data_args: 接口传入的数据,以k-v形式
   :return [[]], feeder
   """
   def reader():
       """
       reader
       :return:
       """
       x = fluid.layers.data(name='x', shape=[13], dtype='float32')       # y = fluid.layers.data(name='y', shape=[1], dtype='float32')
       feeder = fluid.DataFeeder(place=fluid.CPUPlace(), feed_list=[x])
       CRIM = float(data_args["CRIM"])
       ZN = float(data_args["ZN"])
       INDUS =  float(data_args["INDUS"])
       CHAS = float(data_args["CHAS"])
       NOX = float(data_args["NOX"])
       RM = float(data_args["RM"])
       AGE = float(data_args["AGE"])
       DIS = float(data_args["DIS"])
       RAD =  float(data_args["RAD"])
       TAX = float(data_args["TAX"])
       PTRATIO = float(data_args["PTRATIO"])
       B =  float(data_args["B"])
       LSTAT = float(data_args["LSTAT"])       return [[[CRIM, ZN, INDUS, CHAS, NOX, RM, AGE, DIS, RAD, TAX, PTRATIO, B, LSTAT]]], feeder   return reader

输出参数转换器:

def output(results, data_args):
    """
    output 输出参数转换器方法
    :param results 模型预测结果
    :param data_args: 接口传入的数据,以k-v形式
    :return array 需要能被json_encode的数据格式
    """
   lines = []   for dt in results:
       y = dt.tolist()
       lines.append({"predict": y})   return lines
  • 方式二: 默认参数, 不设置转换器. 用户的API参数直接传递给模型.

第四步 沙盒部署

用户可以同时部署之多五个沙盒服务, 用来对比模型优化结果.

录入名称点击【生成沙盒】或者点击【暂存】将沙盒保存到草稿箱.

测试沙盒服务

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

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

第二步 填写json格式请求参数

第三步 点击【发送】检验返回结果

部署在线服务

点击【正式部署】部署线上API.

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

调用在线服务

依据API key、服务地址和用户自定义参数, 实现对服务的调用.

请求方式

  • HTTP请求URL: [服务地址] [?] [apiKey=xxx]
  • HTTP请求方法: POST
  • HTTP Body: 用户自定义参数

调用示例

以房价预测项目为例.

  • CURL
curl -H "Content-Type: application/json" -X POST -d '{"CRIM":0.01887747, "ZN":-0.11363636, "INDUS":0.25525005, "CHAS":-0.06916996,  "NOX":0.29898136, "RM": -0.04476612, "AGE": 0.14340987, "DIS":-0.14797285,  "RAD":0.62828665, "TAX":0.49191383, "PTRATIO":0.18558153, "B":0.05473289, "LSTAT":0.16851371}' "https://aistudio.baidu.com/serving/online/xxx?apiKey=xxxxxxxxxx"
  • Python
import jsonimport tracebackimport urllibimport urllib2

formdata = {    "CRIM":0.01887747, 
    "ZN":-0.11363636, 
    "INDUS":0.25525005, 
    "CHAS":-0.06916996,  
    "NOX":0.29898136, 
    "RM": -0.04476612, 
    "AGE": 0.14340987, 
    "DIS":-0.14797285,  
    "RAD":0.62828665, 
    "TAX":0.49191383, 
    "PTRATIO":0.18558153, 
    "B":0.05473289, 
    "LSTAT":0.16851371}
header = {"Content-Type": "application/json; charset=utf-8"}
url = "https://aistudio.baidu.com/serving/online/xxx?apiKey=a280cf48-6d0c-4baf-bd39xxxxxxcxxxxx"data = json.dumps(formdata)try:
    request = urllib2.Request(url, data, header)
    response = urllib2.urlopen(request)
    response_str = response.read()
    response.close()    print(response_str)
except urllib2.HTTPError as e:    print("The server couldn't fulfill the request")    print(e.code)    print(e.read())
except urllib2.URLError as e:    print("Failed to reach the server")    print(e.reason)
except:
    traceback.print_exc()

以上,就是今天要给大家介绍的,在线部署及预测功能,大家都来试试吧~!

更多说明可见: http://ai.baidu.com/docs#/AIStudio_Project_Forecast/c70c8a94 或点击 阅读原文



本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PaddlePaddle 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 功能说明
  • 通过训练任务生成模型文件
    • 第一步 选择模型文件
      • 第二步 确认输入输出
        • 第三步 制作参数转换器
          • 第四步 沙盒部署
          • 测试沙盒服务
            • 第一步 点击【测试】打开测试页面
              • 第二步 填写json格式请求参数
                • 第三步 点击【发送】检验返回结果
                • 部署在线服务
                • 调用在线服务
                  • 请求方式
                    • 调用示例
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档