2024年4月16日 星期二

AI 技術分享:將訓練好的模型整合於企業營運流程中

我在跟客戶端資料科學團隊交流過程中,最常被問到的題目就是:「我要如何使用已經訓練好的機器學習模型」,這個問題似乎一直困擾著大家。AI 機器學習的最終目的是對未知結果的預測,例如我們想知道一個潛在客戶是否會對我們即將推出的行銷方案感興趣。資料科學家在實驗室環境(開發環境)中訓練完成的模型,我們可以將其視為一種用數學公式表示的邏輯規則,要在企業應用系統(生產環境)中實現這個邏輯規則,最簡單的做法就是請應用程式開發團隊將這個邏輯規則實作在系統功能中。這種做法說起來很容易,但有實際參與應用系統開法與維運的朋友應該就會知道,為了確保系統運行的品質與正確性,在一個應用系統中添加一個新的功能必須經歷嚴謹的分析設計與開發測試等過程,對於一個大型的企業,這會是內部與外部不同團隊之間協同合作才能順利完成的事。因此,許多寶貴的 AI 資產往往仍然保留在資料科學家的實驗室環境中,未能充分發揮其應有的價值。基於這樣的情況,我希望透過這篇技術分享文章,完整地介紹各種可行的做法與技術方案,期望對大家的工作有所幫助。



先從 PMML(預測模型標記語言)說起

PMML(Predictive Model Markup Language)是一種 XML 格式,用於描述透過機器學習訓練完成的統計模型,包含模型的輸入變數與輸出變數,以及定義模型自身的參數。PMML 目前由 Data Mining Group(DMG)組織所維護,其目的在提供一種獨立於供應商的模型定義方法,以便於解決不同建模工具之間模型無法相容使用的問題。藉由 PMML,我們可以將訓練完成的機器學習模型匯出為統一的定義格式,然後再將其匯入到其他工具或應用程式中進行模型推論。

文章目錄:




1.在 SPSS Modeler 中匯出 PMML

要將機器學習模型匯出為 PMML 格式檔案,一般來說需要使用建模工具平台本身的模型匯出功能,例如 Python 程式語言可以使用 sklearn2pmml 這個套件。如果您正在使用 IBM SPSS Modeler 工具訓練機器學習模型,僅需以下簡單步驟即可將模型匯出為 PMML。

下圖是一個 SPSS Modeler 建模串流,這是一個醫療保險機構透過其投保人之基本屬性與醫療費用支付記錄建立投保人分群模型的案例。我們首先以醫療費用(charges)做為目標變數建立二個數值預測模型,目的在找出重要的輸入變數。接著使用 K-Means 建立最具區隔力的分群模型,最後分別使用 C5.0、C&RT、神經網路建立分類模型。我們以匯出神經網路模型為例,請於 SPSS Modeler 串流中,以滑鼠雙擊金黃色鑽石圖示的神經網路模型節點。


在神經網路模型節點視窗中,點擊「檔案」>「匯出 PMML」,指定欲存檔的路徑及檔案名稱後即可將神經網路模型儲存為副檔名為 xml 的檔案(例如:NEURAL.xml)。


想進一步了解 PMML 檔案的內容,可以使用文字編輯工具開啟這個 xml 檔案,如下圖所示。


請注意:在 SPSS Modeler 將模型匯出 PMML 的方式都一樣,但並非所有模型都可以匯出 PMML,必須是 PMML 4.3 規範的模型才有支援(DMG 官網雖已發布 PMML 4.4 規格,但由於時間序列模型仍有部分專利上的爭議,因此 SPSS Modeler 目前僅支援到 PMML 4.3)。有關 SPSS Modeler 支援 PMML 的模型類型請參見《 官方文件 》。


《 回到文章目錄 》



2.在 Python 程式中,透過 PyPMML 套件進行模型推論

在開始使用 Python 程式測試之前,為確保模型匯出後仍然可以獲得相同的預測結果,我們可以先準備三筆測試資料,並使用 SPSS Modeler 串流中的神經網路模型產生預測結果。如下圖所示,左方的表格是三筆測試資料的內容,右方表格則包含神經網路模型預測的結果,分別是 K-1、K-4、以及 K-2。


如文章開頭提到,要在企業應用系統中實現機器學習模型的預測功能,最簡單的做法就是請應用程式開發團隊將機器學習模型的邏輯規則實作在系統功能中。透過 PMML,資料科學團隊可以不用鉅細靡遺地向開發團隊解釋機器學習模型的邏輯規則,只需要請開發團隊下載及安裝程式語言適用的 PMML 套件,接著參考套件的使用說明在原始碼中載入已匯出的 PMML 檔案,然後傳入資料就可以開始進行預測。下圖是 Python 程式中常用的 PyPMML 套件,使用 pip install pypmml 指令就可以完成安裝,使用說明可以參考 GitHub 文件:https://github.com/autodeployai/pypmml


PyPMML 套件的使用方式非常簡單,只有二個關鍵的方法:(1) 使用 load() 載入 PMML 檔案;(2) 將單筆測試資料交給 predict() 就可以獲得模型預測的結果。當然,在使用 predict() 方法進行預測之前,最好還是先透過 inputNames 與 outputNames 這二個屬性取得輸入變數與輸出變數的數量與名稱,完整的範例程式如下圖所示。


程式執行結果如下圖,從 inputNames 屬性的輸出結果可以知道,這個神經網路模型共包含:age、bmi、charges、以及 smoker 等四個輸入變數;同樣地,從 outputNames 屬性的輸出結果可以觀察到 predicted_$K-Group 是我們期望的分類預測結果,剩餘的五個輸出變數均為代表置信度的機率值。最後,針對我們輸入的三筆測試資料,模型預測的結果分別是 K-1、K-4、以及 K-2,這個結果跟我們在 SPSS Modeler 串流中神經網路模型產生的預測結果相符。



《 回到文章目錄 》



3.使用開源模型部署軟體,透過 REST API 進行模型推論

儘管在應用程式開發環境中安裝合適的 PMML 套件可以輕鬆地將 PMML 格式的機器學習模型整合在應用程式功能中進行推論,但這樣的做法卻會造成模型與應用程式之間的相依性過高。如果模型使用一段時間出現預測能力衰減的現象,這時候資料科學團隊會重新訓練模型並匯出新的 PMML 檔案,應用程式開發團隊則需要再次配合調整程式碼並且進行整體性的功能驗證與測試。從現代化應用程式架構設計的角度思考,我們應該儘可能透過微服務化降低模型與應用程式之間的相依性,也就是讓每一個 PMML 模型都轉換成一個獨立的 Web 服務,應用程式僅須透過 REST API 即可取得機器學習模型提供的推論服務。

要實現這樣的理想一點都不困難,目前市面上大部分的機器學習建模工具都有提供對應的伺服器軟體或雲端服務,但考量導入成本與專案預期效益,除非企業已經決定要佈建完整的 Machine Learning Operations(MLOps)平台及應用,否則在初期評估試行階段,我的建議是選擇一個相對成本較低且容易導入及維護的工具。在網際網路資源中,我們只要使用諸如 python model scoring server 這樣的關鍵字,就可以找到很多技術貢獻者分享的程式碼。本篇文章並不會鉅細靡遺地說明如何撰寫一個模型評分伺服器,我將分享的是一個基於 AGPL-3.0 授權的開源模型部署軟體:Openscoring,我會直接使用這個開源軟體說明如何部署 PMML 模型以及如何實作即時評分。


Openscoring 是一個 100% 由 Java 開發的軟體,因此要執行這個伺服器軟體必須要先安裝 JDK(Java 11 或以上版本),確認 JDK 安裝完成後,可以直接在 GitHub 網站中下載 openscoring-server-executable-2.1.1.jar 檔案,如下圖所示。


開始執行 Openscoring 之前,請依據 GitHub 網站中 Advanced configuration 段落的說明,先到 openscoring-server 源碼資料夾中下載 application.conf.sample 檔案,並將其更名為 application.conf。將 application.conf 的內容置換為文件中建議的範例設定,也就是讓 Openscoring 將所有本地及遠端的 IP 位址均視為 admin IP address,避免實際運行時發生權限不足的錯誤訊息,需要置換的內容如下圖所示。


將 openscoring-server-executable-2.1.1.jar 與 application.conf 這二個檔案放在相同的資料夾中,開啟 Windows 命令提示字元視窗,切換到上述資料夾位置,執行指令:java -Dconfig.file=application.conf -jar openscoring-server-executable-2.1.1.jar。當您看到以下的畫面,即表示 Openscoring 伺服器已啟動完成。


  • 模型部署

  • Openscoring 是一個功能相對完整的開源模型評分軟體,目前共提供 Model deployment、Model querying、Model evaluation、以及 Model undeployment 等四種 REST API 與之互動。當伺服器啟動後,首先我們需要將 PMML 模型檔部署到伺服器中,下圖是我使用 Python 撰寫的簡單範例程式,若您不熟悉這個程式語言,可以直接使用 GitHub 提供的 cURL 指令進行模型部署。在 Python 程式中,要向伺服器發送 HTTP 請求需要使用 requests 套件,首先程式會先讀取儲存在 modelserver_vm\PMML 資料夾中的 NEURAL.xml(PMML 模型檔案),接者透過 HTTP PUT 指令對 Model deployment API 送出部署請求,並以 NEURAL 作為 Model ID。
    程式執行結果如下圖所示,HTTP Reponse Code 為 201 代表模型部署完成,Response message 也就是 Openscoring 伺服器回應的訊息。我們可以將焦點放在幾個重要的回應內容,其中 "id" : "NEURAL" 這是我們在部署模型時指定的 Model ID,後續要透過 REST API 與模型互動時都會用到它。"schema" 中包含四個 "inputFields"(輸入變數)與一個 "targetFields"(目標變數)。每個輸入變數也會有 "dataType"(資料型別)與 "opType"(變數類型)這二個重要的資訊,此外,目標變數還會提供 "values"(模型可能的預測結果)。
  • 查詢已部署模型清單

  • 如果我們想知道 Openscoring 伺服器中已經部署了那些模型,只需要對 Openscoring 服務的 /model Endpoint 發送 HTTP GET 請求指令,範例程式碼如下圖所示。
    由於我們目前只有部署一個 Model ID = NEURAL 的神經網路模型,因此 Openscoring 伺服器的回應訊息也只會有一筆模型的基本資料,如下圖所示。
  • 查詢模型 Metadata

  • 如果我們想知道某個模型詳細的規格(Metadata),只需要對 Openscoring 服務的 /model/${id} Endpoint 送出 HTTP GET 的請求指令,其中 ${id} 代表欲查詢的 Model ID(例如:我們在範例中已部署完成的 NEURAL 模型),範例程式碼如下圖所示。
    仔細觀察 Openscoring 伺服器回應的結果,除了 HTTP Reponse Code 為 200 以外,其餘的內容均與模型部署完成時伺服器回應的訊息一致,如下圖所示。
  • 即時評分

  • 透過 REST API 對已部署模型進行即時評分是本篇文章的重點,實作方式大同小異,只需要對 Openscoring 服務的 /model/${id} Endpoint 送出 HTTP POST 的請求指令,其中 ${id} 代表欲請求的 Model ID(例如:我們在範例中已部署完成的 NEURAL 模型)。需要注意的地方是 HTTP POST 的請求指令中需要包含一筆我們想要傳送給伺服器進行即時評分的測試資料,這個資料必須包含輸入變數的名稱與變數值,此外它需要使用 JSON 格式進行定義。完整的 Python 範例程式碼如下圖所示,請留意 test_data 這個 List 物件中共包含三筆 JSON 格式的字串資料,雖然長得很像 Python 的 Dict 物件,但實際內容必非 Dict 物件。另外,Openscoring 僅能接受以雙引號作為文字型變數名稱與其變數值的識別符號。
    程式執行結果如下圖所示,這個範例程式實際上共送出了三筆即時評分的請求命令,因此伺服器也會有相對應的三筆回應記錄。Response message 中的 "id" 是 Openscoring 自動加上去的預設值,因此三筆回應的 "id" 都會相同。針對這三筆測試資料,伺服器回應的模型預測結果分別是 K-1、K-4、以及 K-2,同樣跟我們在 SPSS Modeler 串流中神經網路模型產生的預測結果相符。

《 回到文章目錄 》



4.使用 IBM Watson 雲端模型部署平台,透過 REST API 進行模型推論

我常在演講的場合中分享很多成功的數位轉型實例,在這些案例中除了經營團隊清晰的戰略思維與戰術方法外,重要的關鍵就是大量運用 AI 的技術來優化企業決策與營運流程。例如,一家國際製造大廠運用 AI 技術逐步提升生產線自主生產的能力,進而實現生產力倍增的預期目標。因為他們理解,生產力倍增不代表工程師需要加倍,此外,簡單地用機器人取代人類工作,還是會導致生產線繼續生產有缺陷的產品。因此,他們決定透過 AI 技術分析即時收集的各種生產數據,當判斷可能生產缺陷產品時,AI 會自動改變產線的加工條件。在生產過程中,如果 AI 預測產線可能因機器故障而停止時,它會立即向負責人發出警報。

要在企業內大量應用 AI 技術,就必須從生命週期的角度來思考與管理 AI 模型的生老病死,這正是 Machine Learning Operations(MLOps)與 AI Governance 討論的範疇。作為一家全球指標型的企業,IBM 為客戶提供一個完整的 MLOps 解決方案,這個方案將 AI 機器學習所需的資料蒐集、資料準備、模型訓練、模型評估、模型部署以及模型監控等工具軟體完美地整合在一個 Cloud Pak for Data 平台中,滿足企業內部各種不同角色對於 AI 的需求,實現人工智慧的民主化。


本篇文章,我將以 Cloud Pak for Data 平台中的模型部署工具 Watson Machine Learning 作為例子,從建立部署空間(Model Deployment Space)開始,接著上傳 PMML 模型、產生即時評分 Web 服務、在平台介面中完成線上評分測試。最後,我也會使用一段簡單的 Python 程式透過 Watson Machine Learning 提供的 REST API 實作線上即時評分。Cloud Pak for Data 平台支援地端部署與雲端部署,以下我將直接使用 IBM Cloud 雲平台中的 Watson Machine Learning 服務,主要原因在於 IBM Cloud 提供很多 Lite 版本的免費服務,它可以讓我們在一個完整功能的雲端環境中滿足少量測試的評估需求,如果覺得好用,再來決定要直接使用付費版的雲端服務或是直接在企業資訊基礎架構中建置一套 Cloud Pak for Data 平台。

因為我已經在我的 IBM Cloud 環境中啟用 Watson Machine Learning Lite 服務,所以可以直接在雲平台的「資源清單」>「AI/機器學習」服務清單中找到 Watson Machine Learning 服務實例的名稱,只要點擊這個服務名稱就可以開始使用這個服務,如下圖所示。


進入 Watson Machine Learning 服務頁面後,選擇「在 IBM Cloud Pak for Data」中啟動服務,如下圖所示。


進入 IBM Cloud Pak for Data 頁面後,點擊「取消」跳過線上教學。


在畫面下方最右手邊的「部署」圖塊中,點擊「新建部署空間」,我們需要在 Watson Machine Learning 服務中建立一個新的部署空間(Deployment Space),這個動作等同於建立一個 Model Scoring Server 的實例(Instance)。


要建立一個部署空間,首先須要先給它一個名稱(例如 Test Model Server),接著在「部署階段」下拉選單中選擇「正在測試(Testing)」,然後在「選擇儲存服務」下拉選單中選擇先前已啟用的 Cloud Object Storage 實例,這個儲存實例將用來儲存我們接著會上傳的 PMML 模型檔案。最後,在「選取機器學習服務」下拉選單中選擇我們已啟用的 Watson Machine Learning 服務實例名稱。完成設定後,點擊「建立」按鈕。


部署空間建立完成後,點擊「檢視新空間」按鈕。


進入 Test Model Server 部署空間後,切換至「資產」頁籤,點擊「匯入資產」。


點擊切換至「本機檔案」頁籤,點擊「型號」圖塊(備註:翻譯的問題,英文名為 Model)。


在「上傳模型檔」頁面中,點擊「瀏覽」,選擇儲存在電腦中的 NEURAL.xml 檔案。


確認本機資產為 NEURAL.xml,模型名稱指定為 NEURAL,點擊「匯入」。


模型檔案匯入完成會進入模型頁面,點擊「新建部署」,這個動作等同於建立一個 NEURAL 模型的網路服務(Web Service)。


選擇部署類型「線上」,名稱輸入 NEURAL(內部的名稱),服務名稱輸入 neural (對外的服務名稱,也就是 Web Service 的 Endpoint),點擊「建立」。


模型部署完成後,回到 NEURAL 模型的「部署」頁籤,等待 NEURAL 部署的狀態變更為「已部署」,點擊 NEURAL 部署的名稱即可進入到這個模型的 API 參照與測試頁面。


返回到 NEURAL 模型的「部署」頁籤,點擊並切換至「模型詳細資料」頁籤,這裡可以看到模型的輸入變數與輸出變數的名稱(直欄 Field)與資料型別(類型 Type)。


進入到 NEURAL 模型的 API 參照與測試頁面,首先在「API 參照」頁籤可以看到「公用端點 Public Endpoint」,這個就是 Watson Machine Learning 服務為 NEURAL 模型建立的 REST API 對外服務端點。下方「程式碼片段」則提供包含 cURL、Java、JavaScript、Python、Scala 等五種程式語言與模型互動的範例程式。


切換到「測試」頁籤,這裡允許我們輸入測試資料進行即時評分的測試。我們可以逐筆自行輸入先前準備好的三筆測試資料,或是點擊「下載 CSV 範本」,將測試資料輸入在 CSV 範本檔案中,隨後點擊「瀏覽本端檔案」將這個包含測試資料的 CSV 範本檔案載入到頁面中。完成測試資料輸入後,點擊「預測」。


模型預測完成後,在「預測結果」頁面可以看到結果分別是 K-1、K-4、以及 K-2,同樣跟我們在 SPSS Modeler 串流中神經網路模型產生的預測結果相符。


在「預測結果」頁面的右上角有一個「顯示輸入資料」的控制器,向右切換即可在預測結果表格中同時看到我們輸入的測試資料。


完成在 IBM Cloud 使用者介面上的即時評分測試後,接著我們可以參考 Watson Machine Learning 服務提供的 Python 程式碼範例,將 payload_scoring 變數中的變數值置換為先前已準備的測試資料,使用 requests.post() 方法向 NEURAL 模型的 REST API 公用端點送出即時評分請求。完整的範例程式如下圖所示。


程式執行結果如下圖所示。


《 回到文章目錄 》



版權聲明
文章內容未經授權,請勿進行任何形式的複製、修改或發佈本文內容,如需轉載或引用,請在使用時注明出處並取得授權。本文中提及的特定公司、產品、品牌名稱等僅為描述目的,其版權歸屬於相應的公司或擁有者。

沒有留言:

張貼留言