百科问答小站 logo
百科问答小站 font logo



如何开发一个自己的 TensorFlow? 第1页

  

user avatar   bai_62868 网友的相关建议: 
      

啊,开发一个属于自己的TensorFlow?按照题主的描述,貌似TinyFlow(2k+行代码)就完全可以满足的你的需要。

能有这样的想法的话,应该是对deep learning system有些兴趣???

如果题主真的是想从头开始设计一个属于自己的framework的话。。。。

emmm,大半夜睡不着,那就随便写写,想到什么就写什么了。。。

记着Hinton曾经说过:To solve the real-world interesting problems, you need to build a system, not just write a program.

那就听着Hinton老爷子的话,开始研究下如何构建一个Deep Learning System吧(我这里说的DLS仅仅指framework,而framework只能对应到Deep Learning System中的一个部分:Front End)

其实目前主流的framework可以被分为两类: 声明式编程(Declarative Programming)和命令式编程(Imperative Programming) ,这对应到相关知识就是Data Flow和Control Flow,或者是Lazy Evaluation和Eager Evaluation。不熟悉的话就在wiki上看看,还是很容易理解的,大白话就是:命令式编程就是我们通常所说的边定义边执行,而声明式编程则是全部定义完成后再来执行。

而这两种定义方式的优缺点也是非常明显的。命令式编程对炼丹师更友好,方便我们debug,语义上容易理解,灵活,可以帮助我们精确的控制某些具体的行为。缺点就是对于某些语句中对并发和并行等优化的支持就显得非常复杂了。而声明式编程却可以显示的表述出程序中所有语句的并行关系,从而可以借助Engine很容易的来实现一些并行和并发。这也就是我们经常听到的,以声明式编程为主导的framework方便我们更进一步进行图的优化,从而带来性能上的提升。

现在的主流趋势是,所有框架基本都在向(Eager Evaluation,Control Flow,Declarative Programming)模式进行收敛。包括Pytorch,TensorFlow 2.0,MXNet的Gluon接口。为什么会这样?毕竟对用户友好,使用起来灵活,并且符合大多数炼丹师的编程习惯!

不管你是做CV还是做NLP,在framework中,都逃不开data和operator这两个非常重要的概念!当初用过caffe(openpose的官方实现是caffe的),也就走马观花的从代码层面学了下caffe。其实caffe有个很大的缺点,它的设计是通过layer这种抽象,将data和operator绑定在了一起,这在很多时候都是非常不方便的。以至于到了后面出现的所有框架都意识到了这个问题,将data和operator分开存放。对于一些粒度特别细的问题,那些通过compiler生成的代码在一定程度上是不一定能够超过有经验的工程师手工优化过的后的代码的。为了解决这个问题(自动,自动,基于软硬件协同设计的全栈自动优化!!!),也就出现了XLA, TVM, Glow(没错,就是大家所说的深度学习编译器!)

有了data以后,就需要对data进行各种计算(op)的支持,那么不同款framework在这方面的设计有存在不同。TensorFlow是通过Eigen来实现的,mxnet是使用Mshadow来做的,有兴趣的话,可以看看Tianqi写的tutorial:

总之,目的就是一个,通过C++/CUDA的模板元+编译时的运算从而进一步提升效率。

接下来其实就是autograd了,这部分的内容讲起来有些多,具体内容参考599的assignment-1和slides:

代码的话,我会等到assignment-2写完后一起放出来。

OK,继续往下深入的话。接下来就是一些关于计算图(CG)的优化技术了。比如说,内存优化技术,操作符的融合,表达式的化简以及无用代码的消除,tensor(data)类型和shape的推导,编译器的pattern match等技术了。其实,在我们用户通过一行一行代码,比如mxnet中,通过mx.symbol.xxx搭建起来的model,在被framework来执行的时候,已经被上述讲到的这些优化技术优化的面目全非了。那优化后的CG应该被哪个部件来执行呢?在framework中,Execution Engine被设计出来执行这些CG。Execution Engine可以说是一个framework的核心了,因为他扮演者启动并且执行计算图的过程,由于对于性能极限的追求,我们都会把op写到GPU上。而此时的调度确是发生在CPU上,那么如何高效的协调CPU和GPU来达到Execution Engine的运行又是一个非常有趣的问题(哇,为什么平时我们用的框架却会涉及这么多问题呢?这部分的内容又可以写很多,,,如果感兴趣的话,具体还是以某个框架来研究为好,这里推荐mxnet。

其实,有了上述的概念和感性的认识,一个framework的基本要素就已经有了,剩下就是一些涉及到数据并行,模型并行,流水线并行以及一些集合通信的问题。

推荐一个非常不错的资料,mxnet的design笔记,有机会,我会写几篇文章来讲讲这些笔记所涉及到的一些system design方面的理念(感觉还是非常超前的!可以推广到很多方面。。。

总的来说,一个能work的深度学习framework,必须具备如下五个元素:

  1. 支持各种操作(op) 的tensor (data)
  2. 计算图的定义方式(动态 v.s. 静态)
  3. Autograd
  4. Optimizer
  5. 各种加速和优化的库:cudnn, openblas,mkl等

其中涉及到了表达式化简与消除,工厂模式,模板元,CUDA,C++内核/Python等不同语言的封装,分布式系统原理,Compiler,Architecture,OS等各方面的知识。。。

从上面的分析来看,如果要想去做一个能work起来,并且还算能用的framework,需要的技术要求还是相当高的,其实每种framework的设计都应该服务于具体的application,针对不同的application又会存在不同的特定需求,并不能明确定义出一个boundary。




最后的最后,如果你对Deep Learning System非常感兴趣,但是又觉得UW那门课没有video自学起来不是很方便的话,可以来我的专栏看看:

这个专栏就是我对着Tianqi大佬在UW开的那门599的课(今天在Twitter上看到Tianqi去CMU当faculty了,真是羡慕到不行,以后还会不停的follow大佬的工作的)

我基本会把所有slides的内容和assignment都按照自己的理解写一遍。

最近被老板拉去写本子做外包,好久没更新了 :<

等这段时间忙完了,就继续回归到定期更新的节奏!


user avatar   tonyabracadabra 网友的相关建议: 
      

其实摇滚精神是人的精神,不用太强调摇滚这两个字。

前两天我看到了臧鸿飞对摇滚的解释,我觉得挺好,他说摇滚是面对着生活的不服,而流行音乐是面对生活服了。我觉得这种解释挺好,我们始终在质问自己还是不是自己。摇滚不摇滚不重要,重要的是你还是不是你自己。

摇滚是小众这个话题已经不用再说了,因为摇滚在西方已经成为主流过了,摇滚是大众音乐,在中国可能是小众音乐,所以说中国文化和经济的现状造成了摇滚乐在现在社会的定位不能说明它是大众还是小众,这个真的不重要,重要的是在于每一个人在面对自己现实的妥协的自我的时候,是否会持续的去发问,这种东西不一定偏要体现在摇滚乐,而流行音乐也有,古典音乐也有,现在一些hip hop音乐、嘻哈音乐里都有大量的质疑的声音。

当然,这些都是大的流行音乐的范畴里的,但都不是以人们所理解的摇滚音乐的形式所存在的,所以没必要偏要强调摇滚两个字。

我自己写过两首歌去比较中国的摇滚乐和西方的摇滚乐,近三十年前我写过一首《像是一把刀子》,我觉得当时的中国摇滚就像一把刀子;在十年前我写过另外一首歌叫做《滚动的蛋》,实际上也是针对Bob Dylan的《Like a rolling stone》做一次呼应,我们站在中国的土地上,对西方的摇滚乐做的呼应,我觉得我们更像一颗滚动的蛋,我觉得这是对中国摇滚乐现状的一种描述。中国摇滚是一颗滚动的蛋,但它没有破碎,雨后的大地路途好像有些松软,滚动的时候受到了保护,但的确是危险的状态。我更愿意说中国摇滚乐是从下而上的,蛋破碎了之后变成了生命。

从三十年前到十年前再到现在,中国摇滚没有走向世界,我觉得走不走真的不重要,类似的比较本身是功利心态的,把摇滚乐当做了一种商品。摇滚乐存在的形式也不是为了要走向世界,或者要流向中国,它们存在是为了身心的娱乐,这种娱乐自然会带来与市场的互动,这种互动造成了传播,所以在中国有大量的人受到了影响,可以了解到西方文化,而且他们可以轻而易举的买到这些唱片,这是一种正常的文化根基带来的良性的反应。所以我们就应该去听这种良性的音乐,我觉得每个时代都要有一种形式去表达自己,摇滚乐就是西方发展到六十年代七十年代,人们需要用新的形式去表达自己的时候适时出现的,那个时候已有的音乐形式不能表达人们的想法了。像现在一样,很多的年轻人选择用他们自己的方式表达自己,我们也没办法。这个就是自然的一种规律,人们在经济发展、文化发展、全球化发展的过程中,人们就会轻而易举的找到自己最想选择的方式表达自己。

我觉得中国的摇滚乐,或者说中国自由表达性音乐受到了很多限制,所以说在某种程度上,流行音乐更是很多人追求的一种结果,它的成功方式是一种结果,包括摇滚乐也希望能够像流行音乐一样成功,但不一定像流行音乐那样去表达。

遗憾的是,这个社会的环境和传统文化环境没有鼓励批判,或者说是坚持自我、怀疑现实这种审美,在别的人完全趟出一条路之后,我们亚洲人沿着他们的脚步往前走的时候可能会受益,因为大家会说这种东西我们已经知道结果了,是可控的。但真正达到了不可控制的时候,所谓的不可控制就是真正自由状,他们一定会出面干涉或强加限制。这个时候才需要人站出来,人的自由创造需要调整,针对这种状态的时候,才能产生出接地气的作品,这个时候我认为才是所谓最自由的状态,他自己也不知道会是什么样,人的自由状态在某种程度上是不可控的状态,当然这种不可控的状态是由内心强大的信仰牵引着的,不会造成危险。这种东西只有自己能知道,很多人是不相信的,所以我们的文化环境、我们的宗教信仰完全不信任人的自由状态,一定会有人干预你,不光是家长,即使是比你年轻的人都会来说小心点小心点别出圈、别超越底线。这些东西都有可能造成自己对自己说,那好吧,回头。

就像臧鸿飞说的那样,我们服了,我们对困难做出了妥协做出让步,我们的理想稍微静音一段时间,完了之后,我们可以获取到的东西要远远大于我们的挑战。

你持续的用你的理想去对抗你对现实的认知,你会发现你对现实的认知没有那么强大,你甚至可以说你自己征服现实就是你的现实观,现实怎么可能不被征服呢?他怎么可能会养成这种习惯呢?如果现实都是不可征服的,人就永远是在倒退。

摇滚不仅仅是一个音乐的概念,而是一种态度和人生观的概念。


user avatar   chncwang 网友的相关建议: 
      

其实摇滚精神是人的精神,不用太强调摇滚这两个字。

前两天我看到了臧鸿飞对摇滚的解释,我觉得挺好,他说摇滚是面对着生活的不服,而流行音乐是面对生活服了。我觉得这种解释挺好,我们始终在质问自己还是不是自己。摇滚不摇滚不重要,重要的是你还是不是你自己。

摇滚是小众这个话题已经不用再说了,因为摇滚在西方已经成为主流过了,摇滚是大众音乐,在中国可能是小众音乐,所以说中国文化和经济的现状造成了摇滚乐在现在社会的定位不能说明它是大众还是小众,这个真的不重要,重要的是在于每一个人在面对自己现实的妥协的自我的时候,是否会持续的去发问,这种东西不一定偏要体现在摇滚乐,而流行音乐也有,古典音乐也有,现在一些hip hop音乐、嘻哈音乐里都有大量的质疑的声音。

当然,这些都是大的流行音乐的范畴里的,但都不是以人们所理解的摇滚音乐的形式所存在的,所以没必要偏要强调摇滚两个字。

我自己写过两首歌去比较中国的摇滚乐和西方的摇滚乐,近三十年前我写过一首《像是一把刀子》,我觉得当时的中国摇滚就像一把刀子;在十年前我写过另外一首歌叫做《滚动的蛋》,实际上也是针对Bob Dylan的《Like a rolling stone》做一次呼应,我们站在中国的土地上,对西方的摇滚乐做的呼应,我觉得我们更像一颗滚动的蛋,我觉得这是对中国摇滚乐现状的一种描述。中国摇滚是一颗滚动的蛋,但它没有破碎,雨后的大地路途好像有些松软,滚动的时候受到了保护,但的确是危险的状态。我更愿意说中国摇滚乐是从下而上的,蛋破碎了之后变成了生命。

从三十年前到十年前再到现在,中国摇滚没有走向世界,我觉得走不走真的不重要,类似的比较本身是功利心态的,把摇滚乐当做了一种商品。摇滚乐存在的形式也不是为了要走向世界,或者要流向中国,它们存在是为了身心的娱乐,这种娱乐自然会带来与市场的互动,这种互动造成了传播,所以在中国有大量的人受到了影响,可以了解到西方文化,而且他们可以轻而易举的买到这些唱片,这是一种正常的文化根基带来的良性的反应。所以我们就应该去听这种良性的音乐,我觉得每个时代都要有一种形式去表达自己,摇滚乐就是西方发展到六十年代七十年代,人们需要用新的形式去表达自己的时候适时出现的,那个时候已有的音乐形式不能表达人们的想法了。像现在一样,很多的年轻人选择用他们自己的方式表达自己,我们也没办法。这个就是自然的一种规律,人们在经济发展、文化发展、全球化发展的过程中,人们就会轻而易举的找到自己最想选择的方式表达自己。

我觉得中国的摇滚乐,或者说中国自由表达性音乐受到了很多限制,所以说在某种程度上,流行音乐更是很多人追求的一种结果,它的成功方式是一种结果,包括摇滚乐也希望能够像流行音乐一样成功,但不一定像流行音乐那样去表达。

遗憾的是,这个社会的环境和传统文化环境没有鼓励批判,或者说是坚持自我、怀疑现实这种审美,在别的人完全趟出一条路之后,我们亚洲人沿着他们的脚步往前走的时候可能会受益,因为大家会说这种东西我们已经知道结果了,是可控的。但真正达到了不可控制的时候,所谓的不可控制就是真正自由状,他们一定会出面干涉或强加限制。这个时候才需要人站出来,人的自由创造需要调整,针对这种状态的时候,才能产生出接地气的作品,这个时候我认为才是所谓最自由的状态,他自己也不知道会是什么样,人的自由状态在某种程度上是不可控的状态,当然这种不可控的状态是由内心强大的信仰牵引着的,不会造成危险。这种东西只有自己能知道,很多人是不相信的,所以我们的文化环境、我们的宗教信仰完全不信任人的自由状态,一定会有人干预你,不光是家长,即使是比你年轻的人都会来说小心点小心点别出圈、别超越底线。这些东西都有可能造成自己对自己说,那好吧,回头。

就像臧鸿飞说的那样,我们服了,我们对困难做出了妥协做出让步,我们的理想稍微静音一段时间,完了之后,我们可以获取到的东西要远远大于我们的挑战。

你持续的用你的理想去对抗你对现实的认知,你会发现你对现实的认知没有那么强大,你甚至可以说你自己征服现实就是你的现实观,现实怎么可能不被征服呢?他怎么可能会养成这种习惯呢?如果现实都是不可征服的,人就永远是在倒退。

摇滚不仅仅是一个音乐的概念,而是一种态度和人生观的概念。




  

相关话题

  深度学习的多个loss如何平衡? 
  计算机视觉中,目前有哪些经典的目标跟踪算法? 
  为什么强大的 MXNet 一直火不起来? 
  老师给了一个神经网络的程序,他之前是跑通了的,但是我迭代几十次或者一百多次就报错。这个怎么解决? 
  Batch normalization和Instance normalization的对比? 
  主动学习(Active Learning)近几年的研究有哪些进展,现在有哪些代表性成果? 
  深度学习领域,你心目中 idea 最惊艳的论文是哪篇? 
  如何看待周志华等人的新书《机器学习理论导引》? 
  如何评价Sony新出的深度学习库NNabla? 
  深度学习在无人驾驶汽车上面的运用有哪些? 

前一个讨论
学习编译原理有什么好的书籍?
下一个讨论
树莓派做网站靠谱不?





© 2024-06-04 - tinynew.org. All Rights Reserved.
© 2024-06-04 - tinynew.org. 保留所有权利