对Tensorflow中Device实例的生成和管理详解


Posted in Python onFebruary 04, 2020

1. 关键术语描述

kernel

在神经网络模型中,每个node都定义了自己需要完成的操作,比如要做卷积、矩阵相乘等。

可以将kernel看做是一段能够跑在具体硬件设备上的算法程序,所以即使同样的2D卷积算法,我们有基于gpu的Convolution 2D kernel实例、基于cpu的Convolution 2D kernel实例。

device

负责运行kernel的具体硬件设备抽象。每个device实例,对应系统中一个具体的处理器硬件,比如gpu:0 device, gpu:1 device, cpu:0 device。一般来说,每个device实例同时包括处理器资源、内存资源。device的抽象支持硬件设备提供的并行处理能力。

2. device是什么

为方便描述,下面我们把在tensorflow里面运行的神经网络模型都统一称为graph。

我们知道,tensorflow主要针对的是跨硬件平台、分布式、并发运行的场景,参与运算的每个硬件资源,我们都抽象为device实例,便于管理。

device的主要职责:

管理处理器资源,为支持device内部的并行计算,进一步将其抽象为thread pool或streams:

cpu:使用thread pool来管理,thread之间可支持不同程度的并行计算能力

gpu: 针对nvidia gpu, 使用cuda streams来管理,根据不同的gpu型号,可支持不同数量的stream做并行计算

管理内存资源:为kernel的运行,分配和释放内存,进一步抽象为Allocator及其各种子类的实例来管理。

主机内存:

cpu kernel 计算时需要的内存。

gpu kernel的输出结果如果要放置到主机内存中时,gpu kernel也需要申请主机内存。

显存: gpu kernel 计算时需要的内存。

3. device的种类及应用场景

由于device要抽象的设备种类较多,我们主要描述一下本地运行的cpu device、gpu device实例类型。先用一个UML图来表示一下各种device抽象类的关系:

对Tensorflow中Device实例的生成和管理详解

可以看到,cpu device实例使用的类是GPUCompatibleCPUDevice,主要是在ThreadPoolDevice的基础上,增加了gpu<-> cpu之间内存传输数据的优化措施。

gpu device实例使用的类是 GPUDevice 。

4. device实例的关键数据结构

我们以常用的cpu device,gpu device为例, 用下图描述一下device实例的关键数据结构:

对Tensorflow中Device实例的生成和管理详解

可以看到每个device实例内部都具备并行处理的能力:

GPUCompatibleCPUDevice实例
 将 cpu 的计算资源抽象为thread pool,以支持多thread之间的并发执行;
 将主机内存抽象为 CPUAllocator 实例来进行管理,为cpu kernel、gpu kernel提供主机内存的申请、释放功能;

GPUDevice实例
 将gpu的计算资源抽象为streams, 由于目前只支持NVIDIA的gpu,所以这里我们可以看作抽象为cuda streams,多个cuda streams之间的计算可以并发处理;
 通过GPUBFCAllocator实例来管理显存,为gpu kernel提供显存的申请、释放功能。

5. device实例的创建

系统中可用的device实例,由session发起创建,归属于session实例。

device的创建,使用Factory 设计模式,session会调用所有注册的device factory,逐一产出 符合条件的device实例。

以DirectSession实例创建gpu device、cpu device为例,具体流程如下图所示。

为方便结合代码阅读,已包含主要的类、函数调用路径:

对Tensorflow中Device实例的生成和管理详解

可以看到,最终产出 的gpu device、cpu device实例,都会保存至DirectSession实例的 devices_ 表中,由DirectSession实例进行分配和使用。

6. 在graph运行阶段device的使用

在graph的创建阶段,session为每个node分配一个具体的device实例,同时为每个node创建一个具体的kernel实例,这个kernel实例将会运行在分配的device实例上。(参见Tensorflow 核心流程剖析 2 ? 神经网络模型的创建和分割)

接下来,在graph的运行阶段,session会依次处理graph中的node,调度node所分配的device实例,去运行node的kernel实例。

每个kernel 在运行时,会向其分配的device,申请需要的计算资源、内存资源等,完成具体的运算操作。

上述流程如下图所示。

为方便结合代码阅读,已包含主要的类、函数调用路径:

对Tensorflow中Device实例的生成和管理详解

以上这篇对Tensorflow中Device实例的生成和管理详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
可用于监控 mysql Master Slave 状态的python代码
Feb 10 Python
python开发之list操作实例分析
Feb 22 Python
一文总结学习Python的14张思维导图
Oct 17 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
Python2与Python3的区别实例分析
Apr 11 Python
python os.fork() 循环输出方法
Aug 08 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
Python手绘可视化工具cutecharts使用实例
Dec 05 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
Python实现简单的俄罗斯方块游戏
Sep 25 Python
 Python 中 logging 模块使用详情
Mar 03 Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 #Python
django3.02模板中的超链接配置实例代码
Feb 04 #Python
tensorflow自定义激活函数实例
Feb 04 #Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 #Python
pytorch梯度剪裁方式
Feb 04 #Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 #Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 #Python
You might like
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
jQuery分组选择器用法实例
2014/12/23 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
Python玩转Excel的读写改实例
2019/02/22 Python
Python socket处理client连接过程解析
2020/03/18 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
小学生竞选班干部演讲稿
2014/04/24 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
2014年班组长工作总结
2014/11/20 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL