異構記憶體及其在機器學習系統的應用與優化

白玉蘭開源 發表於 2021-06-08
Machine Learning

第四正規化深耕於人工智慧領域,在人工智慧相關演算法、應用、系統和底層架構設計等有兼具廣度和深度的理解。

隨著近幾年先進儲存技術的飛速發展,湧現出了具有顛覆性的儲存技術,比如非易失性儲存、SSD等。基於此類技術的異構記憶體架構,正在顛覆傳統應用程式的設計和優化模式。

第四正規化在異構記憶體架構上搶先佈局,進行了若干創新性探索研發和落地實踐,比如引數伺服器[ 第四正規化推出業界首個基於持久記憶體、支援毫秒級恢復的萬億維線上預估系統:https://www.163.com/tech/article/FGCFSO4N00099A7M.html ]、記憶體資料庫等[ 英特爾、第四正規化聯合研究成果入選國際頂會 VLDB 傲騰™ 持久記憶體加持 優化萬億維特徵線上預估系統:https://newsroom.intel.cn/news-releases/the-joint-research-results-of-intel-and-4paradigm-were-selected-into-the-vldb-international-conference/]。

此篇文章將介紹異構記憶體架構的技術背景,以及在自動機器學習系統上的技術實踐。

異構記憶體架構

傳統上,我們所說的記憶體一般是指動態隨機儲存,即DRAM。此外,在CPU中還會存在小容量的快速儲存器件,我們一般會稱他們為CPU快取(即L1/L2 cache)。具有永續性的慢速儲存器件則構成了外存,比如磁碟等。因此,外存、記憶體、和CPU快取,構成了整個儲存架構金字塔。但是,隨著具有革命性意義的非易失性記憶體技術的商業化落地,使得這個金字塔中的記憶體不再由DRAM單一組成,而是由DRAM和非易失性記憶體構成了異構記憶體架構。

此外,非易失性記憶體的出現也模糊了記憶體和外存之間的功能邊界,使得記憶體資料持久化成為了可能。今天,非易失性記憶體技術已經完全成熟,由英特爾於2019年釋出的英特爾® 傲騰™ 持久記憶體(簡稱持久記憶體或者PMem),即是此技術的代表性產品。
在這裡插入圖片描述

圖 1. 基於異構記憶體的儲存架構金字塔

圖 1顯示了包含有異構記憶體的儲存架構金字塔。可以看到,在本質上,持久記憶體處於金字塔中DRAM和外存之間,其在容量、效能、成本都是處於兩者之間。甚至在功能上,它亦是一個DRAM和外存的混合體。它既可以直接當做記憶體使用(記憶體模式),也可以當作一個持久化裝置使用(App Direct 模式,簡稱AD模式)。

在記憶體模式中,持久記憶體對作業系統透明,其容量直接反應為整體的可用記憶體容量;AD模式則將儲存層級暴露,由開發者完全掌控。因此,由於持久記憶體的特殊存在,現代記憶體架構不僅僅是在層級上變得更為複雜,在功能上也出現了革命性的變化,對於如何利用好異構記憶體架構,開發人員需要思考更多的問題,比如:

  • 多級儲存的優化。持久記憶體提供了一個效能接近於DRAM,但是成本更低的記憶體方案,非常有利於對於記憶體消耗巨大的應用。但是,多級儲存架構的引入也為效能優化帶來了更高的挑戰。我們知道,高效能快取在效能調優中有重大意義。一方面現實資料中往往存在熱點,快取可以有效提升熱點資料的訪問效能;另一方面,快取敏感資料結構(cache
    conscious)為了壓榨硬體效能,常常有精巧的設計。那麼,持久記憶體的出現使得這個儲存層級更為複雜,對多級快取機制、資料結構和演算法的設計都提出了更高的要求。
  • 持久化機制的利用。持久記憶體使得外存不再是儲存資料的唯一選擇。持久記憶體提供了遠比傳統外存器件更高的持久化效能,但是其容量相對較小。在某些場景中如何有效的發揮高效能持久化的特點,成為了應用落地需要思考的新問題。比如,對於需要全天候保證服務質量的線上服務應用,記憶體資料持久化即能提供離線以後的快速恢復能力;另外,原本磁碟IO為效能瓶頸的場景,也可以利用持久記憶體來作為儲存介質,來提升整體系統效能。

為了讓大家進一步瞭解異構記憶體架構如何在實際場景中發揮價值,我們將拋磚引玉,分享第四正規化在異構記憶體架構上的實踐經驗。

自動機器學習系統在異構記憶體上的優化

在這裡插入圖片描述
圖 2顯示了一個第四正規化產品中一個典型的自動機器學習(AutoML)全流程。其主體上包含了離線探索以及線上推理部分。離線探索通過自動特徵工程和模型訓練,產出可以上線的特徵工程指令碼以及模型。線上推理服務在接受到使用者請求以後,經過實時特徵抽取和模型推理,拿到預測結果。同時訊息佇列在整個系統中起到了資料蒐集和分發的關鍵作用。

從表格 1可以看到,在異構記憶體架構下,持久記憶體在不同元件中有不同的使用方法,從而達到不同的優化目的。總體來說,記憶體模式可以用來實現快速的低成本記憶體容量擴充套件,AD模式則帶來了更多的益處,包括快速恢復能力、提升資料儲存效能等。
在這裡插入圖片描述

第四正規化已經將基於異構記憶體優化的關鍵技術組建進行了解耦,並且貢獻到了開源社群,目前主要包含兩個專案:高效能訊息佇列系統Pafka(https://github.com/4paradigm/pafka),以及針對AI負載優化的高效能KV儲存引擎 PmemStore(https://github.com/4paradigm/pmemstore) 。以下主要展開介紹Pafka。

Pafka:基於異構記憶體優化的高效能訊息佇列系統

Kafka是一個開源的分散式事件流/訊息佇列系統,用於高效,可靠地處理實時資料流,在工業界中有非常廣泛的落地應用場景。 但是,由於其持久化邏輯的存在,其效能(吞吐和延遲)常常受到外存裝置(HDD/SSD)的制約。在實際使用場景中,為了增加 Kafka 叢集的總體吞吐量,企業不得不擴大叢集規模,增加了企業的總成本。

持久記憶體具有高速持久化的特性,能達到幾倍甚至幾十倍於傳統硬碟和SSD的持久化效能。因此,基於異構記憶體架構的 Kafka 的優化版本 — Pafka,正是利用了高速持久化的特性,大幅提升單節點吞吐,從而優化在叢集上的總投入成本。總體來說,相比較於傳統的Kafka解決方案,Pafka帶來了如下優勢:

  • 比較於目前資料中心常見的 SATA SSD 的配置,基於異構記憶體的Pafka改進節點吞吐和延遲均達20倍。
  • 由於大幅提升了節點吞吐,因此在叢集規模總投資上,相比較於 Kafka,Pafka可以減少硬體投入成本 10 倍以上。
  • Pafka直接基於Kafka優化,使用者原有的基於 Kafka 的業務程式碼無需修改,可以零程式碼改造成本遷移到Pafka系統。

我們對於 Kafka 的優化集中於造成效能瓶頸的資料落盤部分。原Kafka原有的架構中,資料持久化只發生在外存(磁碟/SSD)這一層級;經過優化以後的Pafka版本,基於異構記憶體架構,同時把持久記憶體和外存用來做資料持久化。

具備高效能持久化能力的持久記憶體作為持久化層級的第一級,而容量更大但效能較差的外存則作為第二級持久化介質,兩者通過一定的快取機制進行管理。

由於訊息佇列的生產者/消費者的使用模式,大部分場景下資料的存取都會發生在高效能的持久記憶體中。

在這裡插入圖片描述
圖 3. Pafka叢集架構
如圖 3所示,一個 Kafka 伺服器叢集由幾個至上百上千個的 brokers組成。Brokers 內部劃分為了不同的 partitions,進一步劃分為 segments,來進行訊息儲存。我們對於 Kafka 的改造主要集中在 segment 的儲存資料結構上的改造。原來的 segment 只能儲存在 HDD/SSD 等外存裝置上,我們使用 PMDK 來進行基於異構記憶體的持久化操作,引入 MixChannel 的概念,來實現 segment 既能儲存在 HDD/SSD 的外存裝置,也能在持久記憶體上。

具體來說,MixChannel將普通的檔案介面和持久記憶體的介面統一管理,其底層儲存介質對於上層元件是透明的。為了支援基於持久記憶體的儲存,我們為MixChannel引入了資料結構PMemChannel,其主要功能是把持久記憶體的MemoryBlock物件封裝成滿足FileChannel API的介面,從而可以讓MixChannel方便的選擇基於傳統檔案的FileChannel介面,還是基於持久記憶體的PMemChannel。這裡我們使用了pmdk llpl的PersistentMemoryBlock,會自動為每次寫入的資料進行持久化。同時,為了支援zero-copy,我們還為llpl的MemoryBlock,通過直接對映持久記憶體的地址到ByteBuffer,實現了zero-copy的ByteBuffer介面,從而避免了記憶體的多次拷貝,提升效能。

為了維護segment和持久記憶體上資料的對應關係,我們為每個segment分配一個持久記憶體的MemoryBlock,對映關係通過pmdk pcj的ObjectDirectory來維護。

此外,為了避免MemoryBlock在Pafka正常執行時動態分配的開銷,我們會在初始化的時候預先分配固定一定比例的記憶體池空間,用於寫資料的時候MemoryBlock的快速分配。

效能比較
在這裡插入圖片描述

圖 4顯示,相比較於資料中心中常用的基於SATA SSD進行持久化的Kafka,基於異構記憶體優化的Pafka在吞吐和延遲的效能表現上均可以達到20倍的改進。

成本比較

假設我們的目標是提供20 GB /秒的整體吞吐率,我們將異構持久記憶體的 Pafka 與基於 SATA SSD 的Kafka 進行了比較。圖 5顯示,為了實現20 GB /秒的總吞吐率,基於 SATA SSD 的伺服器和基於異構記憶體的伺服器的數量分別為 45 和 3。 此外,就硬體成本而言,傳統的Kafka(SATA SSD)需要花費為 45 萬美元,而我們的Pafka解決方案僅需花費 4.05 萬美元。Pafka解決方案將硬體成本大大降低到傳統Kafka解決方案的9%。
在這裡插入圖片描述

圖 5. 20 GB/sec 吞吐的效能下,Pafka和Kafka方案的成本比較

更多資訊

Pafka為第四正規化的開源專案,具體使用方式、技術支援、以及完整效能報告可以通過以下渠道瞭解更多:
-程式碼Github repo:https://github.com/4paradigm/pafka
-Slack channel:https://join.slack.com/t/memarkworkspace/shared_invite/zt-o1wa5wqt-euKxFgyrUUrQCqJ4rE0oPw
-MemArk 異構儲存技術論壇:https://discuss.memark.io/