如何在 Web 應用裡消費 SAP Leonardo 的機器學習 API

語言: CN / TW / HK

本文選擇使用 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 環境:

http://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 的格式為:

http://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 平臺上機器學習模型重新訓練和消費的詳細步驟。

劃線

評論

複製