把自己微博发的文章:http://www.weibo.com/1804230372/En7PdlgLb?from=page_1005051804230372_profile&wvr=6&mod=weibotime&type=comment 也转到博客来,算是自己写的很短的一篇博客了。

花了一些时间看了一下TensorFlow 核心(core)部分的源代码,主要是C++的部分。除了C++ 11的代码实在有些烧脑以外,感叹一下TensorFlow的架构设计得真不错:

首先TensorFlow core要解决的问题全部集中在了图上:每个节点(node)就是一个操作(op),比如说矩阵乘法,每条边(edge)就是操作的输入也就是数据或者依赖关系(称为control edge)。每个op对应了不同的实现,也被称为kernel,比如说用GPU去做矩阵运算的实现,或者FPGA去做加法的实现等等。

然后就是如何优化了:
1) 首先是一个图的变换操作:用户输入的图根据op、kernel和输入/中间数据,被分布到不同的机器的硬件(device)上。这样把一个大图分拆成为了几个子图(每个device上一个?)。
2) 然后对分拆之后的子图再进行进一步的优化,比如说把那些无法访问的节点(dead node)删掉,把那些输入、输出、操作都一样的子图找出来防止重复计算 (Common Subexpression Elimination)等等
3)最后就是一些下层模块的优化,比如说RPC怎么做更快,Kernel怎么实现更优化等等。

这样的架构设计基本上能保证
1)不同层级之间的耦合很小,不至于一个改动牵一而发动全身。
2)项目的扩展性很好,有很少的瓶颈。比如说完全可以有一个小团队专门进行RPC的实现(RDMA),或者说用FPGA来实现不同op的kernel等等。这样可以完全让一个上百人的团队来并行的开发kernel和周边的东西。

目前读下来唯一觉得可能会导致扩展性的地方是Session还有图优化部分的实现,很难让大团队能够在这个部分并行工作,不过这部分代码也不是劳动密集型的改动,所以看起来也没什么大问题

TensorFlow 源代码初读感受的更多相关文章

  1. tensorflow源代码方式安装

    本文介绍tensorflow源代码方式安装.安装的系统为 Ubuntu 15.04. 获取TensorFlow源代码 git clone --recurse-submodules https://gi ...

  2. 学习笔记TF050:TensorFlow源代码解析

    TensorFlow目录结构. ACKNOWLEDGMENTS #TensorFlow版本声明 ADOPTERS.md #使用TensorFlow的人员或组织列表 AUTHORS #TensorFlo ...

  3. TensorFlow源代码学习--1 Session API reference

    学习TensorFlow源代码,先把API文档扒出来研究一下整体结构: 一下是文档内容的整理,简单翻译一下 原文地址:http://www.tcvpr.com/archives/181 TensorF ...

  4. 深度学习之 TensorFlow(三):TensorFlow 源代码解析

    分析一下 TensorFlow 的文件结构.这里的源代码版本是 TensorFlow1.7.0 . 目录结构如下: 其中的核心目录是 tensorflow 目录,最重要的源代码保存在这里,目录结构如下 ...

  5. JavaScript权威指南(第六版) 初读笔记

    JavaScript的5种原始类型:undefined.null.布尔值.数字和字符串. JavaScript中两个非常重要的数据类型是对象和数组. 通过方括号定义数组元素和通过花括号定义对象属性名和 ...

  6. Raid1源代码分析--读流程(重新整理)

    五.Raid1读流程分析 两个月前,刚刚接触raid1,就阅读了raid1读流程的代码,那个时候写了一篇博客.现在回过头看看,那篇的错误很多,并且很多地方没有表述清楚.所以还是决定重新写一篇以更正之前 ...

  7. Raid1源代码分析--读流程

    这篇博文不足之处较多,重新整理了一下,链接:http://www.cnblogs.com/fangpei/p/3890873.html 我阅读的代码的linux内核版本是2.6.32.61.刚进实验室 ...

  8. nginx源代码分析--读请求主体(1)

    首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_bod ...

  9. 初读"Thinking in Java"读书笔记之第五章 --- 初始化与清理

    用构造器确保初始化 构造器可以确保每个对象都会得到初始化,Java毁在创建对象时自动调用构造器. 构造器采用与类名相同的名称,因此并不适合"每个方法首字母小写的风格". 构造器默认 ...

随机推荐

  1. CSS之旅——第三站 强大的伪选择器

    说到伪选择器,真的让我体会到了CSS的无比强大,强大到自己貌似都不认识CSS了,有点C# 6.0中一些语法糖带给我们的震撼...首先 我们可以在VS里面提前预览一下. 可以看到,上面的伪类有很多很多, ...

  2. Linux换源+编译内核总结

    换源: 我用的是CentOS,所以下面以其为例,其它OS做法类似,可作参考: 在主机能联网的情况下 进入存放源配置的文件夹 cd /etc/yum.repos.d 备份默认源 mv ./CentOS- ...

  3. Linux IPC Pipe

    mkfifo() //创建有名管道(FIFO special file),创建完了就像普通文件一样open(),再读写,成功返回0,失败返回-1设errno.VS$man 3 mkfifo #incl ...

  4. Android控件开发之Chronometer(转)

    (转自:http://blog.csdn.net/sun6255028/article/details/6688349) Chronometr是一个简单的定时器,你可以给它一个开始时间,并以此定时,或 ...

  5. c++11 新特性之lambda表达式

    写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input paramete ...

  6. 通过三张图了解Redux中的重要概念

    上周利用业余的时间看了看Redux,刚开始有点不适应,一下在有了Action.Reducer.Store和Middleware这么多新的概念. 经过一些了解之后,发现Redux的单向数据里的模式还是比 ...

  7. position:absolute/relative/fixed小结

    1.绝对定位:position:absolute; 当一个div块的位置被定义为绝对定位absolute时,也就意味着它失去了文档流的位置,后面的文档流会紧跟着补上来接替它的位置.如果上下左右的绝对偏 ...

  8. SoapUI调用webservice实现的两种方式

    SoapUI用来做测试,已经是很多人做过的事情了,而且网上教程也很多.不过还是写下来,对比webservice协议与http协议脚本编写的不同. 首先测接口得有一个服务,刚好笔者所在项目做ESB集成. ...

  9. 记录mysql的具体操作明细

    在MySQL中使用init-connect与binlog来实现用户操作追踪记录 2014-07-28 20:55:38 分类: MySQL 前言:测试环境莫名其妙有几条重要数据被删除了,由于在binl ...

  10. oracle round 函数,replace()函数

    (1)如何使用 Oracle Round 函数 (四舍五入)描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果.SELECT ROUND( number, [ decimal_ ...