对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 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
python绘制简单彩虹图
Nov 19 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Python 3 判断2个字典相同
Aug 06 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
Apr 08 Python
Python flask框架端口失效解决方案
Jun 04 Python
python time.strptime格式化实例详解
Feb 03 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 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中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
2018/10/10 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
Python中replace方法实例分析
2014/08/20 Python
python实现清屏的方法
2015/04/30 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
python实现图片压缩代码实例
2019/08/12 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
如何使用PHP session
2015/04/21 面试题
个人求职简历中英文自我评价
2013/12/16 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
信用卡催款律师函
2015/05/27 职场文书