臉書開發了一個小型的嵌入式C++函式庫Spiral,以機器學習為資源有限的即時服務,產生資料驅動或是反應式的啟發演算法,以最佳化服務。臉書提到,過去他們手動撰寫快取(Cache)、許可(Admission)與驅逐(Eviction)策略太過困難,而且也過分耗費時日,Spiral可以加速這個最佳化過程從數周到數分鐘。

臉書用戶多達數十億,雖然服務看似為一個統一個應用程式或是網站,但其實是由數千種服務組合而成,這些服務範圍包括平衡網路流量、影像轉碼,到高可靠儲存的後端功能,而用戶所感受到臉書的執行效率,是各種服務的總和結果。過去都由這些服務個別進行最佳化,但是這樣的方式難以適應快節奏的變化。

臉書服務更新節奏很快,其程式碼基底(Codebase)每隔幾個小時,就會被推送進入生產階段,而在這個持續部署的過程,手動調校服務顯得不切實際,因此他們必須根本上改變對於軟體維護的看法。傳統調校快取的策略看起來像是一個有許多分支的樹狀結構,根據物件的大小、類型或是其他元資料來決定快取與否。臉書特別提到,無論要工程師手動重寫快取(Cache)、許可(Admission)與驅逐(Eviction)策略,或是手動調整啟發式演算法都太過困難。

臉書想讓這個最佳化過程從手動變成自動,擺脫以人工寫死的啟發式演算法或是參數方法,以最佳化快取來說,自動化調校應該要透過存取歷史紀錄,讓分類器(Classifier)來決定那些物件應該要放進快取,臉書舉例,像是沒有存取過的物件就不要放進快取。把元資料當作特徵,並把回饋作為標籤,分類器就能對快取操作進行決策,而且一邊再訓練一做出決策,也可以讓分類器保持最新的狀態。

以這樣的發想,臉書建構出了Spiral,這是一個存在極少相依的小型嵌入式C++函式庫,能以機器學習為資源有限的即時服務,創建資料驅動與反應式的啟發式最佳化,讓系統開發速度更快,工程師也不需要手動進行最佳化維護。

整合Spiral的程式具備預測與回饋兩種功能。Spiral預測能輸出決策,像是用於決定物件放入快取與否,而這個預測動作,則需要在本地端的每一個決定中被執行。Spiral的回饋功能則是偶而被啟用,例如當快取裡的物件從未被存取,那機器學習模型便會學習到,這類的東西或許不適合放進快取。

Spiral可以單純在本機端運作,進行輕量的模型訓練,或是也能用於回傳統計訊息或是回饋至後端,以視覺化呈現資訊用作除錯,或是以日誌資料記型長期儲存,供未來分析使用,也可以進行資源吃重的模型訓練。在Spiral中,只要收到回饋資訊,便會馬上開始模型訓練,隨著回饋的產生,預測的精準度也會提高,而且與寫死的最佳化方法不同,由於Spiral的啟發式演算法根據回饋不同而改變,因此特別能夠適應不斷變化的執行條件。

這個基於Spiral的快取最佳化機制,讓反應式快取的查詢時間,從數周降低到了數分鐘。之前工程師需要透過實驗收集資料,這個過程不只勞力密集且需要花費許多時間,但有了Spiral,最快在幾分鐘內就能自動產生學習模型,進行推測,而多數的使用案例,伺服器也能在10到20分鐘內訓練出模型進行推測。

臉書認為,這個Spiral概念很像是宣告式程式設計(Declarative programming),就像是SQL一樣,工程師只要指定計算的內容,運算引擎便會找出最佳查詢方法,而不需要指定複雜的計算過程。不過,宣告式程式設計的挑戰在於,完整且正確的指定目標,當給系統不精確的策略回饋時,系統便會學習出不精確的政策。臉書提到,新人工程師入職最難的部分之一,就是學習使用Spiral精確定義自動調校需要的結果。


Advertisement

更多 iThome相關內容