zoukankan      html  css  js  c++  java
  • 使用Microsoft R Server进行机器学习和模型发布(3)

    本文中用到的所有demo我都已经发布到了Github,需要的同学可以自行下载:

    https://github.com/kingliantop/azurelabs/tree/master/RServerDemo

    一般来讲数据科学家会在本地或者开发服务器开发机器学习模型,然后需要把它通过某种方式发布出去,以便于开发人员能够使用。微软的mrsdeploy package提供了一套方便的工具帮助用户建立远程连接,将R语言发布为RESTful Web Service,本文简单介绍如何实现。

    发布R机器学习模型为Web Service

    1.在RStudio中打开测试例子文件carservice.R,这个实力模型是根据一辆车的马力和重量来预测手动变速器的大小,首先我们加载mrsdeploy,构建学习模型:

    # If on R Server 9.0, load mrsdeploy package now

    library(mrsdeploy)

    # Create glm model with `mtcars` dataset

    carsModel <- glm(formula = am ~ hp + wt, data = mtcars, family = binomial)

    # Produce a prediction function that can use the model

    manualTransmission <- function(hp, wt) {

    newdata <- data.frame(hp = hp, wt = wt)

    predict(carsModel, newdata, type = "response")

    }

    # test function locally by printing results

    print(manualTransmission(120, 2.8)) # 0.6418125

    2. 登录到远端Microsoft R Server,准备模型发布:

    # Use `remoteLogin` to authenticate with R Server using

    # the local admin account. Use session = false so no

    # remote R session started

    remoteLogin("http://42.159.238.196:12800",

    username = "admin",

    password = "YOURPASS!",

    session = FALSE)

    3.发布模型为Restful Web Service,发布的时候需要指定输入参数,输出参数,服务名称,模型以及版本:

    serviceName <- paste0("mtService", round(as.numeric(Sys.time()), 0))

    # Publish as service using `publishService()` function from

    # `mrsdeploy` package. Name service "mtService" and provide

    # unique version number. Assign service to the variable `api`

    api <- publishService(

    serviceName,

    code = manualTransmission,

    model = carsModel,

    inputs = list(hp = "numeric", wt = "numeric"),

    outputs = list(answer = "numeric"),

    v = "v1.0.0"

    )

    4. 如果上述语句执行没有问题,那么恭喜你,你的模型就算发布成功了,如果你想了解你所发布的模型的详情,可以使用如下语句显示,可以看到服务地址,:
    
        print(api$capabilities())
    

    5. 那么我们用R语言作为客户端,来调用一下我们发布的web service,看看是否正常工作,使用R语言调用web service非常简单,可以看到结果和我们预期的一致:

    应用程序调用R模型服务接口

    R语言的服务模型发布完之后,就需要让开发人员使用机器学习模型。应用的开发语言可能是多种多样的,比如python,Java,C#,nodeJS等等,因为在上面发布的模型是RESTFul web service的,你当然可以用各种语言直接写REST call来处理,但你要处理认证,输入,输出等问题,相对来讲比较繁琐,如果有SDK就好了:)是的,但问题是怎么快速的产生各个语言的SDK呢?总不能每个机器学习模型做一套吧?

    Microsoft R使用的是业界通用的Swagger文件来提供对外标准接口定义,Swagger是遵循OpenAPI规范的一个RESTFul API管理工具,语言无关,通过Swagger文件可以快速的生成各个语言的SDK,Swagger的详细介绍请参考:

    http://swagger.io/

    1. 首先回到RStudio中获取Swagger文件:
    > swagger <- api$swagger()
    
    > cat(swagger, file = "d:\swagger.json", append = FALSE)

    上述操作默认将swagger文件保存在D盘下,你可打开看看文件内容,定义了可以执行的各个操作。

    2. 通过Swagger文件来生成各个语言的SDK的工具非常多,例如Azure的Autorest(https://github.com/Azure/autorest),swagger-codegen(https://github.com/swagger-api/swagger-codegen),本例中我们使用Autorest来生成Python的SDK接口。

    3. 安装Autorest,首先需要安装NodeJS,然后使用NPM安装:

    npm install -g autorest

     

    4. 安装完成后,可以使用autorest --help来看看使用帮助:

     

    5. 我们使用Autorest工具,通过swagger.json文件,来生成python的SDK:

     

    6. 进入到生成代码的目录,可以看到生成了多个目录,有我们熟悉的setup.py:

    7. 运行setup.py进行安装,会将相应的python包安装到系统路径:

     

    8. 剩下的事情就比较简单了,作为开发人员,写个代码,使用SDK简单的几行代码就可以实现调用,你也可以实现批量调用处理:

    login = models.LoginRequest("admin","YOURPASSWORD!")

    mtp = mt.MtService1495184382("http://42.159.115.154:12800")

    token=mtp.login(login)

    print(token)

    input = models.InputParameters(120,2.8)

    headers=default_headers()

    headers['Authorization'] = "{} {}".format(token.token_type, token.access_token)

    result = mtp.manual_transmission(input,headers)

    print(result.output_parameters)

    前面是测试打印的token,得到预期的输出结果0.641812:

    从本系列描述可以看到,通过使用Microsoft R Client和Server,可以快速的实现机器学习模型的构建,测试,可视化,发布以及使用,也可以进行大规模部署,将在后续文章中介绍。

  • 相关阅读:
    Linux 进程退出后自动启动
    Python UDP broadcast PermissionError: [Errno 13] Permission denied
    C# 获取MAC地址
    C# 多线程
    C# UdpClient 设置超时时间
    C# 控件聚焦
    C# 添加图片资源
    C# Listview 第一列不能居中
    Ubuntu 14.04 AM335x TI-RTOS 编译
    为AM335x移植Linux内核主线代码
  • 原文地址:https://www.cnblogs.com/cloudapps/p/6951169.html
Copyright © 2011-2022 走看看