Press "Enter" to skip to content

如何在 Web 应用里消费 SAP Leonardo 的机器学习 API

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

本文选择使用 SAP Leonardo 里的 一个 Product Image Classification API,即给定一张产品的图片,该 API 能识别出此产品的类别。

 

简要了解一下这个 API 的功能:该 API 模型是由 SAP 基于大约 5 万张 Icecat 图片训练而成,能区分 29 种不同的类别,这些类别具体罗列于官方文档上,比如电脑显示器,数码相机,外部存储设备,键盘,液晶电视,手机充电器,笔记本和其他外设等等。如果我们消费这个 API 时指定的图片代表的产品不属于这 29 种类别之一,API 的表现如何?先卖个关子,文末解答。

 

这里假定我们已经找到了该 API,点击进入明细页面,将 API Key 复制下来,后续的 UI5 应用需要使用到。

 

然后进入 SAP 云平台的 Neo 环境。本文介绍的步骤,使用免费的 SAP Cloud Platform Neo 测试环境即可。

 

在 Service 列表里找到 WebIDE——我们将使用 WebIDE 进行 UI5 应用的开发。

 

大家可以直接在 WebIDE 里 clone 这个 Github 仓库 ,或者把仓库的内容以 zip 包的形式下载到本地,再使用 WebIDE 的本地 Import 功能导入。

 

我们要告诉 UI5 应用这个 API 的 url,因此在 Neo 环境里创建一个 Destination(作用和 ABAP Netweaver 事务码 SM59 里创建的 Destination 相同):

 

属性如上图所示,因为是 Neo 测试环境,所以 url 为对应的 sandbox 环境:

 

https://sandbox.api.sap.com/ml

 

记下这个 Destination 名称 sapui5ml-api, 因为稍后的 UI5 代码里需要使用。

 

记得维护额外的属性 WebIDEnabled 为 true,这样该 Destination 才能在 UI5 应用里被使用。点击 Check Connection 确保看到绿灯。

 

打开 WebIDE 里 UI5 工程里的 settings.json 文件,将您之前从 API console 里拷贝的 API Key 粘贴到此处:

 

在项目根目录下的 neo-app.json 文件里,把类型为 destination 的 target 对象的名称维护成之前在 SAP Cloud Platform Cockpit 里创建的 destination 相同的名称。

 

运行这个 UI5 应用,能看到如下界面:

 

做一些简单的测试:

 

SAP Leonardo 的机器学习 API,识别出这张图片有 74.7%的可能性是一台笔记本电脑,13.8%的可能性是键盘,11.3%的可能性是 Tablets.

 

点击按钮 View JSON,能看到调用 SAP Leonardo API 返回的技术明细。

 

鼠标的图片也成功识别出来了:

 

本文开头提到,Product Image Classification API 只支持 29 种产品类别:

 

如果我们开发应用时需要支持额外的产品类别,就需要自行提供该产品类别的图片来重新训练模型。

 

下面介绍 SAP Leonardo 上机器学习模型的重新训练步骤。

 

假设我们期望重新训练之后,Product Image Classfication 这个模型能够识别出不同种类的花,那幺我们首先得搞到大量花的图片。Tensorflow 的官网上,已经体贴地给想做模型训练的学习者们,提供了一个做练习用的压缩包,里面包含了大量各式花的图片。

 

SAP Leonardo 接受的能用于重新训练模型的数据集,必须符合下图所示的层级结构,即 training, validation 和 test 三个文件夹下面,分别包含以产品类别命名的子文件夹,且数据规模之比为 8:1:1.

 

有了用于训练的数据后,下一步就是把这些数据上传到 SAP Leonardo 的模型在线存储平台上。

 

在 SAP 云平台上创建 Leonardo 机器学习的服务实例,这个实例的 service key 里包含了一个 IMAGE_RETRAIN_API_URL,可以用来获取在线存储的 url:

 

向这个 url 发送一个 HTTP get 请求,得到在线存储的 url:

 

把这个 url 粘贴到浏览器里,输入 postman 里返回的 accessKey 和 secretKey 登录,就能以 web 的方式访问这个在线存储了:

 

下一步是把本地的训练文件上传到这个部署在 AWS 上的在线存储上去。首先用命令行 mc config host 定义一个名为 sapjerrys3 的远程站点,将上一步从 postman 获得的 AWS 在线存储 url,accessKey 和 secret 绑定到这个站点上:

 

然后使用命令行上传文件:

 

mc.exe cp -r C:\Code\MachineLearningStudy\flowersjerry sapjerrys3\data

 

大概十几分钟后,文件上传完毕:

 

此时可以从浏览器里看到 AWS 在线存储上传完毕的训练文件。

 

现在可以提交一个后台作业了,让 Leonardo 去处理这些上传好的文件,ABAP 顾问们可以把这个动作理解成在 Netweaver 事务码 SM36 里定义一个后台作业并提交。发送一个 HTTP post 请求,除了下图 jobName, dataset 和 modelName 需要自己维护外,其他字段都使用 SAP 官网上定义的默认值。

 

这个请求会返回一个后台作业 ID,抄下来后把它拼到 url 末尾,然后重新发送一个 HTTP get 请求,即可查询到这个作业的执行情况。Jerry 重新训练的时候,等待了大概五分钟,作业状态就变为 SUCCEEDED 了。

 

因为本文做的练习都是在 SAP Cloud Platform 的 CloudFoundry 环境中进行的,因此我们也可以用 cf 命令行来查询这些作业的执行情况:

 

cf sapml retraining jobs -m image

 

如果遇到作业状态为 FAILED 的情况,去 AWS 在线存储上查看以作业名称命名的文件夹,里面包含了详细的训练日志,可以用作错误分析:

 

在这个训练好的模型能正式被使用之前,我们还需要对其进行部署,类似 ABAP Netweaver 里的“激活”动作。

 

和提交训练的后台作业类似,模型部署也是一个异步执行的步骤,提交部署请求后,得到一个部署作业 ID:ms-26c5a22c-6d07-4164-8222-a4182969162d

 

根据这个部署作业 ID 可以查询模型部署状态:

 

成功部署后,我们就可以用 Restful API 消费这个模型了,url 的格式为:

 

https://mlfinternalproduction-image-classifier.cfapps.sap.hana.ondemand.com/api/v2/image/classification/models/<model name>/versions/1

 

我从网络上随便找一张向日葵的照片,

 

将这张图片作为 HTTP POST 的参数发给我重新训练并且部署好的模型 flowerjerrymodel,得到的结果显示,重新训练后的模型认为这张图片有大约 87%的可能性是代表向日葵。

 

至此,这个机器模型重新训练和消费的步骤就成功完成了。

 

总结

 

本文首先介绍了使用 SAP UI5 前端框架开发的 Web 应用如何通过 Restful API 的方式消费 SAP Leonardo 平台提供的机器学习服务,然后以向日葵模型为例,介绍了 Leonardo 平台上机器学习模型重新训练和消费的详细步骤。

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。