事件起因
實驗室服務(wù)器上是四塊GTX1080ti,但是在運行tensorflow或keras程序時,發(fā)現(xiàn)四塊卡的顯存全部被占用了。
就是下面這種情況:

正常應(yīng)該是這樣的

這讓我很費解啊。
原因分析
出現(xiàn)這種情況的原因是,tensorflow初始化時會默認(rèn)占滿全部顯卡和全部剩余顯存,這種情況肯定是不行的,你一個人用了全部的,其他人還用不用了?
對于這種情況tensorflow官網(wǎng)給出的說法是
By default, TensorFlow maps nearly all of the GPU memory of all GPUs (subject to CUDA_VISIBLE_DEVICES
) visible to the process. This is done to more efficiently use the relatively precious GPU memory resources on the devices by reducing memory fragmentation.
說白了就是,我們?yōu)榱朔乐顾槠蜑榱烁玫睦脙?nèi)存,默認(rèn)占用全部顯存。
但是我們不想用這么多也是有辦法的
解決辦法如下:
tensorflow
- 使用tensorflow時可以使用如下代碼來選著使用某塊顯卡
# Creates a graph.
with tf.device('/gpu:0'):
# write your code here
- 限制顯存使用,官網(wǎng)同樣提供了兩種解決方案
a.
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)
在這種方案下,顯存占用會隨著epoch的增長而增長,也就是運行后面的eopch時,會去申請新的顯存,前面已經(jīng)完成的epoch所占用的顯存并不會釋放,原因也是為了防止碎片化。
b.
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.3
session = tf.Session(config=config, ...)
這種方法就比較給力了,告訴tensorflow,我這塊顯卡只給你30%的顯存,其余的你給我放著不動。
keras
由于keras是使用的tensorflow后端,所以需要加上額外的語句。
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.3
set_session(tf.Session(config=config)) # 此處不同
上面的語句中設(shè)定使用那一塊顯卡和tensorflow有些不同(我沒試驗過keras是不是可以用tensorflow指定gpu的語句),需要使用CUDA_VISIBLE_DEVICES這個值來設(shè)定,這個值就是讓某幾塊(使用','分隔)顯卡可以被cuda看見,那么程序也就只能調(diào)用那幾塊顯卡了。
需要注意的是,雖然代碼或配置層面設(shè)置了對顯存占用百分比閾值,但在實際運行中如果達(dá)到了這個閾值,程序有需要的話還是會突破這個閾值。換而言之如果跑在一個大數(shù)據(jù)集上還是會用到更多的顯存。以上的顯存限制僅僅為了在跑小數(shù)據(jù)集時避免對顯存的浪費而已。
下面是只設(shè)置1,2卡可見的情況
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2"

下面是正常狀態(tài)
