客戶挑戰:因子挖掘與計算的性能瓶頸
Shark 的因子挖掘功能通過遺傳算法從資料中挖掘出有效的因子。在這一場景中,遺傳算法會隨機生成大量因子並進行計算,頻繁地創建和釋放臨時空間來儲存中間結果。直接使用原生的 CUDA C 顯存分配和釋放接口,會嚴重降低執行效率。
同時,Shark 的因子計算功能針對金融領域的資料分析與處理提供了豐富的函數庫。如果從零開始將 CPU 的函數遷移至 GPU,需要為 GPU 重新實現一套底層資料結構以及基礎計算函數,會導致開發週期的延長以及開發成本的增加。
應用方案:基於 RAPIDS 的雙重優化
基於以上挑戰,DolphinDB 開發團隊與 NVIDIA 團隊及 RAPIDS 開發團隊合作,通過以下方式實現突破:
利用 RAPIDS RMM 解決顯存管理瓶頸:RMM(RAPIDS Memory Manager)是一套開源的內存/顯存管理庫,提供 C++ 和 Python 接口,相比 cuMalloc、cuFree 等操作具有更好的性能和靈活性。Shark 進行因子挖掘時,通過使用 RMM 對顯存進行池化,從而對中間結果所使用的顯存進行高效地分配、釋放和重用。
基於 RAPIDS libcudf 進行二次開發:libcudf 是基於 GPU 的 C++ DataFrame 庫,提供了基礎資料結構和內置的基礎函數算子。DolphinDB 開發團隊復用 cuDF 的 column、table 等底層資料結構,並借助 cuDF 的 groupby 和 rolling 框架,只需要完成算子的核心計算邏輯,即可完成 DolphinDB 時序算子和橫截面算子的遷移,極大提升了開發效率。
效果:最高 10 倍性能提升
使用 RAPIDS RMM 顯存管理庫相對於原生的 CUDA 顯存分配 API,Shark 因子挖掘效率顯著提升,最高可達到 10 倍的加速比。
同時,Shark 通過使用 RAPIDS libcudf,大大提升了因子的計算效率。在測試場景中(1000 個 group,每個 group 有 10 萬行資料,採用分組方式計算),與 CPU 相比,利用 GPU 總體耗時(包含拷貝時間)基本達到了一個數量級的加速比。
借助 RAPIDS,Shark 的因子挖掘效率提升了 10 倍。基於 cuDF 進行二次開發,只需要實現算子的核心邏輯,就可以達到一個數量級的加速,並極大降低了算子遷移成本。
WeChat
Profile