刚开始使用实验室的服务器网络训练时,有这样的现象:
能看到,只使用单个GPU跑程序,但三块显卡的显存都被占用。html
这是由于TensorFlow训练时默认占用全部GPU的显存。引自TF官网:web
By default, TensorFlow maps nearly all of the GPU memory of all GPUs (subject to CUDA_VISIBLE_DEVICES) visible to the process.bash
这样若是有人想使用其余两个GPU跑程序,就会由于显存不足而没法运行。
因此须要人为指定显存占用率或指定使用单张显卡。服务器
根据 TF官网tutorial部分的Using GPUs,能够总结三种方法:网络
第一种是使用 allow_growth
,实现显存运行时分配。当allow_growth设置为True时,TF程序一开始被分配不多的显存,在运行时根据需求增加而扩大显存的占用。session
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config, ...)
第二种是使用 per_process_gpu_memory_fraction
,指定每一个可用GPU的显存分配率。在构造tf.Session()时候经过tf.GPUOptions配置参数,显式地指定须要分配的显存比例。ide
#告诉TF它能够使用每块GPU显存的40%
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config, ...)
这种方法指定了每一个GPU进程的显存占用上限,但它会同时做用于全部GPU,不能对不一样GPU设置不一样的上限。svg
在运行训练程序前,在用户根目录下配置环境(~/.bashrc):ui
export CUDA_VISIBLE_DEVICES = NUM
NUM是用户指定显卡的序号(0,1,2…),能够先用 nvidia-smi
查看当前哪块显卡可用。但这种方法限制了用户可见的GPU数量,好比你的其余程序在你的目录里没法选择别的GPU; 你的程序也无法使用multiple GPUs。spa