机器之心发布
作者:夕小瑶的卖萌屋
大家好,我是卖萌酱。
对一个深度学习从业者来说,无论你的场景是 CV、NLP、Speech 还是搜广推现金牛,手头使用最高频的工具莫过于深度学习框架,涵盖了模型训练、模型部署,乃至数据标注、数据清洗等环节。
站在 2022 年的视角下,回顾曾经被深度学习框架搞崩溃的瞬间,真心觉得现在的框架、工具链已经被打磨的太好用了。
来吧,忆苦思甜开始!
框架选择:选择困难症患者的噩梦
卖萌酱在入门深度学习时,光在 “我要学习哪个深度学习框架” 的问题上,就精神内耗了接近一个月。当时框架选择方面的参考资料和分析帖比较匮乏,最后无奈之下,把当时流行的 Theano、Caffe、TensorFlow、Torch(注意不是 Pytorch)、Keras(当时还不属于 TF)全都入门上手了一遍,最后竟然丧心病狂的觉得当时的 TF 是最好用的。
你以为卖萌酱从此变成了“TF 高阶工程师”?
不不,就在卖萌酱好不容易把 TF 1.x 自认为玩的比较溜的时候,Pytorch 的风就袭来了。在师兄师姐的强力安利下,又强行试了试 Pytorch,结果由于当时还不成熟,踩了个框架层面的 bug,在 github 上跟开发者反馈后等了好久也没解决,又切回去 TF 1.x 了。
就在卖萌酱终于要把精力聚焦在业务问题上时,TF2.0 又出现了。更新按道理是个好事啊,然而,TF2.0 与 TF1.0 的兼容性,几乎等于没有。。你坚持 TF1.0,就要面临将来无人维护的必然结局。你要升级 2.0 吧,所有积累的 TF 代码全废了。
TF 这点如果当年能像现在的飞桨 PaddlePaddle 一样,2.X 强力兼容 1.X,卖萌酱可能就不会抛弃 TF 了。。
最后,就在卖萌酱终于要彻底拥抱 Pytorch 的时候,又被大规模分布式训练和模型部署问题给折腾懵了。这时候有大佬跟卖萌酱说了一句:“搞分布式训练和部署,不应该优先考虑 PaddlePaddle 么?”于是,半信半疑的卖萌酱又跑去试了一把飞桨 PaddlePaddle,嗯,真香。。果然从工业界打磨出来的深度学习框架最懂工业界的痛点。
6 年的时间里,卖萌酱学习了 7 个深度学习框架,对耐心差的开发者来说频繁切换框架真的会非常崩溃。
听卖萌酱一句劝,2022 年了,如果你要 all in 做学术,第一时间跑通 Arxiv 上昨天刚挂的论文中的开源代码,那就无脑选择 Pytorch;如果你要 all in 工业界,既要训练爽又要部署省心,就无脑飞桨 PaddlePaddle,尤其在国内,有中文团队本土支持简直不要太爽。
机制纠结:静态图的极客感还是动态图的傻瓜式?
在 TF2.0 出现以前,很多人都纠结过选择静态图还是动态图。虽然静态图跑起来真的快,但是 debug 起来又比较痛苦(虽然看起来很极客范),部署的时候又觉得香。当时就在想,如果有一个深度学习框架,能够编程和调试的时候用动态图,等到要大规模训练和部署的时候无需改代码就直接自动转静态图运行就好了。
卖萌酱这个愿望终于在不久前实现了!
飞桨 PaddlePaddle 从 2.X 的版本后,默认开启动态图模式进行模型开发、调试和训练,但是由于 Paddle 的 API 实现了 “动静统一”,在开发调试完成后,可以直接通过 paddle.enable_static() 来切换到静态图模式进行模型训练加速和模型部署。简直就是现代深度学习框架的理想态好不好。
为啥我的任务跑的这么慢!GPU 利用率这么低!
每次要尝试一个比较大胆的 idea,除了要面临方法效果层面的挑战外,新模型新算法的训练、推理效率也经常出奇的低,甚至一些经典的模型,要做大规模数据推理时发现别人 3 天能跑完的任务,我却要跑 7 天,完全不知道到底是哪里拖慢了速度。
这时候可能就有老司机跑过来嘲讽:
卖萌酱,你这工程能力是不是不大行啊~~~
刚开始的时候,卖萌酱会尝试往代码里疯狂插入 `time.time()` 打印多个点的运行时间,不但插入费时费力,删除也费力,调试粒度还非常粗,有些时间是消耗在 GPU 上、CPU 上还是内存显存通信上也搞不清楚。
不过,最近听飞桨 PaddlePaddle 框架团队的同学说,Paddle 计划在即将发布的 2.3 版本中推出 9 个性能分析 API,不仅非常易用,而且全面、专业,在训练、推理过程中收集、导出和统计性能数据,到时候定位运行效率瓶颈,实现极限的工程效率优化就不再是一个让人崩溃的事情了!
Sparse 运算,深度学习框架之痛
你想象过,把一个 dense Tensor 替换成 sparse Tensor 后,模型计算速度会被整整拖慢一倍吗?
没错,卖萌酱几年前曾经为了优化巨型 word embedding 的显存占用,曾经尝试将其从 dense Tensor 转成 sparse Tensor,结果,naive 了。。。不仅没省下多少显存,整个计算速度变成了龟速,就不吐槽是哪个框架了。。。
其实不仅是词向量查询,sparse Tensor 和 sparse 运算在相当多的深度学习应用场景中都有很强的需求。比如计算机视觉中是 3D、点云数据类型也非常稀疏,在推荐、广告等业务场景也有大量的稀疏数据和稀疏运算。在这方面,主流深度学习框架要么支持差,容易出奇怪的报错,要么性能无法达到效果,数据处理、模型组网非常复杂,而且运算效率低下。
以至于,在涉及到大量稀疏运算的场景,有实力的大厂甚至搞起了自研框架,或从开源框架拉分支来重点优化稀疏计算。。
不过,这个多年未解的痛点,可能会在飞桨 PaddlePaddle 即将发布的 2.3 版本中被大大缓解甚至解决,PaddlePaddle 2.3 对 sparse tensor 做了全面梳理,预计会新增 11 个 sparse tensor 运算的 API,常见的 COO、CRS 格式的 Sparse Tensor 以及与 Dense Tensor 互相转换等基础功能可能会得到简洁易用且高性能的实现。
除了以上提到的新特性外,据传即将发布的飞桨 PaddlePaddle 2.3 还会有一系列充满想象力的重磅升级,比如将傅里叶变换放进神经网络?让科学计算甚至信号处理问题都能接入深度学习框架?
可以确信的是,AI 的应用边界将被持续打破,AI 落地的想象力也会因飞桨而变得不同。对框架底层突破与升级感兴趣的小伙伴,请扫描以下海报预约 WAVE SUMMIT 深度学习开发者峰会!