开发者分享 – - //www.krtcgo.com 新一代人工智能开源开放平台 Wed, 07 Jul 2021 07:25:10 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.9 //www.krtcgo.com/wp-content/uploads/2025/04/favicon.png 开发者分享 – - //www.krtcgo.com 32 32 参与 开源项目心得分享——韩冰杰 //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e9%9f%a9%e5%86%b0%e6%9d%b0/ //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e9%9f%a9%e5%86%b0%e6%9d%b0/#respond Wed, 07 Jul 2021 07:25:10 +0000 https://new.openi.org.cn/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e9%9f%a9%e5%86%b0%e6%9d%b0/ 1. 天璇项目简介

2019年3月,第六十八次AVS会议完成AVS3-P2基准档次制定工作,AVS3作为新一代视频压缩标准,相比上一代标准AVS2和HEVC,可节省近30%码率。会议之后,北京大学深圳研究生院数字媒体研究中心王荣刚老师团队便开始着手AVS3解码器开发,并于2019年12月同时在鹏城实验室启智开源平台和Github开源,项目代号为“天璇”,又名“uAVS3d”。开源之时,uAVS3d已成雏形,解码性能达业界领先水平,并覆盖PC、手机等常用智能设备,开源之后至今(2021年1月13日),又迭代代码60余次,性能、平台适配和代码鲁棒性进一步提升。

uAVS3d支持Android/IOS/Windows/Linux/MacOS等常用系统平台,并针对ARMv7/ARMv8/X86架构处理器做了深度优化,支持高位深(10bit)解码,具备高效的并发性能。在PC端可以实现8K实时解码,在移动端可支持4K 30fps视频实时播放。不论是单线程的解码速度还是解码并行度,uavs3d均大幅领先AV1的开源解码器dav1d和aomdec。

PC端uAVS3d与AV1和HEVC常用解码器的解码性能对比如下:

2. 开发心得

天璇项目于2019年3月启动,5月底即输出x86优化版本,可实现8K视频实时解码,之后又快速推出了Android和IOS版本,快节奏加之高性能引起了业内不少关注。华为在uAVS3d移动版本完成之后的第一时间(开源之前)便与我们接触,针对华为手机做定制性优化;腾讯、百度、爱奇艺、Bigo等视频服务商也在开源前后相继测试跟进,部分厂商已上线应用;uAVS3d的接口文件也已集成至多媒体处理开源平台FFmpeg的主分支,方便第三方集成验证。

取得如今的成果,着实不易,技术层面,uAVS3d之所以能快速成型,与所在团队多年的积累是分不开的,数字媒体研究中心曾先后研发AVS+/AVS2编解码器,已积累大量优秀代码和经验。本人作为项目开发者之一,主要负责解码器的关键模块优化,具体贡献为添加分像素插值、帧内预测、IDCT中DCT2部分、ALF、Deblock、SAO以及其它部分细节模块的SIMD指令实现,SIMD指令覆盖SSE/AVX2/ARMv7/ARMv8,并且bitdepth为8和10的两个版本独立优化;数据结构方面,调整UV分量存储结构,以提升SIMD并行效率。本人是15届北大深研院数字媒体研究中心毕业生,读研期间曾参与AVS2解码器的模块优化,对各模块的SIMD优化细节有一定了解,17年重新加入团队,之后,因项目需要,曾负责AVS2解码器移动端优化,对解码器部分结构调整(UV分量重建像素交织存储,熵解码实现调整)、完善ARMv7/ARMv8汇编,使得AVS2解码器性能追齐业内领先的HEVC解码器。有了uAVS2d的开发经验和代码积累,uAVS3d的模块优化就顺利很多,AVS3的基本框架与AVS2一脉相承,多个模块大同小异,只是AVS3的块尺寸类型比AVS2要多不少,给汇编优化带来一定挑战。个人从uAVS3d项目开发中,收获很多,加深了对编解码框架的理解,移动端开发和汇编代码编码也更加得心应手。

关于项目社区的沟通协作和运营,本人也是受益很大。第一次负责开源项目的运营,项目说明、开源协议选择、版本维护都趟过一些坑,好在选择的开源平台( 和Github)以及版本管理工具(git)功能完善,服务稳定易用,目前项目维护已走上正轨。

最后,给开源社区的开发同僚们分享些个人体会和建议:

  1. 认真对待每个开发细节,项目整体的效能是众多细节实现的集中体现,细节实现水平可能就是项目脱颖而出的关键。

  2. 放平心态,开源意在分享,为后来者铺路,减少重复工作,不宜太计较单个项目的得失。技术讲究厚积薄发,认真写下的每一份代码终是个人积累的财富。

  3. 项目启动之前做好调研分析,选择合适的方向,了解现有工作,预估所能达到的效果,尽可能少做无用功。

]]>
//www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e9%9f%a9%e5%86%b0%e6%9d%b0/feed/ 0
uavs3d_uavs3e开源项目心得——王振宇 //www.krtcgo.com/uavs3d_uavs3e%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97-%e7%8e%8b%e6%8c%af%e5%ae%87/ //www.krtcgo.com/uavs3d_uavs3e%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97-%e7%8e%8b%e6%8c%af%e5%ae%87/#respond Wed, 07 Jul 2021 07:22:17 +0000 https://new.openi.org.cn/uavs3d_uavs3e%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97-%e7%8e%8b%e6%8c%af%e5%ae%87/ 项目背景

2018年12月,我有幸参与了“数字音视频编解码技术标准工作组”(简称AVS工作组)在深圳鹏城实验室进行的AVS3标准封闭开发。封闭开发初步完成了AVS3标准第一阶段的制定工作以及参考软件的开发和测试。2019年3月的AVS工作组第68次会议上,AVS3第一阶段标准正式公布。当时,正是新一代视频编码标准制定的关键时刻。国际上,AV1标准正在大力推广,VVC标准也处于紧张制定的过程中,并在压缩效率上处于领先地位。与此同时,中美贸易战和科技战也正在火热进行,我国的科技公司面临越来越大的压力。而视频编码标准是视频数据传输和存储的基础技术之一,一个友善的视频编码标准对我国信息产业的发展和安全,具有非常重要的作用。

因此,在标准定稿的第一时间,我们课题组就启动了AVS3编解码库的软件开发工作,力争尽快推出可商用的AVS3编解码库,加快AVS3标准的应用和推广。

 

开源心得

在我们进行AVS3编解码库开发的最初阶段,并未考虑以开源的形式发布,更多倾向于以可执行库的形式发布,并期待后续进一步的商业合作。但在接触了多个主要的互联网厂商之后,我们意识到了AVS3标准面临的困难。由于H.264、HEVC等标准具有非常成熟的开源编解码器,国内外行业内的参与度很高,具有非常完整的技术生态。因此,AVS3如果不能建立起较好的生态,业内的各个厂商将始终会处于观望态度,难以下决心投入使用。其次,业内的多数厂商对于各自的应用,都有不同的定制需求,同时对代码的把控也具有一定的要求。因此,非开源的编解码库对于大家意义有限。

所以最后,为了AVS3标准的推广,我们选择了开源,一方面希望能够吸引更多的参与者,包括参与编解码库的开发,以及参与标准相关生态的完善工作(例如各种系统层封装的支持等)。另一方面,我们也希望开源的编解码库能提供各个厂商一个开发的基础版本,大家可以在这个基础上进行各种需要的私有的定制化开发,而省去基础编解码平台的开发工作。当然,开源并不意味着生态就可以如预期一样建立起来,但是我们希望能抛砖引玉,为AVS3标准的推广开一个头。

 

项目心得

在项目的开发过程中,我们也取得了很大的收获。

首先,项目开源后,获得了很多的关注,很多业内同行在不同的平台上编译、运行和测试AVS3编解码库。通过这些测试,我们积累了很多测试反馈,对编解码库的跨平台支持、编解码库运行的鲁棒性提升等,都有很大的帮助。

同时,除了我们自己项目组,还有其他一些厂商或个人开发者向我们的项目提交了代码,包括多平台的一些支持、编码算法、以及一些底层优化代码等,帮助项目进一步完善。

此外,项目的开源,对项目组的同学的工作也是一个认可。项目组的同学的工作可以得到更广泛的了解,对同学们个人也是一种很好的激励,能更好地调动大家的积极性。

最后,为了在开源过程中降低各参与者沟通和协调的代价,我们在代码风格、框架设计、代码文档等方面,都做了很多的改进和完善,也进一步提升了我们团队自身工程开发的能力。

作者:王振宇

]]>
//www.krtcgo.com/uavs3d_uavs3e%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97-%e7%8e%8b%e6%8c%af%e5%ae%87/feed/ 0
参与 开源项目心得分享——方维 //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e6%96%b9%e7%bb%b4/ //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e6%96%b9%e7%bb%b4/#respond Wed, 07 Jul 2021 07:13:12 +0000 https://new.openi.org.cn/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e6%96%b9%e7%bb%b4/ 作为开源脉冲神经网络框架惊蛰(SpikingJelly)的开发者之一,我有幸参加了12月初在北京举办的2020年OpenI开发者大会,并获奖成为首批 优秀开源开发者。借此机会,我想分享一下我的开源经历和感悟。

参与开发

第三代人工神经网络脉冲神经网络(Spiking Neural Network, SNN)具有事件驱动、低功耗、高仿生的特点,一直是神经科学领域的研究热点。近年来机器学习方法逐渐应用于SNN并取得了突破性的性能提升,使用SNN进行深度学习成为新的前沿交叉研究热点。我对于这一新兴的研究方向充满兴趣,但在研究中发现:

  1. 传统的深度学习框架并不直接支持SNN,因此许多研究者不得不从零开始实现所需的SNN模块,造成了大量的重复劳动

  2. SNN从生物神经元简化而来,不同开发者对SNN的实现方式不同,造成了定义的混乱,代码难以复用

  3. 绝大多数代码都没有配套的文档,给学习和使用带来了麻烦

这些问题是包括我在内的所有SNN深度学习的研究者面临的难题。目前这个领域还没有一个成熟的框架,如果有一个类似于ANN中Caffe、PyTorch那样的深度学习框架则可以解决上述问题。为了我们自己研究的有序进行、实验的顺利开展,以及方便其他研究者的使用,避免重复劳动,实验室的老师和博士生们讨论后决定,自行开发一款全新的开源SNN深度学习框架,即惊蜇(SpikingJelly)。

 我个人参与惊蜇的开发,主要原因是:

  1. 研究方向与框架的应用背景完全契合,在学习该领域的前沿知识时,可以同时在框架中进行代码实现,理论和实际实验可以顺利结合,互为补充

  2. 一个完善的框架有助于我顺利进行各种实验、与他人分享我的研究成果,并确保我的研究成果的可复现性

  3. 希望能够继续为开源社区做出更多贡献,减少开发者的重复劳动,提升科研效率

惊蛰框架的开发,在2019年11月正式开始,早期主要是由包括我在内的北京大学的几位博士生,在老师们指导下进行开发。开发之初,我们就将此框架完全开源在GitHub上,希望能够吸引其他感兴趣的开发者参与贡献、共同推进。

社区支持

惊蛰框架在开发过程中逐渐受到脉冲神经网络领域研究者的关注,并得到了许多开发者和开源社区的支持,主要包括:

  1. 一些用户通过issue的方式提供建议

  2. 开发者报告bug,或提交pull request来修复bug

  3. 鹏城实验室的开发者提供了CUDA性能优化的建议、补充CUDA代码、补充文档教程翻译

  4. OpenI社区提供了镜像服务器,在国内拥有更快的访问速度;提供了无限存储空间的公网存储服务器,惊蛰框架据此建立了部分数据集的下载镜像

  5. 鹏城云脑提供了强大的算力支持,惊蛰框架在云脑上进行了大量性能实验和代码调试

最后,惊蛰项目还成功申请成为首批 优秀开源项目,作为开发者之一,我也很荣幸地参加了2020年OpenI开发者大会,获益匪浅。

 

开源心得

在开源社区的支持下,经过一年的开发,惊蛰框架已经颇具规模,开发者可以通过使用惊蛰框架迅速搭建起高性能脉冲神经网络并进行深度学习。回顾这一年的开源经历,我的总结如下:

  1. 积极拥抱开源。众人拾柴火焰高,个人的能力终究有限,而开源社区的力量是无穷的。开源的项目可以吸引广大开发者参与贡献,共同开发;开源的代码接受所有用户的审查,有助于敦促开发者提升代码质量;好的项目还能成为新项目的基石,衍生出更为丰富的功能

  2. 注重教程和文档的编写。好的开源项目要吸引用户的使用和开发者的参与,就必须注重易用性,不能有太高的上手和开发门槛,因此需要注重教程和文档的编写。条理清晰、通俗易懂的教程和文档是对用户和开发者的尊重,只有真心尊重用户和开发者,他们才会乐于使用并为项目做出贡献

 

]]>
//www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e6%96%b9%e7%bb%b4/feed/ 0
参与 开源项目心得分享——丁健豪 //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e4%b8%81%e5%81%a5%e8%b1%aa/ //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e4%b8%81%e5%81%a5%e8%b1%aa/#respond Wed, 07 Jul 2021 03:25:03 +0000 https://new.openi.org.cn/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e4%b8%81%e5%81%a5%e8%b1%aa/ 能够参加开源项目是一个机缘巧合,当时我正好在做ANN转换SNN的研究。有一次开会的时候,老师突然说,要不你把你现在的工程实践整理一下,放到师兄们开发的开源项目里面。当时我正好在写相关的代码,因为实验不成功,代码已经改版两次了。所以毫不犹豫地,我就接下了这个活,因为我知道要是做好了这个模块,就不需要重复造轮子了。之前其实也有相关的ANN转SNN的代码。在GitHub上有一个叫做NeuromorphicProcessorProject

/snn_toolbox的项目。但是这个项目更多地是面向神经形态硬件的,代码也没有PyTorch版本,主框架是拿keras写的。这就更加给了我开发的动力。其次,我觉得我们作为新一代研究者是有义务去推广脉冲神经网络的。人工神经网络(ANN)就不用说了,大家都很熟悉。而SNN则是脉冲神经网络(”所谓的第三代神经网络”),在现在的人工智能语境中其实没有那么受到重视。但是它有很多好的特性没有被大家注意到,比如说脉冲神经网络相比于GPU运行没有那么耗能源,而且在理论上的性能也是能够等同图灵机的。

ANN转换SNN的研究能够给深度学习和脉冲神经网络架起一座桥梁,我觉得这是一件特别有意思的东西。在师兄们开发好的框架上,我需要的就是利用现有的神经元模型,构建SNN,并且完成转换的SNN的仿真工作。SpikingJelly中的神经元模型,其实特别好用,我一直都是用PyTorch的,SpikingJelly的神经元定义,就和在PyTorch中定义ReLU一样,特别顺滑。如果需要对神经元进行重置,也只需要调用resnet_net就好,特别方便。

尽管如此,开发过程中也走了挺多弯路。因为ANN-SNN转换需要知道底层的PyTorch拓扑(类似ResNet这样的),最重要的就是选择一个合适的方式来处理PyTorch模型中的复杂拓扑。关于处理拓扑的方案其实选择了很久。最终,选择了基于另一个开源项目,ONNX。PyTorch中有实现接口可以无缝转换到ONNX模型。而且ONNX作为一个通用公用的模型表示方式可以使得今后其他框架的模型通过转换为onnx表示之后也可以通过我们的框架转换。这就使得我们的代码在未来可以发挥更加广泛的作用。

自从框架开源后,我们的贡献得到了更多人的关注。我想这就是开源的意义所在吧。尤其我们的定位是科研。这意味着更多研究脉冲神经网络的科研院所可以通过我们的工作、通过ANN-SNN转换的工作得到收获。ANN-SNN转换在SNN今后的研究中,可能更多地是一个baseline的存在,即便这样,我想能够做好这一件事情也是我们的荣幸。

作者:丁健豪

]]>
//www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e4%b8%81%e5%81%a5%e8%b1%aa/feed/ 0
参与 开源项目心得分享——陈彦骐 //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e9%99%88%e5%bd%a6%e9%aa%90/ //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e9%99%88%e5%bd%a6%e9%aa%90/#respond Wed, 07 Jul 2021 03:23:27 +0000 https://new.openi.org.cn/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e9%99%88%e5%bd%a6%e9%aa%90/ 开源,顾名思义,指的是开放源代码。开放意味着任何人都可以自由阅读每一行代码,这给开发者无形中提出了很高的要求。

个人开发者或者小团队往往没有“我的代码是要给别人看的”的意识,而是习惯于自说自话。人们在网上聊天时尚且能够注意言辞,但在将自己的代码开源时往往忽略了别人的感受。就以往的经历来看,许多团队将开源变成了任务,为了开源而开源,一手复制粘贴就把自己那套没什么注释和说明文档的代码扔到开源平台上。这些代码作者对于有人提问代码细节常常不予回复,而如果指出了代码漏洞,有礼貌的尚且能感谢并修补,更多的是石沉大海,讨论也就沉寂了。

因此开发者大抵需要意识到,开源一方面是为了让他人更好的学习,另一方面也是为了吸收他人的合理意见而改进代码。一个代码量稍大的项目或多或少都存在bug,被指出了问题至少说明有人在认真阅读代码,这也是工作被认可的标志。

就SpikingJelly的开发经历而言,早期的框架是非常不完善的,代码仓库也无人问津。这时候的框架还停留在仅依靠“托管代码”来进行版本管理的阶段。当时的框架定位在自用,完全忽略了社区的存在。使我们态度发生转变的是,在开源一段时间后,我们注意到了另一个功能定位完全类似的框架,其开发者是同一科研领域的科研人员。他们的人手非常少,只有两个来自不同国家的开发者主导开发,最初开源的时间也与我们很接近。不同的是,他们已经累积了一定量的用户,这些用户基本也是来自同一领域的科研人员,以及一部分正在观望学习,想要进入这个研究领域的新生血液。这让我们开始思考:开源框架是给谁看的?亦即目标用户群体究竟是谁。一个基于科研用途的框架要求使用者至少拥有基本的领域知识,这样的门槛实际上已经把目标用户刻画得十分清楚了。基于此,在开发时,代码各个模块的功能与科研中的研究对象必须有非常清晰的对应关系,不然本领域人员都无法理解的话,就不可能再有人来使用了。我们重构了代码的层次,使得这个映射关系更清晰,同时也开始撰写文档,提供一些简单的范例。

经过这次重构之后,的确出现了少数人来关注开源仓库,不过也仅此而已。没有人真正使用起来,同时我们也注意到,有不少研究者在关注我们的框架时,使用着国外的同期开发的框架。于是我们又提出了问题:我们的框架有什么优势?就问问题提出的当时,我们无法作答。因此必须设法给框架制造一个亮点。这也是迄今为止我们一直在努力的方向。

对于基础性的编程框架而言,不同的框架往往侧重不同,框架功能的多寡往往也与领域自身的发展息息相关。回顾TensorFlow和PyTorch这两个深度学习框架的发展史,我们能够清晰的观察到性能与编程友好性这两个指标之间的权衡贯穿始终。深度学习社区中不少人也同时使用两种框架并贡献代码,这使得两者能够互相借鉴,吸收对方的优秀功能。我们也大概会遵照类似的路线,在打造自身亮点的同时,吸收现有其它框架的成功经验。

作为一个小规模团队,我们的开源之路道阻且长,需要时间检验我们的路线是否正确并不断修正。也期待能有同领域的科研工作者通过OpenI发现与试水,为科研领域倾注源源不断的动力。

作者:陈彦骐

]]>
//www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e9%99%88%e5%bd%a6%e9%aa%90/feed/ 0
参与 开源项目心得分享——严翔东 //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e4%b8%a5%e7%bf%94%e4%b8%9c/ //www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e4%b8%a5%e7%bf%94%e4%b8%9c/#respond Wed, 07 Jul 2021 03:21:07 +0000 https://new.openi.org.cn/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e4%b8%a5%e7%bf%94%e4%b8%9c/ 2020年期间我有幸参加了启智开源项目,在这个活动中,我主要参加了启智磐石的开发,最终项目顺利上线并开始提供服务,这次我想分享一下我参与这个活动以及开源社区的感受与收获。

毫无疑问,参加一个开源项目是非常令人激动的,看着开源项目一步一步完善直到上线,这花费了我不少时间。但我从中也学到很多。由于以前并没有参加开源项目的经验,因此总结了一些心得,作为一个开源开发和之前工作中的不同之处。

1、在编码风格方面不需要太严格

编码风格的问题,当项目中设计了过于复杂的规则将增加开发的成本,人们会实时关注空格缩进带来的困扰,最好的方式是能用脚本自动化处理开发中的编码风格问题,比如将常用的eslint,go fmt工具封装为全局脚本。这样项目合作中可以很方便的进行沟通,而不需要经常通过人工来修改。最终,代码的提交以pull request的方式进行合并,最终我一点都不担心编码风格、测试会带来问题。

2、代码即文档

在开发的过程中我经常感受到,相比于不知道何时更新的文档,编写有清晰结构的代码和测试比文档更有用处。我可以毫不夸张的说:好的代码就是好的文档。当需要给系统增加功能时,最好的熟悉现有功能的方式不是找开发文档和寻找当时开发文档的开发人员进行询问,当项目足够健康时候,最好的方式就是阅读结构代码和测试。此外,别忘了swagger,当我们采用swagger时能够快速生成api的文档,这都能很好的提升开发速度。最后也有例外,比如当需要和第三方系统对接时文档的重要性就不言而喻。

3、有高效的沟通方式

在项目开发过程中,项目进度的控制时至关重要,我们在项目开发中沟通采用类似github的模式,由开发或测试人员在项目管理中添加任务,管理人员指派成员,尽量避免无意义的会议,如果沟通的越顺畅,我们自己就会越信任自己的项目。

4、多接触其他的开源项目

经常关注开源社区的项目以及他们的issuse和pr,特别是目前Golang社区里有很多优秀的项目。在他们的issue中和pr中很多人对项目的理解都很高,他们乐于分享在项目中遇到问题,经常阅读别人已经合并的pr已经代码能够拓宽视野,在遇到问题的时候能从多个角度思考问题。

5.收获

参加这次的开源项目带给我了很多收获:

第一是让我完全参与到开源之中,之前只在有些项目中提过一些pr去解决小问题,这次明确了开发目的切身体会了一次开源的感受。

第二在工作中也获得了很多启发,包括处理分布式大文件时候的一些项目经验,使得我可以更好地理解研究问题中的一些概念。

作者:严翔东

]]>
//www.krtcgo.com/%e5%8f%82%e4%b8%8e%e5%90%af%e6%99%ba%e7%a4%be%e5%8c%ba%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e5%bf%83%e5%be%97%e5%88%86%e4%ba%ab-%e4%b8%a5%e7%bf%94%e4%b8%9c/feed/ 0
开源分享——优秀开发者心得 //www.krtcgo.com/%e5%bc%80%e6%ba%90%e5%88%86%e4%ba%ab-%e4%bc%98%e7%a7%80%e5%bc%80%e5%8f%91%e8%80%85%e5%bf%83%e5%be%97/ //www.krtcgo.com/%e5%bc%80%e6%ba%90%e5%88%86%e4%ba%ab-%e4%bc%98%e7%a7%80%e5%bc%80%e5%8f%91%e8%80%85%e5%bf%83%e5%be%97/#respond Wed, 07 Jul 2021 03:18:13 +0000 https://new.openi.org.cn/%e5%bc%80%e6%ba%90%e5%88%86%e4%ba%ab-%e4%bc%98%e7%a7%80%e5%bc%80%e5%8f%91%e8%80%85%e5%bf%83%e5%be%97/ 1.初见开源

在2013年的时候,很荣幸在初期就参与了启智磐石初期版本的开发和维护,它让我接触了Linux,Ruby on Rails,也让我结识了Git,让我对开源,开源社区有了一个大概的了解和接触。

图标 描述已自动生成

2. 成为开源的受益者

毕业后的初始几年,参与了很多不通的项目,各种开源的组件给不通的项目的不通需求带来了很大便利性,去使用,阅读开元组件的源代码,查看实现逻辑,极大的提升了编码能力。基于丰富的组件和成熟的框架,MVC已经简化了大部分工作,我们慢慢的向前端转移,JS是开源社区最为活跃的语言,没有之一。从Jquery 一路到开源的React Native,虽然框架不在变化,解决问题的思路也在转变,到虚拟dom 的广泛应用,让交互的操作也变得简单,是各种各样的开源,使得开发变得简单和多样化。

在这期间我也加入了各种开源社区,参与了不同的线下开发者大会。扩充了我对知识的了解,由于参与过不同的项目,也尝试过TDD,CI。以及使用过各种敏捷开发工具如Slack以及Trello,他们为开源的交流提供了便利性。

3. 开源认识和收获

这些年参与了很多项目,对于开源社区贡献远远小于开源社区对我的帮助,这正是开源社区的力量,从微小的PR开始,从细小的功能出发,在自己的使用中总结并贡献开源。最后感谢启智磐石,引导我走进开源,参与开源,并最终贡献开源。

作者:谭显波

 

]]>
//www.krtcgo.com/%e5%bc%80%e6%ba%90%e5%88%86%e4%ba%ab-%e4%bc%98%e7%a7%80%e5%bc%80%e5%8f%91%e8%80%85%e5%bf%83%e5%be%97/feed/ 0
AI算子标准参考实现优秀开发者获奖心得 //www.krtcgo.com/ai%e7%ae%97%e5%ad%90%e6%a0%87%e5%87%86%e5%8f%82%e8%80%83%e5%ae%9e%e7%8e%b0%e4%bc%98%e7%a7%80%e5%bc%80%e5%8f%91%e8%80%85%e8%8e%b7%e5%a5%96%e5%bf%83%e5%be%97/ //www.krtcgo.com/ai%e7%ae%97%e5%ad%90%e6%a0%87%e5%87%86%e5%8f%82%e8%80%83%e5%ae%9e%e7%8e%b0%e4%bc%98%e7%a7%80%e5%bc%80%e5%8f%91%e8%80%85%e8%8e%b7%e5%a5%96%e5%bf%83%e5%be%97/#respond Wed, 07 Jul 2021 03:14:16 +0000 https://new.openi.org.cn/ai%e7%ae%97%e5%ad%90%e6%a0%87%e5%87%86%e5%8f%82%e8%80%83%e5%ae%9e%e7%8e%b0%e4%bc%98%e7%a7%80%e5%bc%80%e5%8f%91%e8%80%85%e8%8e%b7%e5%a5%96%e5%bf%83%e5%be%97/

在鹏城实验室实习的时候,主要的工作是开发AI算子标准参考实现。参考实现是对算子标准的补充,旨在提供代码级别的语义的规范,因此正确性是它的最重要属性。

开发一个新的算子接口是比较繁琐的,虽然标准文档中对算子接口已有比较明确的定义,但是为了给予标准实现者最大的优化空间,它没有规定实现的细节,这也给参考实现的开发增加了一点难度,因为我在开发新算子的时候常常要对这个算子重新调研,找到它的具体实现逻辑,再开发对应的接口。为了满足正确性的要求,在开发完一个新算子后,需要对它进行单元测试。这时候应尽可能给出不同情况的样例,然后将参考实现的结果与tensorflow、pytorch等框架的结果进行对比。

开发了一些算子接口以后,我发现不同算子之间会存在大量重复代码,经常有复杂算子包含了简单算子代码的情况出现,比如maxpool会重复max的代码。为了减少代码开发的工作量、降低代码维护难度,我先开发简单算子,然后让复杂算子中重复了简单算子的代码的部分替换成直接调用简单算子的方式。这种开发方式可能对性能要求高的算子库不适用,但是参考实现追求的是正确性,不考虑性能,因此参考实现的所有算子都可以采取这种方法进行开发。后来,参考实现的维护难度也降低了不少。

除了参考实现,我们还开发了一套自动化测试框架。对于不同的算子库来说,只要遵循了算子标准,那么它们对应的算子接口应该是差不多的:返回值是状态码,输入输出都在参数列表中,参数之间的前后顺序也一致。对算子进行正确性测试的逻辑也是一致的,即生成输入样例、算子运算、对比结果。对于计算机来说,不同的地方在于数据结构(张量等)和函数名。那么,我们只要把测试样例和测试流程代码提前写好,让用户把自行开发的算子的函数名和创建张量等数据结构的接口注册到自动化测试框架中,框架就可以自动地对算子进行正确性测试了。所以,自动化测试框架的关键技术就是接口注册机制。我们调研以后发现,Google Test的“类型参数化”机制可以让用户在触发测试的时候才指定测试代码中某些变量的数据类型。我们就把“类型参数化”作为接口注册机制的原型,通过宏把用户的接口封装到一个类中,用户的接口就“假扮”成了一种数据类型,然后我们在测试代码中从对应的变量里提取出用户的接口,就可以实现接口注册了。

完成以上工作以后,我发现最大的工作量不是写代码,而是写代码之前的调研和设计。我也曾试过草草调研之后就着手写代码,短期内似乎是可行的,但是在后期只要遇到一个bug,我就得花大量时间去调试、调研,得不偿失。运筹帷幄之中,决胜千里之外。

作者:黎子毅

]]>
//www.krtcgo.com/ai%e7%ae%97%e5%ad%90%e6%a0%87%e5%87%86%e5%8f%82%e8%80%83%e5%ae%9e%e7%8e%b0%e4%bc%98%e7%a7%80%e5%bc%80%e5%8f%91%e8%80%85%e8%8e%b7%e5%a5%96%e5%bf%83%e5%be%97/feed/ 0
参加启智开发社区“人工智能算子开发接口标准参考实现”项目的心得与收获 //www.krtcgo.com/%e5%8f%82%e5%8a%a0%e5%90%af%e6%99%ba%e5%bc%80%e5%8f%91%e7%a4%be%e5%8c%ba%e4%ba%ba%e5%b7%a5%e6%99%ba%e8%83%bd%e7%ae%97%e5%ad%90%e5%bc%80%e5%8f%91%e6%8e%a5%e5%8f%a3%e6%a0%87%e5%87%86%e5%8f%82/ //www.krtcgo.com/%e5%8f%82%e5%8a%a0%e5%90%af%e6%99%ba%e5%bc%80%e5%8f%91%e7%a4%be%e5%8c%ba%e4%ba%ba%e5%b7%a5%e6%99%ba%e8%83%bd%e7%ae%97%e5%ad%90%e5%bc%80%e5%8f%91%e6%8e%a5%e5%8f%a3%e6%a0%87%e5%87%86%e5%8f%82/#respond Wed, 07 Jul 2021 03:11:35 +0000 https://new.openi.org.cn/%e5%8f%82%e5%8a%a0%e5%90%af%e6%99%ba%e5%bc%80%e5%8f%91%e7%a4%be%e5%8c%ba%e4%ba%ba%e5%b7%a5%e6%99%ba%e8%83%bd%e7%ae%97%e5%ad%90%e5%bc%80%e5%8f%91%e6%8e%a5%e5%8f%a3%e6%a0%87%e5%87%86%e5%8f%82/

在过去一年的时间里,我有幸参与了“人工智能算子开发接口标准参考实现”在 的开源和研发工作。从项目有大致雏形、到顺利开源在OpenI 、再到预期功能模块不断迭代完善,这段时间我们进行了大量的调研和开发,克服了很多困难。2020年12月,我们的项目成功获得了社区评选的“优秀开源项目”荣誉,我个人也获评首届“优秀开发者”和“突出贡献者”。这些荣誉对于团队来说是巨大的肯定,而对于我个人来言更是一种别样的经历和收获。

实际上,我从研一入学就开始接触“人工智能算子开发接口标准参考实现”相关的工作了。为了尽早确定自己研究生期间的方向,我在完成本科毕业答辩之后,向研究生导师申请提前一个月来实验室实习。那时组里“人工智能算子开发接口标准参考实现”的预研工作刚刚起步,项目中“国产化”、“人工智能”和“标准化”等标签在中美贸易战的背景下显得十分不同寻常,也给我留下了非常深刻的印象,经过一番争取,我顺利的加入到项目中来。

本以为带着本科积累的基础进组,我能够在项目中游刃有余,真正做起来才发现,标准参考实现的研发并不是一件容易的事。特别是在项目开源到 之后,我们更加意识到这事情的难度,以及把它做好的重要性。“人工智能算子开发接口标准参考实现”是“人工智能算子开发接口标准”中非常重要的一部分,它的目的是为标准提供一份基于特定语言的参考实现,从而能够保证标准语义的完整性。由于同时涉及到上层AI计算框架和底层硬件实现,因此完成一个接口的标准化和实现,往往要对已有的计算框架和算子库进行深入的调研和总结,必要时还需研读算子对应的论文,尝试对其进行复现和重构。从一个功能的吃力摸索,到逐渐上手熟练,再到下一个功能的艰难探索,这样的认知循环从项目开始一直持续到现在。其中最让我沉迷的环节,就是对一个功能模块逐渐熟练之后再对其进行思考和重构,过程中我常常发现自己之前看过的一些的开源代码思路竟然神奇的解决了现有代码的关键问题,便忍不住为其拍案叫绝。

当然,项目并不总是顺利的,我也遇到了很多阻碍。比如进行项目重构时因为对CMake一窍不通而花费数周时间啃下《CMake Cookbook》;比如阅读Eigen和MShadow代码时被其中出神入化的C++表达式模板技术数次劝退;再比如数据布局中的物理顺序和逻辑顺序之间的差异区分,这些问题的难度与本科接触到的项目难度完全不可同日而语。非常幸运的是,我的导师杨超老师和师兄敖玉龙都十分尽心尽责,他们会在每次组会交流时从不同角度分析所遇到的问题,讨论项目的发展方向,并给我鼓励和肯定,让我得以快速突破瓶颈,获得成长。在这里我要特别感谢我的导师和师兄在整个项目过程中给我的鼓励和帮助。除此之外,我还要感谢我的“战友”黎子毅同学、李雨芮师妹以及范睿博师弟,他们做事情认真负责,项目中很多关键功能的实现都是我们一起经过无数次调研、讨论和迭代的结果,“优秀开源项目”的荣誉与他们的努力息息相关。

除了荣誉,这个项目也给我带来许多其他收获。第一是让我意识到,复杂的功能往往是从最简单的样例慢慢拓展迭代而来,一蹴而就是不现实的。我们的参考实现前后就经历了好几次大规模的重构,每次重构之后再回过头对比上个版本,都简直如云壤之别。第二是在项目中有许多机会与专家进行交流,这对于个人视野的拓展是大有裨益的。不管是线上社区互动,还是线下分享提问,将自己做的事情分享出去,在增强自信心的同时也学到了很多新的东西,帮助自己直面不足之处,进而有动力去做迭代和完善;最后是在这个过程中,我逐渐养成了从整个项目层面进行独立思考和计划的习惯,这也将为我毕业后参加工作打下了良好的职业基础。

启智开源社区作为国家面向新一代人工智能开源共性技术的平台,为大家提供了同等的机会进行开源项目创作和交流。我很荣幸作为社区首批开发者,为社区建设贡献一份力量并且获得认可。衷心希望未来自己有更多机会参与进来,一起让 越来越好,让国内人工智能开源生态越来越好。

作者:李克森

]]>
//www.krtcgo.com/%e5%8f%82%e5%8a%a0%e5%90%af%e6%99%ba%e5%bc%80%e5%8f%91%e7%a4%be%e5%8c%ba%e4%ba%ba%e5%b7%a5%e6%99%ba%e8%83%bd%e7%ae%97%e5%ad%90%e5%bc%80%e5%8f%91%e6%8e%a5%e5%8f%a3%e6%a0%87%e5%87%86%e5%8f%82/feed/ 0