代码之家  ›  专栏  ›  技术社区  ›  GPhilo satyendra

在多会话场景中,如何将GPU隐藏在一个tf::session()中?

  •  0
  • GPhilo satyendra  · 技术社区  · 6 年前

    我有一个C++程序,它使用两个不同的分类器在单独运行。 tensorflow::Session 其中一个模型需要在GPU上运行,而第二个模型非常小,我希望它在CPU上运行。

    我尝试使用以下方法创建会话:

    auto options = tensorflow::SessionOptions();
    options.config.mutable_gpu_options()->set_per_process_gpu_memory_fraction(0);
    m_session.reset(tensorflow::NewSession(options));
    

    但这似乎只会触发默认的“霸占GPU”行为。

    我还试着和 options.config.mutable_gpu_options()->set_visible_device_list("-1") 但是在列表中有一个针对无效设备的tf代码的特定检查,它会引发一个错误。

    设置 CUDA_VISIBLE_DEVICES=-1 在运行程序之前的环境中,当然不是一个选项,因为GPU对于需要它的会话应该是可见的。

    有人知道怎么禁止吗 只有一个 使用GPU的一个会话?

    1 回复  |  直到 6 年前
        1
  •  1
  •   M. Rath    6 年前

    一个简单的解决方法是临时设置 CUDA_VISIBLE_DEVICES=-1 使用 putenv("CUDA_VISIBLE_DEVICES=-1"); 并在创建会话后重置它。

    std::string str_tmp = "CUDA_VISIBLE_DEVICES=";
    str_tmp += getenv("CUDA_VISIBLE_DEVICES");
    putenv("CUDA_VISIBLE_DEVICES=-1");
    
    #Create session
    
    #Reset environment variable
    putenv(str_tmp);
    

    但是,在不改变环境变量的情况下,可能有一种更清洁的方法。