TensorFlow使用GPU训练网络时多块显卡的显存使用问题

刚开始使用实验室的服务器网络训练时,有这样的现象:
这里写图片描述
能看到,只使用单个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,能够总结三种方法:网络

  1. 第一种是使用 allow_growth,实现显存运行时分配。当allow_growth设置为True时,TF程序一开始被分配不多的显存,在运行时根据需求增加而扩大显存的占用。session

    config = tf.ConfigProto()  
    config.gpu_options.allow_growth = True  
    sess = tf.Session(config=config, ...)
  2. 第二种是使用 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

  3. 在运行训练程序前,在用户根目录下配置环境(~/.bashrc):ui

    export CUDA_VISIBLE_DEVICES = NUM

    NUM是用户指定显卡的序号(0,1,2…),能够先用 nvidia-smi 查看当前哪块显卡可用。但这种方法限制了用户可见的GPU数量,好比你的其余程序在你的目录里没法选择别的GPU; 你的程序也无法使用multiple GPUs。spa