如何仅使用一个 GPU 进行 tensorflow 会话?

bat*_*man 5 python cuda tensorflow tensorrt

我有两个 GPU。我的程序使用 TensorRT 和 Tensorflow。

当我只运行 TensorRT 部分时,没问题。当我与 Tensorflow 部分一起运行时,出现以下错误

[TensorRT] ERROR: engine.cpp (370) - Cuda Error in ~ExecutionContext: 77 (an illegal memory access was encountered)
terminate called after throwing an instance of 'nvinfer1::CudaError'
  what():  std::exception
Run Code Online (Sandbox Code Playgroud)

问题是当 Tensorflow 会话开始时如下

self.graph = tf.get_default_graph()
self.persistent_sess = tf.Session(graph=self.graph, config=tf_config)
Run Code Online (Sandbox Code Playgroud)

它将两个 GPU 加载为

2019-06-06 14:15:04.420265: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 6965 MB memory) -> physical GPU (device: 0, name: Quadro P4000, pci bus id: 0000:04:00.0, compute capability: 6.1)
2019-06-06 14:15:04.420713: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:1 with 7159 MB memory) -> physical GPU (device: 1, name: Quadro P4000, pci bus id: 0000:05:00.0, compute capability: 6.1)
Run Code Online (Sandbox Code Playgroud)

我试图只加载一个 GPU 作为

(1)放在python代码之上

import os
os.environ["CUDA_VISIBLE_DEVICES"]="0"
Run Code Online (Sandbox Code Playgroud)

(2)

with tf.device('/device:GPU:0'):
    self.graph = tf.get_default_graph()
    self.persistent_sess = tf.Session(graph=self.graph, config=tf_config)
Run Code Online (Sandbox Code Playgroud)

两者都不起作用。

如何解决问题?

bat*_*man 7

我可以只加载一个 GPU,将以下几行放在 python 代码的第一行。

import sys, os
os.environ["CUDA_VISIBLE_DEVICES"]="0"
Run Code Online (Sandbox Code Playgroud)

  • 是的,这确实需要在与 CUDA 发生*任何*交互之前设置。请注意,避免将其直接放入代码中通常是一个好习惯。相反,您可以使用“CUDA_VISIBLE_DEVICES=0 python3 myScript.py”启动您的脚本。这让其他人可以在不更改代码的情况下通过多个 GPU 使用您的脚本。 (3认同)