如何开发一个自己的TensorFlow?
链接:https://www.zhihu.com/question/326890535 编辑:深度学习与计算机视觉
https://www.zhihu.com/question/326890535/answer/719907717
当时测了几个典型的模型的GPU训练速度,论文中的表格:
我fork了一个完全由自己主导的版本:https://github.com/chncwang/N3LDG-plus
等有时间加上transformer和BERT的支持了,再整文档吧(其实到底该叫啥名也没想清楚,姑且称之为N3LDG++),目前主要就自己在用来做文本生成。
GPU计算的实现是相对麻烦的一部分。出于性能极致的追求(N卡很贵,计算速度怎么强调都不过分)和对自己代码负责的态度,当时算把CUDA彻底整明白了(除了图形学用的纹理内存),针对每种操作专门写了对应的CUDA,比如concat操作就能在一次kernel调用下完成一个batch里的多个不同维度输入向量的拼接:
显存也需要操心。由于GPU离CPU远,不能像用malloc一样频繁地调cudaMalloc。当时不满cnmem的性能,就自己撸了个buddy system。显然这个做法不够精细,dynet的解决方案应该更合理,详见他们的论文。
提到显存,忍不住想多说几句。NLP任务和CV不一样,同个mini-batch中句子长短不一,pytorch会要求补零的操作以求维度对齐,往往还会有一个全局的max_sentence_length(哪怕是N3LDG也是如此),这其实很浪费显存。在N3LDG++中,如果一个mini-batch里的句子总长度是100,那么分配100长度的空间也就够用,减少了浪费。所以我计划有时间了支持下BERT,至少让base模型在1080ti里也能伸展开来,不怕OOM。只是不清楚大家都用啥显卡,这块的需求有多强。
然后说一下编程语言。主流的框架使用C++、CUDA实现底层的计算,然后用python实现上层的封装,似乎是兼顾了计算效率和使用方便。然而使用PyTorch时还是会发现CPU模式下的龟速。我自己没用过PyTorch,也不清楚CPU龟速的原因(也许是Python调用C++的额外开销?),只是每当看到实验室同学跑个几千的数据集就要用GPU,就觉得Python在深度学习界的流行抬高了英伟达的市值。
N3LDG++中的C++代码继承自N3LDG,不过做了很大的改动,难以细述,最大的一点是改进了Node类型的资源管理方式,所有的Node对象由Graph持有(比如在N3LDG中每多创建一个节点,都需要有相应的对象来持有,不能当作临时变量用,这很不方便)。不过历史遗留的代码还是有点乱,不少该抽象的地方没有抽象,以后慢慢改吧(唉纯算法背景写出的代码真是。。。)
最后,我觉得从0写一个可用的深度学习框架不难,但是工作量很大, 对人的要求也不高(但是多,不能光懂算法),主要以下几点:
-
编码能力过关,精通C++、CUDA、OO思想,以及能搞定一切的debug能力 -
编码习惯良好,比如重视变量命名 -
算法方面,会手算梯度就行
https://www.zhihu.com/question/326890535/answer/700281308首先需要熟练使用C++编程,其次学会cuda的GPU显卡计算框架,了解一下并行计算,写出比TensorFlow快的框架非常简单。毕竟TensorFlow为了可移植性等等牺牲了很多。
我已经用自己的框架做了三四个项目了,由于干最底层的算法岗,自己这不成熟的框架已经能胜任几乎所有需求了。目前我正在对框架进行可视化的相应改进,力求能进一步突破TensorBoard。
https://www.zhihu.com/question/326890535/answer/827912517
1、现在网上tensorflow能源码级的,较清晰解读尚且没看到,不知道说不难的人自己有没有过过源码;
2、不要把手写一两种CNN网络的难度和一个大规模商用深度学习平台来比,不考虑各类具体算法实现,单单是工程层面的抽象、设计也不简单;
3、还有说tf里算法容易的,就想先请教一个小问题,Tensorflow里那种通用求导是如何实现的?别上网搜,想想能搞定不?
—版权声明—
仅用于学术分享,版权属于原作者。
若有侵权,请联系微信号:yiyang-sy 删除或修改!
—THE END—