【Tensorflow2.x】设置GPU(内存自增长、指定GPU)
every blog every motto: You can do more than you think.
0. 前言
本节主要讲解有关GPU的设置。具体包括如何节约GPU资源。话不多说,下面进入正题:
1. 正文
1.1 引子
- tensorflow会默认将GPU(尽可能的)占满,这样会导致其他程序无法使用GPU,造成GPU内存和计算资源的浪费,通常有以下方法:
- 设置内存自增长
- 虚拟设备机制(类似window的磁盘)
- 多GPU的使用
- 虚拟GPU和实际GPU
- 手工设置和分布式机制
- API列表
说明: 注释在相应代码的下面
tf.debugging.set_log_device_placement
# 打印变量在哪个设备上
tf.config.experimental.set_visible_devices
# 设置对本进程可见的设备
tf.config.experimental.list_logical_devices
# 获取所有的逻辑设备
tf.config.experimental.list_physical_devices
# 获取物理设备的列表
tf.config.experimental.set_memory_growth
# 设置内存自增长
tf.config.experimental.VirtualDeviceConfiguration
# 建立逻辑分区
tf.config.set_soft_device_placement
# 自动分配变量到某个设备上
- 监控GPU情况
- 常规
在window控制台(win+R -> cmd)进入或是linux终端
nvidia-smi
- 实时监控
window
nvidi-smi -l
linux(ubuntu):
watch -n 0.1 nvidia-smi
1.2 设置内存自增长
在默认情况下,程序会将GPU内存(尽可能)的占满,尽管其没有用到这么多的内存,如下图所示:
在程序开始的位置,设置内存自增长,代码如下:
说明: 在程序刚开始时,对GPU设置内存自增长,调用如下函数即可。
def set_GPU():"""GPU相关设置"""# 打印变量在那个设备上# tf.debugging.set_log_device_placement(True)# 获取物理GPU个数gpus = tf.config.experimental.list_physical_devices('GPU')print('物理GPU个数为:', len(gpus))# 设置内存自增长for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)print('-------------已设置完GPU内存自增长--------------')# 获取逻辑GPU个数logical_gpus = tf.config.experimental.list_logical_devices('GPU')print('逻辑GPU个数为:', len(logical_gpus))
GPU使用情况如下:
1.3 指定GPU可见
默认情况下,程序会使用第1个GPU,我们可以对其进行指定,即让程序在我们指定的GPU上运行。代码如下:
def set_GPU():"""GPU相关设置"""# 打印变量在那个设备上# tf.debugging.set_log_device_placement(True)# 获取物理GPU个数gpus = tf.config.experimental.list_physical_devices('GPU')print('物理GPU个数为:', len(gpus))# 设置内存自增长for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)print('-------------已设置完GPU内存自增长--------------')# 设置哪个GPU对设备可见,即指定用哪个GPUtf.config.experimental.set_visible_devices(gpus[-1], 'GPU')# 获取逻辑GPU个数logical_gpus = tf.config.experimental.list_logical_devices('GPU')print('逻辑GPU个数为:', len(logical_gpus))
说明:
- 本机只有1个GPU,所以程序在服务器上执行,因此,nvidia信息略有不同。
- 如代码所示,我们指定最后一块GPU可见,即,我们使用最后一块GPU。
- 物理GPU仍然是2个,现在逻辑GPU只有1个。
- 其中,我们依然设置了内存自增长。
1.4 GPU切分
说明:
- 类似对一块物理磁盘切分成几个区,即我们平常使用电脑时,可能电脑上只有一个物理磁盘,但我们会分成好几个区,如C盘,D盘,等。
- 物理GPU,即实实在在的一块GPU;逻辑GPU,即虚拟的GPU(由物理GPU到逻辑GPU的映射)
def set_GPU():"""GPU相关设置"""# 打印变量在那个设备上# tf.debugging.set_log_device_placement(True)# 获取物理GPU个数gpus = tf.config.experimental.list_physical_devices('GPU')print('物理GPU个数为:', len(gpus))# 设置内存自增长# for gpu in gpus:# tf.config.experimental.set_memory_growth(gpu, True)# print('-------------已设置完GPU内存自增长--------------')# 设置哪个GPU对设备可见,即指定用哪个GPUtf.config.experimental.set_visible_devices(gpus[-1], 'GPU')# 切分逻辑GPUtf.config.experimental.set_virtual_device_configuration(gpus[-1], # 指定要切割的物理GPU# 切割的个数,和每块逻辑GPU的大小[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=4096),tf.config.experimental.VirtualDeviceConfiguration(memory_limit=4096), ])# 获取逻辑GPU个数logical_gpus = tf.config.experimental.list_logical_devices('GPU')print('逻辑GPU个数为:', len(logical_gpus))
如下图所示,我们讲最后一块物理GPU切分成两块,现在逻辑GPU个数为2,不同于上面(1.2)中的逻辑GPU为1。
1.5 多GPU环境的使用
1.5.1 手动指定
代码如下:
import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tfgpus = tf.config.experimental.list_physical_devices('GPU')
print('物理GPU个数为:', len(gpus))
# 设置内存自增长
for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)
print('-------------已设置完GPU内存自增长--------------')# 获取逻辑GPU个数
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print('逻辑GPU个数为:', len(logical_gpus))c = []
# 手动指定多GPU环境
for gpu in logical_gpus:print(gpu.name)with tf.device(gpu.name):a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])c.append(tf.matmul(a, b))
with tf.device('/CPU:0'):matmul_sum = tf.add_n(c)
print(matmul_sum)
坏处:
- 太多要控制的细节
- 有的设备不支持
1.5.2 分布式策略
1. MirroredStrategy
- 同步式分布训练
- 适用于一机多卡情况
- 每个GPU都有网络结构的所有参数,这些参数会被同步
- 数据并行
- Batch数据切为N份给各个GPU
- 梯度聚合然后更新给各个GPU上的参数
2. CentralStorageStrategy
- MirroredStrategy 的变种
- 参数不是在每个GPU上,而是存储在一个设备上
- CPU或者唯一的GPU上
- 计算是在所有的GPU上并行的
- 除了更新参数的计算之外
3. MultiWorkerMirroredStrategy
- 类似于MirroredStrategy
- 适用于多机多卡的情况
4. TPUStrategy
- 与MirroredStrategy类似
- 使用TPU上的策略
4. ParameterServerStrategy
- 异步分布式
- 更加适用于分布式系统
- 机器分为Parameter Server 和worker两类
- Parameter server负责整合梯度,更新参数
- Worker负责计算,训练网络
同步与异步的优劣
- 多机多卡
- 异步可以避免短板效应
- 一机多卡
- 同步可以避免过多的通信
- 异步的计算会增加模型的范围能力
- 异步不是严格正确的,所以模型更容易容忍错误
1.6 小结
节约GPU内存资源方式:
- 内存自增长
- 逻辑切分
参考文献
[1] https://blog.csdn.net/weixin_39190382/article/details/104739572
【Tensorflow2.x】设置GPU(内存自增长、指定GPU)相关推荐
- tensorflow2.0 设置GUP
用tensorflow2.0设置 import tensorflow as tf#查看GPU列表 gpus = tf.config.experimental.list_physical_devices ...
- GPU 内存的分级综述(gpu memory hierarchy)
GPU 内存的分级(gpu memory hierarchy) 小普 中科院化学所在读博士研究生 研究课题,计算机模拟并行软件的开发与应用 Email: yaopu2019@126.com (欢迎和 ...
- 服务器开虚拟机总是gpu满载,vSphere 环境机器学习 GPU 加速方案选型
GPU 已经成为支撑 AI 应用的一种关键计算加速设备,GPU 的多处理器架构非常适合用来加快深度神经网络应用中的大量矩阵运算过程.大量实测数据表明,跟通用处理器相比,GPU 在运行深度神经网络时具有 ...
- 深度学习笔记:windows+tensorflow 指定GPU占用内存(解决gpu爆炸问题)
目录 文章目录 目录 前言 一.指定显卡 二.限制GPU用量 1.设置使用GPU的百分比 进行配置,使用30%的GPU 设置session 2.GPU按需使用 三.指定GPU并且限制GPU用量 指定第 ...
- 矩池云中Tensorflow指定GPU及GPU显存设置
矩池云中Tensorflow指定GPU及GPU显存设置 指定GPU 查看机器上GPU情况 命令: nvidia-smi 功能:显示机器上gpu的情况 命令: nvidia-smi -l 功能:定时更新 ...
- Tensorflow2数据集过大,GPU内存不够
前言: 在我们平时使用tensorflow训练模型时,有时候可能因为数据集太大(比如VOC数据集等等)导致GPU内存不够导致终止,可以自制一个数据生成器来解决此问题. 代码如下: def train_ ...
- 获取指定进程所占用内存、指定GPU显存信息、所有GPU型号和驱动
######################################################### # 获取指定进程所占用内存 ############################ ...
- Linux和Windows系统下:安装Anaconda、Paddle、tensorflow、pytorch,GPU[cuda、cudnn]、CPU安装教学,以及查看CPU、GPU内存使用情况
Linux和Windows系统下安装深度学习框架所需支持:Anaconda.Paddlepaddle.Paddlenlp.pytorch,含GPU.CPU版本详细安装过程 1.下载 Anaconda ...
- python调用gpu进行运算_tensorflow指定CPU与GPU运算的方法实现
1.指定GPU运算 如果安装的是GPU版本,在运行的过程中TensorFlow能够自动检测.如果检测到GPU,TensorFlow会尽可能的利用找到的第一个GPU来执行操作. 如果机器上有超过一个可用 ...
- pytorch指定GPU训练
主要讲单机多卡(单主机多GPUs训练) 使用多卡训练的方式有很多,当然前提是我们的设备中存在多个GPU:使用命令nvidia-smi查看当前Ubuntu平台的GPU数量,其中每个GPU被编上了序号:[ ...
最新文章
- 给手绘图着色(添加颜色或色彩):CVPR2020论文点评
- 案例:来自Uber的Go语言GC优化实践
- 开源的那些事儿之如何看待开源
- Linux进程虚拟地址空间
- mimo的误码率_混合波束成形专栏|基础:深入浅出5G,毫米波,大规模MIMO与波束赋形...
- Vue项目启动webpack报错Module build failed: Error: No PostCSS Config found in......
- 算法之排序算法-shell排序(移位法)
- 动画:什么是散列表?
- 《C和C++程序员面试秘笈》——1.4 i++与++i哪个效率更高
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十二节--小结,Bootstrap Table之角色管理
- matlab中升余弦滚降滤波器_升余弦滤波器原理
- NPDP产品经理小知识-影响团队绩效的因素
- 审美灵感|插画配色分享
- Docker容器引擎
- Visio中的内容另存为图片且不改变画质
- 企业的代码发布解决方案
- TMS320F28335时钟(1) -----PLL倍频器的初始化详解
- stc51单片机串口接收多字节数据
- windows解决connection Error: couldn‘t reach http://raw.githubusercontent.com/huggingface/...
- PX4固件在Gazebo下进行SITL仿真自己的包时遇到MODE: Unsupported FCU问题
热门文章
- 英文课程名称 c语言程序设计,课程名称C语言程序设计I.doc
- docker(podman)命令参考
- HP02: ssh: Could not resolve hostname hp02: Name or service not known HP01: ssh: Could not resolve h
- 计算机组装内部线的整理,计算机组装与维护笔记整理.doc
- HighCharts:设置饼图不可点击选择
- Cesium:加载本地高程/地形数据
- Python:字符串、列表、元组、字典之间的相互转换
- Git:git pull 的使用
- 大脑开发——超右脑觉醒
- 论文笔记_S2D.47_2017-ICRA_SemanticFusion(语义融合):采用卷积神经网络CNN的稠密3D语义建图