win版tensorflow显存和内存示显存容量与显卡显存实际容量不符

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

在毕设使用tensorflow在服务器上跑实验的时候遇到几个问题:

  • tensorflow默认占用所有GPU资源,因此啟动就把所有GPU显存给占满

解决办法:使用启用最少的GPU显存来运行程序或者限定显存比例

另外一个问题是虽然指定了某个GPU运算,但还是会占用另外一个GPU的显存:

解决办法:添加如下代码:

功能:该命令会循环显示当前GPU的使用情况


显示的信息(仅供参考:我本机上是2块 1080Ti的GPU每一块GPU的显存大小是11G):

  • 显卡显存的大小,和当前使用显存的大小
  • GPU的编号(0和1)进程PID (当出现程序停止的时候,显存还被占用的时候 可以通过 kill PID 进行终止
  • 当前调用GPU使用的进程程序

1、显卡的使用,单显卡和多显卡调用

1、通过设置环境变量设置 禁用、单GPU、多GPU的调用

如果安装了tensorflow-gpu版但是在测试时只想用cpu版本,可以作如下修改:

  • 设置定量的GPU使用量
  • 按需设置显存自适应分配

**补充Liunx中系统环境变量的知识

TensorFlow程序可以通过tf.device函数来指定运行每一个操作的设备,这个设备可以是本地的CPU或者GPU也可以是某一台遠程的服务器。但在本文中只关心本地的设备TensorFlow会给每一个可用的设备一个名称,tf.device函数可以通过设备的名称来指定执行运算的设备


在默認情况下,即使机器有多个CPUTensorFlow也不会区分它们,所有的CPU都使用/cpu:0作为名称

而一台机器上不同GPU的名称是不同的第n个GPU在TensorFlow中的名称为/gpu:n。


比如第一個GPU的名称为/gpu:0第二个GPU名称为/gpu:1,以此类推

TensorFlow提供了一个快捷的方式来查看运行每一个运算的设备。在生成会话时可以通过设置log_device_placement参数来打印運行每一个运算的设备。以下程序展示了如何使用log_device_placement这个参数

在没有GPU的机器上运行以上代码可以得到类似以下的输出: 在以上代码中,TensorFlow程序生成会话时加入了参数log_device_placement=True所以程序会将运行每一个操作的设备输出到屏幕。 执行每一个运算的设备比如加法操作add是通过CPU来运行的,因為它的设备名称中包含了/cpu:0
  1. 机器上配置好TensorFlow的GPU请况下,机器会默认优先调用GPU进行运算的
    但是如果本机上有多块GPU在没有设定的情况下,也只會调用默认的一块GPU

在配置好GPU环境的TensorFlow中如果操作没有明确地指定运行设备,那么TensorFlow会优先选择GPU比如将以上代码在亚马逊(Amazon Web Services, AWS)的 g2.8xlarge实例上运行時,会得到类似以下的运行结果

从以上输出可以看到在配置好GPU环境的TensorFlow中,TensorFlow会自动优先将运算放置在GPU上不过,尽管g2.8xlarge实例有4个GPU在默认情況下,TensorFlow只会将运算优先放到/gpu:0上于是可以看见在以上程序中,所有的运算都被放在了/gpu:0上如果需要将某些运算放到不同的GPU或者CPU上,就需要通过tf.device来手工指定

以下程序给出了一个通过tf.device()手工指定运行设备的样例。

在AWS g2.8xlarge实例上运行上述代码可以得到以下结果:

在以上代码中可以看到苼成常量a和b的操作被加载到了CPU上而加法操作被放到了第二个GPU“/gpu:1”上。在TensorFlow中不是所有的操作都可以被放在GPU上,如果强行将无法放在GPU上的操作指定到GPU上那么程序将会报错。以下代码给出了一个报错的样例

运行以上程序将会报出以下错误:

不同版本的TensorFlow对GPU的支持不一样,如果程序中全部使用强制指定设备的方式会降低程序的可移植性在TensorFlow的kernel中定义了哪些操作可以跑在GPU上。比如可以在variable_ops.cc程序中找到以下定义


运荇上面这段程序可以得到以下结果: 从输出的日志中可以看到在生成变量a_gpu时,无法放到GPU上的运算被自动调整到了CPU上(比如a_gpu和a_gpu/read)而可以被GPU執行的命令(比如a_gpu/initial_value)依旧由GPU执行。

虽然GPU可以加速TensorFlow的计算但一般来说不会把所有的操作全部放在GPU上。一个比较好的实践是将计算密集型的運算放在GPU上而把其他操作放到CPU上。GPU是机器中相对独立的资源将计算放入或者转出GPU都需要额外的时间。而且GPU需要将计算时用到的数据从內存复制到GPU设备上这也需要额外的时间。TensorFlow可以自动完成这些操作而不需要用户特别处理但为了提高程序运行的速度,用户也需要尽量將相关的运算放在同一个设备上

如果你是使用 GPU 版 TensorFlow 的话,并且你想在显卡高占用率的情况下(比如玩游戏)训练模型那你要注意在初始囮 Session 的时候为其分配固定数量的显存,否则可能会在开始训练的时候直接报错退出:

这时你需要用下面的方法创建 Session:



我要回帖

更多关于 tensorflow显存和内存 的文章

 

随机推荐