连冠华,云计算资深架构师

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

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

1.在RStudio中打开测试例子文件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工具,通过json文件,来生成python的SDK:

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

7. 运行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,可以快速的实现机器学习模型的构建,测试,可视化,发布以及使用,也可以进行大规模部署,将在后续文章中介绍。

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

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