由英特爾 AI 實踐日工作組和第四範式發起的“英特爾AI實踐日第31期&AI應用與異構記憶體程式設計挑戰賽總動員”線上研讨會将于6月10日晚上開播。主辦方之一的第四範式深耕于人工智能領域多年,在人工智能相關算法、應用、系統和底層架構設計等有兼具廣度和深度的了解。
随着近幾年先進存儲技術的飛速發展,湧現出了具有颠覆性的存儲技術,比如非易失性存儲、SSD等。基于此類技術的異構記憶體架構,正在颠覆傳統應用程式的設計和優化模式。第四範式在異構記憶體架構上搶先布局,進行了若幹創新性探索研發和落地實踐,比如參數伺服器、記憶體資料庫等。
此篇文章将介紹異構記憶體架構的技術背景,以及在自動機器學習系統上的技術實踐。
01異構記憶體架構
傳統上,我們所說的記憶體一般是指動态随機存儲,即DRAM。此外,在CPU中還會存在小容量的快速存儲器件,我們一般會稱他們為CPU緩存(即L1/L2 cache)。具有持久性的慢速存儲器件則構成了外存,比如磁盤等。是以,外存、記憶體、和CPU緩存,構成了整個存儲架構金字塔。
但是,随着具有革命性意義的非易失性記憶體技術的商業化落地,使得這個金字塔中的記憶體不再由DRAM單一組成,而是由DRAM和非易失性記憶體構成了異構記憶體架構。此外,非易失性記憶體的出現也模糊了記憶體和外存之間的功能邊界,使得記憶體資料持久化成為了可能。今天,非易失性記憶體技術已經完全成熟,由英特爾于2019年釋出的英特爾® 傲騰™ 持久記憶體(簡稱持久記憶體或者PMem),即是此技術的代表性産品。

圖 1. 基于異構記憶體的存儲架構金字塔
圖 1顯示了包含有異構記憶體的存儲架構金字塔。可以看到,在本質上,持久記憶體處于金字塔中DRAM和外存之間,其在容量、性能、成本都是處于兩者之間。甚至在功能上,它亦是一個DRAM和外存的混合體。它既可以直接當做記憶體使用(記憶體模式),也可以當作一個持久化裝置使用(App Direct 模式,簡稱AD模式)。
在記憶體模式中,持久記憶體對作業系統透明,其容量直接反應為整體的可用記憶體容量;AD模式則将存儲層級暴露,由開發者完全掌控。是以,由于持久記憶體的特殊存在,現代記憶體架構不僅僅是在層級上變得更為複雜,在功能上也出現了革命性的變化,對于如何利用好異構記憶體架構,開發人員需要思考更多的問題,比如:
多級存儲的優化。持久記憶體提供了一個性能接近于DRAM,但是成本更低的記憶體方案,非常有利于對于記憶體消耗巨大的應用。但是,多級存儲架構的引入也為性能優化帶來了更高的挑戰。我們知道,高性能緩存在性能調優中有重大意義。一方面現實資料中往往存在熱點,緩存可以有效提升熱點資料的通路性能;另一方面,緩存敏感資料結構(cache conscious)為了壓榨硬體性能,常常有精巧的設計。那麼,持久記憶體的出現使得這個存儲層級更為複雜,對多級緩存機制、資料結構和算法的設計都提出了更高的要求。
持久化機制的利用。持久記憶體使得外存不再是存儲資料的唯一選擇。持久記憶體提供了遠比傳統外存器件更高的持久化性能,但是其容量相對較小。在某些場景中如何有效的發揮高性能持久化的特點,成為了應用落地需要思考的新問題。比如,對于需要全天候保證服務品質的線上服務應用,記憶體資料持久化即能提供離線以後的快速恢複能力;另外,原本磁盤IO為性能瓶頸的場景,也可以利用持久記憶體來作為存儲媒體,來提升整體系統性能。
為了讓大家進一步了解異構記憶體架構如何在實際場景中發揮價值,我們将抛磚引玉,分享第四範式在異構記憶體架構上的實踐經驗。
02自動機器學習系統在異構記憶體上的優化
圖 2. 自動機器學習(AutoML)全流程
圖 2顯示了一個第四範式産品中一個典型的自動機器學習(AutoML)全流程。其主體上包含了離線探索以及線上推理部分。離線探索通過自動特征工程和模型訓練,産出可以上線的特征工程腳本以及模型。線上推理服務在接受到使用者請求以後,經過實時特征抽取和模型推理,拿到預測結果。同時消息隊列在整個系統中起到了資料搜集和分發的關鍵作用。
從表格 1可以看到,在異構記憶體架構下,持久記憶體在不同元件中有不同的使用方法,進而達到不同的優化目的。總體來說,記憶體模式可以用來實作快速的低成本記憶體容量擴充,AD模式則帶來了更多的益處,包括快速恢複能力、提升資料存儲性能等。
表格 1. 自動機器學習全流程元件在異構記憶體架構上的的應用與優化
第四範式已經将基于異構記憶體優化的關鍵技術組建進行了解耦,并且貢獻到了開源社群,目前主要包含兩個項目:高性能消息隊列系統Pafka(
https://github.com/4paradigm/pafka),以及針對AI負載優化的高性能KV存儲引擎PmemStore(
https://github.com/4paradigm/pmemstore) 。以下主要展開介紹Pafka。
03Pafka:基于異構記憶體優化的高性能消息隊列系統
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倍的改進。
圖 4. 消息隊列性能比較
成本比較
假設我們的目标是提供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方案的成本比較
04更多資訊
Pafka為第四範式的開源項目,具體使用方式、技術支援、以及完整性能報告可以通過以下管道了解更多:
- 代碼Github repo:
- Slack channel:
https://join.slack.com/t/memarkworkspace/shared_invite/zt-o1wa5wqt-euKxFgyrUUrQCqJ4rE0oPw- MemArk 異構存儲技術論壇:
https://discuss.memark.io/