2

腾讯大数据官方的个人空间

 2 years ago
source link: https://my.oschina.net/u/4956788/blog/5030797
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

腾讯Kona JDK数据科学实践

导语:开源操作系统年度技术会议(Open Source Operating System Annual Technical Conference,简称 OS2ATC)已经连续成功举办了八届。该会议旨在促进我国操作系统及其相关领域的教学、研究与产业发展,加强学术交流,展示产业界成果,是中国地区颇具规模的技术盛会。

第八届OS2ATC大会于2020年12月27日,在北京中科院计算技术研究所举行。在”编程技术”分会上,腾讯高级工程师傅杰博士发表了《Kona JDK数据科学实践》的演讲。以下为演讲实录:

图片

大家下午好!首先,要特别感谢组委会精心准备了这次线下和线上相结合的学习和交流的机会。很高兴能跟大家分享Kona JDK在数据科学领域实践的相关内容。我是来自腾讯JVM团队的jiefu(傅杰),OpenJDK社区的Committer,目前主要从事Kona JDK在大数据和机器学习等领域的探索和实践。我毕业于中科院计算所,在此也谨代表计算所对大家的到来表示欢迎和感谢!

今天,我首先向大家简单介绍一下Kona JDK;随后,通过几组真实的数据,向大家展示编程语言在数据科学领域面临的巨大挑战;最后,分享为了应对上述挑战所进行的实践和尝试,希望对大家能有所启发。

Kona:JDK15中国企业贡献第一

Tencent Kona是腾讯基于OpenJDK研发的一款JDK产品,于2019年免费对外开源(https://github.com/Tencent/TencentKona-8),并提供长期支持(LTS)。Kona发布的版本都经过了腾讯云和内部超大规模生产环境的验证,欢迎大家下载使用。

图片

2020年9月JDK15正式对外发布,Kona贡献度在中国企业排名第一,并且在国内历史首次作为全球Notable贡献者被OpenJDK社区主导者Oracle公司点名致谢(https://blogs.oracle.com/java-platform-group/the-arrival-of-java-15)。腾讯成立了专门的JVM研发团队(含多位OpenJDK社区的 author/committer),负责Kona的研发和维护。在解决公司内部迫切需求的同时,团队高度重视对外开源工作,参与了包括jdk(jdk17/16/15/14/11u/8u), Panama和Loom等OpenJDK社区重要项目。仅2020年,Kona向OpenJDK社区贡献了70多个commit,主要涉及HotSpot(JIT、Runtime和GC)、SVC、Core Libraries和Infrastructure等领域。其中比较重要的包括:HotSpot核心模块9个patch、Vector API AVX512向量支持 6个patch、map大堆Heap Inspection并行加速优化4个patch。未来,Kona将以更加开放的姿态,积极拥抱开源,并持续贡献开源。

数据科学场景的挑战

图片

接下来,通过几组业务系统的数据,向大家量化地展示编程语言在数据科学领域所面临的巨大挑战。上图左边的数据来源于腾讯云大数据平台。目前,该平台每日需要处理的实时计算量达到了万亿次,足以支撑起万亿级维度的模型训练,对现代编程语言的算力提出了非常严苛的要求。右边的数据来源于大家每天都会用到的微信的支付日志系统。该系统每日新增的数据高达万亿条记录,底层存储的规模早已突破PB级别。海量的数据要求编程语言对大内存系统提供有力的支持,以高效实现增删改查等业务逻辑。

由此可见,在现代数据科学场景中,编程语言在算力加速和大内存支持等方面正面临十分严峻的考验。下面,我们以Java为例,向大家展示为了应对上述挑战Kona所进行的相关实践。

JVM CPU算力加速

由于涉及大量向量和矩阵运算,SIMD(Single Instruction Multiple Data)指令是数据科学领域进行CPU算力加速的首选。SIMD加速,通常又被称为“向量加速”,具有效果显著、成本低廉的特点,越来越受到现代编程语言的青睐。其原理是将多个标量运算优化为更高效的向量运算,以充分发掘处理器向量部件的功能。例如,考虑下图中的for循环代码片段。如果使用常规的标量指令实现,需要16次数组读操作、8次数组写操作和8次数组元素加法操作;若使用向量指令,仅需要2次数组向量读操作、1次数组向量写操作和1次数组元素向量加法操作。所需操作总次数由32次降为4次,故理论分析出向量加速的效果十分显著。

图片

那么,实际情况果真如此吗?下面以HotSpot Java虚拟机的C2编译器为例,展示SIMD编译优化前后的对比。左图使用普通的标量指令,需生成24条指令。而右图使用SIMD优化,仅需1条向量指令。故实际情况与理论分析高度吻合。

图片

长期以来,Java的SIMD加速主要依赖JNI、Intrinsic和自动向量化等方案。但它们的缺点十分明显。例如,JNI编码维护难,且可移植性差;Intrinsic缺乏通用性和可扩展性;自动向量化条件苛刻,非常脆弱。为了解决Java的SIMD短板,OpenJDK提出了Vector API的编程接口,目前主体代码已经合并到了JDK16的开发分支,但至今仍处于孵化阶段。Vector API旨在提供一个简明易用且平台无关的SIMD加速接口。“编程可信”是Vector API最引人注目的设计目标。该目标保证使用Vector API编写的代码生成预期的SIMD指令。当然,这里的隐含的前提是处理器硬性必须支持相应的向量指令。“优雅回退”指在缺少向量支持的机器上,Vector API代码会自动回退到标量形式执行等价语义,并且性能不发生显著回退。

图片

Vector API对数据科学领域许多场景具有显著加速效果。例如,根据OpenJDK社区公布的数据,浮点向量点积运算为14~16倍加速;浮点矩阵乘法运算为2~5倍加速。而在腾讯机器学习模型训练系统中,也可获得高达50%以上的优化效果。Vector API现已集成到Kona JDK11向量版本中,并且在实际业务系统中通过了长时间的生产验证。在实际业务的联合测试中,我们发现并修复了多个Vector API AVX512向量支持的Bug,并全部贡献到了OpenJDK社区,部分Bug列表如下图红框所示。

图片

实践中,我们还发现了一个非常有意思的现象。如下图左侧所示,在对Vector API的一段小程序进行性能分析时,我们发现性能呈现大幅抖动的现象:要么2000+毫秒,要么5000+毫秒,并且呈明显的两点分布式统计规律。后来,经过仔细分析,确认性能的大幅波动由向量的非对齐访存导致。从处理器微架构层面分析,测试机Cache行长度为64字节,若使用256位的向量对cache进行访问,容易出现非对齐的向量访存。考虑读取一个256位向量的情形:1)若对齐,则仅需访问一个Cache行,共一次访存操作;2)若非对齐,则需要访问两个Cache行,至少两次访存操作,并且还需要进行额外的数据拼接操作。因此,为了尽可能发挥SIMD指令的性能,应尽可能减少非对齐的向量访存操作。

图片

JVM(超)大堆无暂停GC

下面跟大家展示Java如何强化对大内存的支持。长期以来,Java在大堆上一直存在GC停顿过大的痛点。传统的垃圾收集器可支持的堆空间通常只有几十个G。然而,部分业务所需的堆大小早已突破了百G的规模,并且呈逐年增长的趋势。为了解决(超)大堆的GC停顿问题,Java引入了一款名为ZGC的新型垃圾收集器。ZGC被设计为最大可支持TB级别的堆,最大GC暂停保证不超过10ms,并且对业务吞吐量的影响小于15%。

图片

下图展示了ZGC在腾讯某延迟敏感型业务场景的实践效果。优化前,系统只能达到3个9的实时性要求;优化后,实现了5个9的强实时性突破,并且吞吐量也获得了约15%的提升。Kona的实践表明:ZGC是超大堆或者延迟敏感型业务的首选。

图片

小结

图片

Vector API和ZGC有效解决了现代数据科学场景对Java的挑战。同时,现有大数据技术栈/生态主要基于JVM构建,并且存在海量的Java生产系统、工具和编程类库,使得Java具备无可比拟的研发和维护效率。此外,Java生态还获得了世界顶级厂商的鼎力支持和背书。相信Java/JVM未来将持续在大数据和机器学习领域扮演重要角色!谢谢大家。

另外,欢迎大家关注和star Tencent Kona JDK 8:https://github.com/Tencent/TencentKona-8,同时也欢迎各位优秀的开发者加入腾讯JVM研发团队,扫描下方二维码,来加入我们吧!

图片

参考资料

[1]JDK15简介:

https://blogs.oracle.com/java-platform-group/the-arrival-of-java-15

[2]Kona JDK源代码:

https://github.com/Tencent/TencentKona-8

[3]腾讯大数据平台最新数据:

https://new.qq.com/omn/TEC20200/TEC2020091100744400.html

[4]微信支付万亿日志在Hermes中的实践:

https://www.infoq.cn/article/N9DsUee4tTrktXmVmVAP

[5]Vector API源代码:

https://github.com/openjdk/panama-vector

[6]Kona11揭秘: 

https://cloud.tencent.com/developer/article/1627658

[7]Vector API资料:

https://static.rainfocus.com/oracle/oow19/sess/1553206138311001UVQD/PF/OCO19-Vector_API_1569011845017001idU3.pdf

[8]ZGC:

http://cr.openjdk.java.net/~pliden/slides/ZGC-FOSDEM-2018.pdf

图片

扫码关注 | 即刻了解腾讯大数据技术动态


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK