Caffe - 显存优化 1. 测试了一下, ResNet101 相对于官方 caffe, 能够明显节省显存占用, batchsize 可以增加很多. 在训练深度网络时, GPU显存资源是有限的. 资源消费者即是网络中的网络层(layers/operations), 在 GPU 保存着训练时的中间结果(intermediate results). 由于 Caffe 具有完全不同的内存模型, 其每个内存块是由 OS/GPU 来自动分配的. 在内存池中实现类似功能是比较棘手的. 相反地, 采用了一种替代方法.
服务器上的多张 GPU 都占满, 有点浪费性能. 因此, 需要类似于 Caffe 等框架的可以设定 GPU ID 和显存自动按需分配. 实际中发现, Keras 还可以限制 GPU 显存占用量. 这里涉及到的内容有: GPU ID 设定 GPU 显存占用按需分配 GPU 显存占用限制 GPU 显存优化 1. GPU ID 设定 #! GPU ID 从 0 开始, GPUID=1 即表示第二块 GPU. 2. GPU 显存占用按需分配 #! GPU 显存占用限制 #! 设定 GPU 显存占用比例实际上是避免一定的显存资源浪费. 4. GPU ID 设定与显存按需分配 #!
热卖云产品新年特惠,2核2G轻量应用服务器9元/月起,更多上云必备产品助力您轻松上云
深度学习最吃机器,耗资源,在本文,我将来科普一下在深度学习中: 何为 “资源” 不同操作都耗费什么资源 如何充分的利用有限的资源 如何合理选择显卡 并纠正几个误区: 显存和 GPU 等价,使用 GPU 0 预备知识 nvidia-smi是 Nvidia 显卡命令行管理套件,基于 NVML 库,旨在管理和监控 Nvidia GPU 设备。 ? nvidia-smi 的输出 这是 nvidia-smi 命令的输出,其中最重要的两个指标: 显存占用 GPU 利用率 显存占用和 GPU 利用率是两个不一样的东西,显卡是由 GPU 计算单元和显存等组成的 ,显存和 GPU 的关系有点类似于内存和 CPU 的关系。 gpustat 输出 显存可以看成是空间,类似于内存。 显存用于存放模型,数据 显存越大,所能运行的网络也就越大 GPU 计算单元类似于 CPU 中的核,用来进行数值计算。
深度学习最吃机器,耗资源,在本文,我将来科普一下在深度学习中: 何为“资源” 不同操作都耗费什么资源 如何充分的利用有限的资源 如何合理选择显卡 并纠正几个误区: 显存和GPU等价,使用GPU主要看显存的使用 0 预备知识 nvidia-smi是Nvidia显卡命令行管理套件,基于NVML库,旨在管理和监控Nvidia GPU设备。 ? nvidia-smi的输出 这是nvidia-smi命令的输出,其中最重要的两个指标: 显存占用 GPU利用率 显存占用和GPU利用率是两个不一样的东西,显卡是由GPU计算单元和显存等组成的,显存和GPU 这里推荐一个好用的小工具:gpustat,直接pip install gpustat即可安装,gpustat基于nvidia-smi,可以提供更美观简洁的展示,结合watch命令,可以动态实时监控GPU gpustat 输出 显存可以看成是空间,类似于内存。 显存用于存放模型,数据 显存越大,所能运行的网络也就越大 GPU计算单元类似于CPU中的核,用来进行数值计算。
服务器上的多张 GPU 都占满, 有点浪费性能. 因此, 需要类似于 Caffe 等框架的可以设定 GPU ID 和显存自动按需分配. 实际中发现, Keras 还可以限制 GPU 显存占用量. 这里涉及到的内容有: GPU ID 设定 GPU 显存占用按需分配 GPU 显存占用限制 GPU 显存优化 1. GPU ID 设定 #! GPU ID 从 0 开始, GPUID=1 即表示第二块 GPU. 2. GPU 显存占用按需分配 #! GPU 显存占用限制 #! 设定 GPU 显存占用比例实际上是避免一定的显存资源浪费. 4. GPU ID 设定与显存按需分配 #!
0 预备知识 nvidia-smi是Nvidia显卡命令行管理套件,基于NVML库,旨在管理和监控Nvidia GPU设备。 ? nvidia-smi的输出 这是nvidia-smi命令的输出,其中最重要的两个指标: 显存占用 GPU利用率 显存占用和GPU利用率是两个不一样的东西,显卡是由GPU计算单元和显存等组成的,显存和GPU 这里推荐一个好用的小工具:gpustat,直接pip install gpustat即可安装,gpustat基于nvidia-smi,可以提供更美观简洁的展示,结合watch命令,可以动态实时监控GPU gpustat 输出 显存可以看成是空间,类似于内存。 显存用于存放模型,数据 显存越大,所能运行的网络也就越大 GPU计算单元类似于CPU中的核,用来进行数值计算。 这里某些地方的计算结果可能和上面的公式对不上, 这是因为原始的AlexNet实现有点特殊(在多块GPU上实现的). ?
话不多说,直接上题 问:有没有什么办法让GPU显存不会溢出? 来自社友的回答 ▼▼▼ @巴特莱•芬克: 通过谷歌大部分找到的就是 GPU 显存溢出。
os os.environ[“CUDA_DEVICE_ORDER”] = “PCI_BUS_ID” os.environ[“CUDA_VISIBLE_DEVICES”] = “0” //这里是自己的GPU
GPU凭借强大的并行计算能力,成为深度学习加速的标配。然而,由于服务器的显存非常有限,随着训练样本越来越大,显存连一个样本都容不下的现象频频发生。 其实CPU和GPU是协同工作的,如果能合理地利用它们各自的优势,就能够节省显存资源(显存不够内存来凑),甚至获得更好的训练性能。 GPU模式下的模型训练如图1所示,总体可以分为4步: 第1步,将输入数据从系统内存拷贝到显存。 第2步,CPU指示GPU处理数据。 第3步,GPU并行地完成一系列的计算。 这是因为GPU卡的显存是非常有限的,一般远低于系统内存。以V100为例,其显存最高也仅有32G,甚至有些显存仅12G左右。因此当模型的参数量较大时,在GPU模式下模型可能无法训练起来。 好处一:充分利用CPU资源,避免显存超出 如果使用fluid.CUDAPlace指定了全局的运行设备,飞桨将会自动把支持GPU计算的OP分配在GPU上执行,然而当模型参数量过大并且显存有限时,很可能会遇到显存超出的情况
监视显存使用情况 watch [options] command 每10秒更新一次显存使用情况 watch -n 10 nvidia-smi ---- ----
接着做数据量小一点儿的场景,有70几万条数据,单词有6万多个,发现这个时候的GPU显存有3000多MB。训练时候的参数一模一样。按道理应该单词数多的那个显存比较大才对。 这个时候观察GPU显存,发现一开始是700多MB,盯着屏幕看了半天,突然等程序运行到1000多步的时候,发现GPU显存一下子跳到了3000多MB。这说明数据量的大小确实会对GPU显存产生影响。 这样就可以找到为什么GPU显存会一下子升高了。一开始训练一步一步的输出,程序都对,GPU显存也比较低,那为什么中间过程会升高呢? 结论 当数据量比较小,而GPU的显存足够存储这些数据的时候,在训练过程中会把这些数据存在GPU显存,这样每一轮训练的时候就不用从cpu读数据了,训练速度会快些。 而当数据量比较大,而GPU的显存不够时,每次GPU显存中只会存储模型和批数据。 注: 1.
除了在代码中指定使用的 GPU 编号,还可以直接设置可见 GPU 编号,使程序/用户只对部分 GPU 可见。 操作很简单,使用环境变量 CUDA_VISIBLE_DEVICES 即可。 具体来说,如果使用单卡运行 Python 脚本,则可输入 CUDA_VISIBLE_DEVICES=1 python my_script.py 脚本将只使用 GPU1。 至于显存设置,可以设置使用比例(70%): gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7) sess = tf.Session (config=tf.ConfigProto(gpu_options=gpu_options)) 也可以按需增长: config = tf.ConfigProto() config.gpu_options.allow_growth 以上这篇浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置就是小编分享给大家的全部内容了,希望能给大家一个参考。
问题 一般大家在跑tf时,单个程序往往会占满整块GPU的所有显存。 但是实际上,程序很可能并不需要那么大的显存空间。 改进方案 通过 tf.ConfigProto().gpu_options.allow_growth=True来告诉程序,只需占用实际所需的显存即可: # ---------------- session ---------------- config = tf.ConfigProto() config.gpu_options.allow_growth = True sess = tf.Session( config=config) 如果这里把 config.gpu_options.allow_growth设置为False,那么程序就会默认把整块卡的所有显存占满。
美元 GTX 1080Ti:11GB 显存,约 800 美元(二手) RTX 2080:8GB 显存,约 720 美元 RTX 2070:8GB 显存,约 500 美元 超大规模的模型在这一级别的 GPU 这主要因为输入图像为 2048x1024 的高清大图,训练所需的显存与计算都非常大。 带*符号表示 GPU 显存不足以运行模型 2. 带*符号表示 GPU 显存不足以运行模型 2. 更大的显存可以按比例用更大的 Batch size,以此推之:24GB 显存的 GPU 相比 8GB 显存的 GPU 可以用上 3 倍的 batch。 GPU 太贵,我选择薅羊毛 现在训练个模型,GPU 显存至少得上 8GB,对应的价格实在有点劝退。
而且英伟达的新产品也深深牵动着深度学习领域研究人员的心,更快的 GPU 、更大的显存、新的深度计算 API、更强大的计算集群等等都让更大规模、更高表现的模型变得更为平易近人。 看似槽点、其实亮点: 「世界最大的 GPU」、「世界最大的显存」 ? 高举着两倍显存的 Quadro GV100加速器的黄仁勋 值得一提的是,DGX-2 中使用的虽然还是 V100 GPU,但它发生了一点小变化 —— 原有的 4 颗 4GB HBM2 显存,升级为 4 颗 8GB HBM2 显存,也让 V100 GPU 的整体显存大小升级为 32GB。 (GPU其他参数,包括显存位宽、带宽均没有改变。)并且在 DGX-2中,16 个 V100 GPU 中各自拥有的 32GB 显存都将连接到一起,你甚至可以将它看成一整个 512GB 的显存空间。
总结陈词 混合精度训练做到了在前向和后向计算过程中均使用半精度浮点数,并且没有像之前的一些工作一样还引入额外超参,而且重要的是,实现非常简单却能带来非常显著的收益,在显存half以及速度double的情况下保持模型的精度
腾讯GPU 云服务器是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。
扫码关注腾讯云开发者
领取腾讯云代金券