Categories
程式開發

只需幾百行代碼,利用Ray快速實現算法解釋模型Alibi的線性擴展


提供大規模的模型服務只是戰鬥的一部分。一般來說,你還需要能夠解釋和預測。 Seldon的團隊了解處理許多模型並在生產中提供模型服務的挑戰。然而,確保用戶理解為什麼會做出這些預測則完全是另外一項挑戰。

本文最初發佈於Distributed Computing with Ray博客,經授權由InfoQ中文站翻譯並分享。

提供大規模的模型服務只是戰鬥的一部分。一般來說,你還需要能夠解釋和預測。塞爾登的團隊了解處理許多模型並在生產中提供模型服務的挑戰。然而,確保用戶理解為什麼會做出這些預測則完全是另外一項挑戰。

出於這個原因,Seldon推出了阿里比庫。Alibi是一個用於ML模型觀測和解釋的開源Python庫。它允許用戶在他們的數據上運行流行的模型解釋算法,如Kernel SHAP。

不過,儘管Alibi有許多算法,但用戶往往尋求更好的性能和可擴展性。 Seldon團隊開始接觸射線,這是一個開源框架,為構建分佈式應用程序提供了一個簡單的通用API,為了尋找擴展Alibi的解決方案,我們希望使用Kernel SHAP算法測試下Ray的表現。

下面是測試結果預覽。簡而言之,Seldon團隊能夠通過利用雷芯實現Kernel SHAPm的線性擴展,而且只需幾百行代碼。

本文將回顧這些結果,並討論團隊是如何實現Distributed Kernel SHAP的。感興趣的讀者可以從GitHub存儲庫獲取完整的代碼和結果。

只需幾百行代碼,利用Ray快速實現算法解釋模型Alibi的線性擴展 1

線性擴展使得有效的計算擴展變得簡單!

讓我們更深入地探討下Alibi、Kernel SHAP、Seldon如何分發Kernel SHAP以及達到的效果。

Alibi是什麼?

阿里比是一個Python包,旨在幫助解釋機器學習模型的預測結果,並衡量預測的可靠程度。這個庫的重點是使用黑箱方法支持最廣泛的模型。目前,Alibi提供了8種不同的算法解釋模型,包括流行的算法,如Anchors、Counterfactuals、Integrated Gradients、Kernel SHAP和Tree SHAP。

最近,Seldon團隊開展了一個項目,他們需要能夠將可解釋性計算擴展到大量的CPU上。這是必要的,因為黑箱方法對預測函數進行事後建模,而且速度很慢,這使得在單個CPU上解釋大量實例的任務成本非常高。

Seldon團隊認為,他們可以探索使用更大的機器,但他們的許多客戶使用的是分佈式環境,因此,需要可持續擴展的解決方案——超出一台機器的範圍。

他們聯繫了Ray團隊,詢問他們會如何擴展這個工作負載。只要一點點工作量,Seldon團隊就能夠在短短幾天內實現Kernel SHAP的擴展。

Kernel SHAP背景知識

正如在文檔中提到的,Kernel SHAP提供了與模型無關的(黑盒)、人類可解釋的說明,適合應用於表格數據的回歸和分類模型。該方法是可加特徵歸因方法的一員;特徵歸因是指結果解釋(例如,分類問題中的類別概率)相對於基線(例如,訓練集中那個類的平均預測概率)的變化可以歸結為不同比例的模型輸入特徵。

圖1顯示了一個簡單的解釋過程。我們看到,該圖描述了一個模型,它將年齡、BMI或性別作為輸入特徵,並輸出一個連續的值。我們知道,在我們感興趣的數據集中,輸出的平均值是0.1。使用Kernel SHAP算法,我們將0.3的差異歸因於輸入特徵。因為屬性值的和等於輸出base rate,所以這個方法是可加的。

例如,我們可以看到,性別特徵對預測的作用是消極的,而其他特徵對預測的作用是積極的。為了解釋這一特定數據點,年齡特徵似乎是最重要的。請參閱我們的示例,了解如何使用該算法進行解釋,以及使用SHAP庫來可視化結果(這裡這裡這裡)。

只需幾百行代碼,利用Ray快速實現算法解釋模型Alibi的線性擴展 2

圖1:使用Kernel SHAP的黑盒解釋模型(來自這裡

挑戰:利用Kernel SHAP進行總體解釋

如上所述,Kernel SHAP是一種解釋表格數據的黑盒模型的方法。然而,計算這些解釋非常昂貴,所以在一個CPU或一台機器上解釋許多模型預測以獲得模型行為的全局視圖非常具有挑戰性,因為它需要解釋大量的預測。但是,由於預測是獨立的,所以可以並行化解釋每個預測的計算,在一個高效的分佈式計算框架下,這本身就可以節省大量的時間。這就是Ray的作用。

Seldon團隊之所以選擇射線,是因為它具有簡單的API、支持州長分佈式集群啟動程序以及強大的社區

在短短幾天內,團隊就能從概念到原型。

解決方案

Seldon團隊構建的解決方案有兩個架構變體。其核心架構很簡單,他們創建了一個工作進程池,然後將計算函數傳遞給它們進行並行化然後執行。但是,這個池的創建有兩種方法。

一種方法使用一個Ray Actor池,它消費待解釋的2560個模型預測的小子集。另一種方法使用Ray Serve而不是並行池,我們將工作作為批處理任務提交給Ray Serve。這兩種方法的代碼都已在GitHub存儲庫中提供,並且二者的性能結果類似。

單節點結果

實驗在Digital Ocean上一台經過計算優化的專用機器上運行,該機器有32個vCPU。這也解釋了下面的性能增益衰減。

使用Ray並行池運行任務得到的結果如下:

只需幾百行代碼,利用Ray快速實現算法解釋模型Alibi的線性擴展 3

使用雷服務分發產生了類似的結果:

只需幾百行代碼,利用Ray快速實現算法解釋模型Alibi的線性擴展 4

分佈式結果

Kubernetes集群

實驗在一個集群上運行,該集群由Digital Ocean中兩台經過計算優化的專用機器組成,每台機器有32個vCPU。這也解釋了下面的性能增益衰減。

在兩節點集群上使用Ray並行池運行任務的結果如下所示:

只需幾百行代碼,利用Ray快速實現算法解釋模型Alibi的線性擴展 1只需幾百行代碼,利用Ray快速實現算法解釋模型Alibi的線性擴展 6

使用雷服務分發產生了類似的結果:

只需幾百行代碼,利用Ray快速實現算法解釋模型Alibi的線性擴展 7只需幾百行代碼,利用Ray快速實現算法解釋模型Alibi的線性擴展 8

該團隊實驗了不同的批次大小。批次大小控制同時將多少預測發送給一個工作進程。這樣做的主要目的是,確保每個解釋任務的運行時間大於分配任務的開銷;解釋器無法從處理批次中獲益,因為每個實例的解釋都獨立於批次中的其他實例。團隊並沒有詳細分析為什麼批次大小較大會導致運行時間略有下降,我們懷疑,分配的解釋任務較少,就需要更長的運行時間,可能是因為資源利用效率低(例如,在快結束的時候,有一些任務在運行,但一些工作進程閒置)。

Seldon和Ray未來展望

Seldon和Ray是絕佳的組合。這篇文章展示了在Ray上並行化給定的工作負載是多麼容易,未來,我們希望可以分享如何將這些工具一起用於從模型訓練到提供服務的所有事情。

關於Ray

Ray是一個簡單、通用的分佈式計算框架。 Ray項目最初由加州大學伯克利分校RISELab實驗室發起並開源。在過去幾年中,Ray項目發展迅速,在螞蟻集團、Intel、微軟、AWS等公司被應用於構建各種AI、大數據系統。

Ray提供了簡單、通用的分佈式API(Python/Java),便於快速構建分佈式應用程序。在機器學習領域,封裝了以下框架,來提升整體研發效率:

  • Tune:可伸縮的超參數調優框架
  • RLib:可擴展的強化學習框架
  • RaySGD:分佈式訓練器
  • Ray Serve:可擴展可編程的分佈式服務

Ray官網地址:https://ray.io/

Ray Github地址:https://github.com/ray-project/ray

Ray中文官方公眾號:微信搜索“Ray中文社區”或“raycommunity”

英文原文鏈接:

用Ray縮放Seldon的Alibi —使模型的易解釋性易於擴展