对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 相关文章推荐
使用python在校内发人人网状态(人人网看状态)
Feb 19 Python
Python安装pycurl失败的解决方法
Oct 15 Python
pyttsx3实现中文文字转语音的方法
Dec 24 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
10个示例带你掌握python中的元组
Nov 23 Python
python从ftp获取文件并下载到本地
Dec 05 Python
Python爬虫UA伪装爬取的实例讲解
Feb 19 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 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
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
2020/05/01 Javascript
python实现倒计时的示例
2014/02/14 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
Python-for循环的内部机制
2020/06/12 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
应聘编辑职位自荐信范文
2014/01/05 职场文书
商铺租赁意向书
2014/04/01 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
事业单位考察材料范文
2014/12/25 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
基于PyQt5制作一个群发邮件工具
2022/04/08 Python