DolphinDB 公司推出的 CPU-GPU 异构计算平台 Shark,将 DolphinDB 上的复杂指标计算能力无缝切换到 GPU 算力平台,大幅提升了计算性能。
DolphinDB 开发团队与 NVIDIA 团队合作,通过利用 NVIDIA RAPIDS 加速 Shark 异构计算平台的因子挖掘算法运行效率,帮助 Shark 将因子挖掘的效率提升 2 – 10 倍;并基于 NVIDIA cuDF 实现 Shark 因子高效计算,大幅减少开发成本,缩短开发周期。
RAPIDS 的 RMM 是一套开源的内存/显存管理库,提供 C++ 和 Python 接口,它相比 cuMalloc,cuFree 等操作来讲,具有更好的性能和灵活性;RAPIDS libcudf 是基于 GPU 的 C++ DataFrame 库,提供了基础数据结构,并且内置了基础的函数算子。
客户挑战
Shark 的因子挖掘功能,通过利用遗传算法从数据中挖掘出有效的因子。在这一场景中,遗传算法会随机生成大量因子并进行计算。这一过程会频繁地创建和释放临时空间来存储中间结果,直接使用原生的 CUDA C 显存分配和释放接口,会严重降低执行效率。
Shark 的因子计算功能,针对金融领域的数据分析与处理,提供了丰富的函数库。如果从零开始将 CPU 的函数迁移至 GPU,需要为 GPU 重新实现一套底层数据结构以及基础计算函数,会导致开发周期的延长以及开发成本的增加。
应用方案
基于以上挑战,DolphinDB 开发团队与 NVIDIA 团队及 RAPIDS 开发团队合作,通过利用 RAPIDS RMM,解决因子挖掘过程中频繁申请和释放显存导致的性能问题;通过基于 RAPIDS libcudf 进行二次开发,实现因子计算,从而缩短开发周期,降低开发成本。
Shark 进行因子挖掘时,会通过遗传算法随机生成海量的因子计算公式。这些公式长度不等,接受的参数数量也不尽相同。因此在计算时,需要频繁地申请和释放临时空间用于存储中间结果。DolphinDB 开发团队通过使用 RMM 对显存进行池化,从而对中间结果所使用的显存进行高效地分配、释放和重用。
Shark 支持用户输入自定义的公式,并自动将自定义公式转换为计算图,并在 GPU 完成计算,从而加快数据分析和处理的效率。如果从零开始将 DolphinDB 的计算函数迁移至 Shark,需要在 GPU 构建 array、table 等底层数据结构,并实现大量基础计算函数。经过调研后,DolphinDB开 发团队决定基于 RAPIDS libcud f 进行二次开发,复用 cuDF 的 column、table 等底层数据结构;并借助 cuDF 的 groupby 和 rolling 框架,只需要完成算子的核心计算逻辑,即可完成 DolphinDB 时序算子和横截面算子的迁移,极大提升了开发效率,降低了开发成本。
效果
下图展示了在不同规模数据下,使用 RAPIDS 的 RMM 显存管理库相对于原生的 CUDA显存分配 API,Shark 因子挖掘效率的对比。可以清楚地看到,使用 RMM 可以显著提升 Shark 因子挖掘效率,最高可达到 10 倍的加速比。
除此之外,Shark 通过使用 RAPIDS libcudf,大大提升了因子的计算效率。下图中对比了 1000 个 group,每个 group 有 10 万行的数据,采用分组方式计算下面的算子。可以看到与 CPU 相比,利用 GPU 总体耗时(包含拷贝时间),基本达到了一个数量级的加速比。
借助 RAPIDS,Shark 的因子挖掘效率提升了 10 倍。除此之外,基于 cuDF 进行二次开发,只需要实现算子的核心逻辑,就可以达到一个数量级的加速,并极大降低了算子迁移成本。
准备好开始了吗?
探索适用于金融行业的 NVIDIA AI 解决方案及企业级 AI 平台,请访问: www.nvidia.cn/industries/finance/