对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 client使用http post 到server端的代码
Feb 10 Python
一个基于flask的web应用诞生(1)
Apr 11 Python
wxpython实现图书管理系统
Mar 12 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
python里 super类的工作原理详解
Jun 19 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
浅谈django 模型类使用save()方法的好处与注意事项
Mar 28 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
Python Numpy之linspace用法说明
Apr 17 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
May 19 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获取远程文件内容的函数
2015/11/02 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
新鲜出炉的js tips提示效果
2011/04/03 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
从setTimeout看js函数执行过程
2017/12/19 Javascript
详解Vue源码中一些util函数
2019/04/24 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
python将文本转换成图片输出的方法
2015/04/28 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
pandas object格式转float64格式的方法
2018/04/10 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
pandas按条件筛选数据的实现
2021/02/20 Python
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
应届生法律顾问求职信
2013/11/19 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
MySQL注入基础练习
2021/05/30 MySQL
Python并发编程实例教程之线程的玩法
2021/06/20 Python