TensorFlow单机实现

在一台机器只有一个运算设备(只有一个 CPU 而不含 GPU)的情况下, 计算图的每个节点在执行时都不涉及设备的选择,所以计算图会按照依赖 关系被顺序执行。当机器中含有多个运算设备(同时含有 CPU 和 GPU)时,每个计算节点的执行就涉及了设备的选择。

Tensor Flow 支持查看执行每一个节点运算的设备,下面我们将会介绍查看这些信息是怎么做到的。TensorFlow 也支持自行设置执行某些操作 所使用的设备。

在生成会话时,可以通过设置参数 log_device _placemen t=True来打印 执行每 一个运算节点相应的设备。

CPU和 GPU都可以被当作 TensorFlow 执行运算的设备。当一台机器有 多个计算设备时,TensorFlow 会通过一套节点设备分配策略(原理上和贪婪策略类似)来决定使用哪个设备来执行相应的节点。该策略首先对每一个节点的输入、输出 tensor 大小,以及该节点运行所需要的时间进行估算;接下来从起点开始,按拓扑顺序模拟性地执行整个计算图。

在模拟执行计算图的每一个节点时,要把每一个能执行这个节点的设备(出于种种原因,某些节点只能执行在 CPU 上。当遇到这样的节点时, 策略会放弃使用其他设备测试该节点〉都测试一遍。该测试会综合考虑该节点的估算运行时间、每台设备执行该节点的实际运行时间和数据传到这个设备所需要的通信时间。最后,综合时间最短的设备将会被选为这个节点的运算设备。节点分配策略并不保证能找到节省计算时间的最佳节点设备方案,但 是可以用较快的速度找到一个不错的节点运算分配方案。除了运行时间之外,较新版本的 TensorFlow 在进行分配决策时还会对内存的最高使用峰值加以考虑。这涉及更多的内容,对于我们而言不需要在 TensorFlow 运行机制上做过多的了解,这里不再解释。在确定好节点分配设备的方案后,整个计算图会被 Distributed Master 划分为许多子图,使用同一设备并且相邻的节点会被划分到同一个子图 。两个使用不同设备的子图会通过一个或多个发送端的发送节点(Send Node) 发送数据,通过一个或多个接收端的接收节点( ReceiveNode) 接收数据, 数据的流向可以采用从发送节点到接收节点的边来表示,如下图所示
在这里插入图片描述

对于用户而言,不需要实现这样的发送节点或接收节点,这些都由 Tensor Flow 自动完成。为了避免数据的反复传输或者重复占用设备内存,如果在一个子图上有多个接收相同 tensor 的接收节点,那么所有这些接收节 点会被自动合并为一个。对于发送节点,也会像这样被自动合并为一个。

Tensor Flow 中的device()函数用于在编程时指定运行每个运算操作的设备,这个设备可以是本地的 CPU 或 GPU,或者是分布式环境下的远程服务器。

GPU 的专长是处理计算密集型的任务,在 TensorFlow 执行分配策略时 会首先考虑将计算密集型的任务放到 GPU 中,而把其他运算操作放到 CPU 上(比如分支运算、逻辑判断等)。尽管如此,在某些情况下我们为了提高程序的运行速度依然需要通过 device()函数来指定运算设备,此时需要尽量 将相关的运算放在同一个设备上,这样不仅可以做到减少发送节点和接收 节点的数量,还能节省将计算放入或者移出 GPU 的时间,以及将数据从内存复制到 GPU 显存的时间。

关注小鲸融创,一起深度学习金融科技!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值