大力出奇迹,GPU 加速 TiDB | TiDB Hackathon 2020 优秀项目分享
近日,由 TiDB 社区主办,专属于全球开发者与技术爱好者的顶级挑战赛事——TiDB Hackathon 2020 比赛圆满落幕。今年是 TiDB Hackathon 第四次举办,参赛队伍规模创历届之最,共有 45 支来自全球各地的队伍报名,首次实现全球联动。经过 2 天时间的极限挑战, 大赛涌现出不少令人激动的项目。为了让更多朋友了解这些参赛团队背后的故事,我们将开启 TiDB Hackathon 2020 优秀项目分享系列,本篇文章将通过 Mods 团队与云启资本合伙人陈昱的对话,揭秘团队赛前幕后的精彩故事。
Mods 团队的两位成员孙若曦、徐飞相识已久,笑称对方为「 最默契的人 」。在本次 Hackathon 中他们使用 GPU 加速技术,为 TiDB 带来新的扩展性提升。该项目最终获得三等奖和云启资本 — 最具市场潜力奖。今天我们将分享作为决赛第一组进行答辩的 Mods 团队与云启资本合伙人陈昱的访谈 ,探秘三位工程师(陈昱此前曾是 Google 的工程师,曾和 Spanner 论文其中一个作者坐在同一格子间里)关于 「 GPU 加速 TiDB 的紧张故事 」。
Q
Mods 团队的名字的由来和组队趣事儿?
Mods:我们队伍的两个人都是毕业就进入 N 厂(英伟达),一起在上海的 GPU Mods 组,后来又都进入了 P 社( PingCAP)。这次我们想做一个 GPU 加速的项目,索性就直接用了 Mods 这个队名。
Q
很好奇,英伟达大家都会去做偏 AI 的东西,当时为什么会加入一家数据库公司?
Mods:加入 PingCAP 的原因是我们都认为大数据和数据库市场的前景是比较广的,而且我们在英伟达更多的也是做一些偏底层、偏基础设施方面的工作,我们觉得这方面的经验是有可能被应用到同样是基础软件的大数据和数据库这方面的工作上的,因此就做了这样的选择。
Q
陈昱老师也是工程师出身,最终选择 Mods 团队的原因有哪些?
Q
陈昱老师之前应该也有参加过 Hackathon 吗,是如何看待这种活动形式的?
Q
Mods 团队可以分享一下最初做这个项目的灵感和分工吗?
分工方面主要还是从项目的整体设计和架构出发,先头脑风暴出一个比较干净和优雅的分层,架构分层干净意味着可以互相解耦,各自独立开发,从而效率得到保证。接下来再细化分层之间交互的接口,我们对整个分层之间的 API 做了很精细的设计,具体细化到了每个 API 的参数、返回值、调用顺序、并发模型等等。虽然前期的设计和讨论花了比较长的时间,但带来了更多中后期开发效率上的收益(虽然整个项目周期也没有很长,笑~),各自实现自己模块的时候,不会被对方的节奏和进度打乱。
具体的分工上,我会去实现 GPU 计算层的整体框架和一部分 GPU 算子,徐指导实现 TiDB 侧的对接,包括执行计划的翻译以及执行器的实现,以及另一部分 GPU 算子。我们知道 Apple 在 2020 年已经不再支持 N 卡和 CUDA 开发了,而我们两个的主力开发机都是 MacBook,只有我家里一台装了 RTX 2080 的台机可以用来写 GPU 代码。这时候架构上的分层设计就体现出了它的意义。我们将算子的具体实现从框架层剥离开,并在非 GPU 环境下提供了一套十分原始但是可运行的 CPU 算子实现,使得 GPU 无关的代码可以搭配这套 CPU 算子在非 GPU 环境下独立进行开发和调试,这就极大减小了我们对我那个台机的依赖。至于 GPU 算子,只能在我的台机上开发调试,我和徐指导基本上是分时复用,因为作息配合也比较默契所以没什么冲突(或者发生冲突时我把徐指导 kill 掉因为毕竟机器在我手里)。
另外一点,就像前面提到的,我们通过分层设计以及抽象出一组简洁的 API,使得整个项目具有很大的架构上的灵活性。我们只需在 TiKV 或 TiFlash 中完成与 TiDB 对接相同的工作,就可以将这套算子整合到其中,从而实现下推到 TiKV 和 TiFlash 的计算也通过 GPU 来加速执行,这样就具备了扩圈到整个 TiDB 生态甚至生态之外的扩展性。
Q
这个东西实际上是可以泛化去支持其他(素板卡)类型,比如说 A 卡我能不能用(OpenCL )去做加速或者怎么样?
Q
听完 Mods 团队分享的前期灵感及分工故事,陈昱老师有什么其它想法希望分享的?
Q
Mods 团队是第一个进行决赛 demo 的团队,这里有什么缓解紧张故事可以分享的?
Mods:这是一个紧张的故事,最开始我是听到隔壁组的抽签结果,他们第二个答辩,我们还安慰他们说没事。结果几秒钟之后看到我们竟然是第一个答辩,然后他们就来安慰我们了。当时的第一反应是来不及紧张了,直接抱着电脑去调试设备。另外在场的其他组的小伙伴还是给了我们很大的鼓励,说早早答辩完,就可以一下午吃吃喝喝看别的组翻车,多舒服。虽然可能这些话他们自己都不大信,但是确实让我们心情平静了很多。我们的心里建设也就是给自己打一针鸡血,干就完了,争取把场子热起来,给大家开个好头。
Q
陈昱老师是如何在看完剩下 27 个项目之后还没有变心的?
Q
今年的 Hackathon 只有 24 小时的时间来做项目,Mods 可以分享一些你们在比赛过程中有遇到一些什么困难以及是如何解决的?
比如 TPCH q17,经过 TiDB 优化之后的 plan 中会有一个对 lineitem 表(最大的表)做一个 aggregate。我们原始的 aggregate 实现中会直接把这个大表所需要的列全部加载到显存,一次性完成 aggregate,这样实现起来很快,效率也最高。但是因为我们的硬件只有 8GB 显存,而 aggregate 之前的大表数据已经占用了 6GB 显存,后面进行 aggregate 计算所需要的资源就不够了。所以我们被迫使用了分桶的方法,将 aggregate 之前的数据预先分好桶,然后每个桶分别计算 aggregate,技术上很简单,但需要一些相对比较烦琐的编程及调参,另外效率上也不及一次性算完。最后我们分了 16 个桶才把这个 aggregate 算出来。
另外一个就是编程语言的问题。TiDB 是用 Go 语言实现的,而我们这个项目因为要使用 CUDA,因此只能使用 C/C++ 技术栈,把 Go 语言和 C/C++ 结合起来只能借助 Cgo。大量使用 Cgo 会带来很大的编程负担,好在我们有了分层的设计和中间一套简洁优雅的 API,Cgo 只需要在 API 层使用,极大的减小了这部分负担。另外,Go 和 C/C++ 的最大的区别在于 Go 是 GC 语言,而 C/C++ 是没有 GC 的,需要手动管理内存,对于需要使用大量内存处理大批数据,同时对显存的使用又必须非常精细的这样一个项目,两边对象的生命期管理就成为一个很大的挑战。但也因为有这样一个强力的约束,倒逼我们去更加仔细的编码和测试,从而完成最后的 demo。
在 TiDB 接 GPU 的过程中还有个困难就是两边的数据格式不太一样。一些 primitive 的 type 比如 Int、Float 之类的是可以直接兼容的,但是像 String、Date、Decimal 这些复杂类型就不是很容易兼容了,为了让 TPCH 能跑起来,我们对 String 类型在 TiDB 这边做了一定的修改使得它能兼容 GPU 的计算引擎,而 Date 类型则在 GPU 计算引擎那边兼容了 TiDB 的 Date 格式,相比 String 和 Date 这种只需要做小部分改动,Decimal 类型要兼容则困难了许多,由于时间实在有限,我们最后选择在生成 TPCH schema 的时候把 Decimal 类型替换成 Double 来绕过了这个问题(如果有足够多的时间能让我们完成 Decimal 类型的兼容的话,那 GPU 的加速应该还能更明显一点,这点也算是我们的一点遗憾吧。)
TiDB 的生态很广,所选用的编程语言也非常庞杂:TiDB 是 Go,TiKV 是 Rust,TiFlash 是 C++,TiSpark 是 Java 和 Scala。徐指导是我认识的唯一一个这五门语言全都写过的 TiDB 开发者。
Q
刚刚说到了一些遗憾,那如果时间更充裕,有什么可以做的更好的?
Q
刚刚 Mods 团队分享了他们在过程中遇到的一些技术困难和遗憾,陈昱老师作为工程师有什么其它建议或者想要了解的更多细节吗?
云启资本陈昱:对,其实也是和显存相关的东西。做 GPU 计算的时候,需要把数据装载到显存里,但单块显卡的显存毕竟是有限的,是否能利用虚拟化的方法,把机器上的若干块板卡,甚至说其他机器的板卡,组成一块大的 GPU 虚拟板卡,这样就能有几乎无限的存储和算力来完成 GPU 计算任务。
Q
Mods 团队获得了两个奖,陈昱老师对这个项目未来有什么期待与展望吗?
云启资本陈昱:希望他们赶快合并到 TiDB 的主代码库,这是最大的期许了。
Q
Mods 团队自己有什么期待?
Q
最后的彩蛋缓环节,请大家分享一下除了自己的项目外,最喜欢哪个项目?
关于云启资本
云启资本成立于 2014 年,一直坚持专注于 To B 领域的早中期投资,围绕技术赋能产业升级,进行系统化布局,投资领域覆盖企业服务 SaaS、产业数字化、智联设备、先进制造等行业,投资组合包括 360 数科 (NASDAQ: QFIN)、英科医疗(SZ: 300677)、一起写(被快手收购)、酷家乐、百布、PingCAP、Zilliz、德风科技、冰鉴科技、XTransfer,环世物流、找钢网、小胖熊、智齿科技、晓羊教育、擎朗智能、新石器、e 换电等近 100 家优秀创业公司。
✨了解更多内容欢迎观看 Mods 团队精彩 Demo Show👇
TiDB Hackathon 2020 项目分享