2017-06-12 166 views
2

システム情報:1.1.0、GPU、Windows、Python 3.5、コードはipythonコンソールで動作します。tf.device( '/ cpu:0')を使用する場合のTensorflowの割り当て

私は2つの異なるTensorflowセッションを実行しようとしています.1つはGPU(いくつかのバッチ作業を行います)ともう1つはクイックテストに使用するCPUです。

問題は、with tf.device('/cpu:0')を指定して2番目のセッションを生成すると、セッションがGPUメモリを割り当てようとしていて、他のセッションがクラッシュすることです。

マイコード:

import os 
os.environ["CUDA_VISIBLE_DEVICES"] = "" 
import time 

import tensorflow as tf 

with tf.device('/cpu:0'): 
    with tf.Session() as sess: 
    # Here 6 GBs of GPU RAM are allocated. 
    time.sleep(5) 

どのように私はGPUを無視するTensorflowを強制できますか?

@Nicolasによってコメントで示唆したように、私は見てat this answerを取り、印刷した

import os 
os.environ["CUDA_VISIBLE_DEVICES"] = "" 
import tensorflow as tf 

from tensorflow.python.client import device_lib 
print(device_lib.list_local_devices()) 

を実行しました:UPDATE

[name: "/cpu:0" 
device_type: "CPU" 
memory_limit: 268435456 
locality { 
} 
incarnation: 2215045474989189346 
, name: "/gpu:0" 
device_type: "GPU" 
memory_limit: 6787871540 
locality { 
    bus_id: 1 
} 
incarnation: 13663872143510826785 
physical_device_desc: "device: 0, name: GeForce GTX 1080, pci bus id: 0000:02:00.0" 
] 

それは私には思える場合でも、その私は、CUDAデバイスを無視するようにスクリプトに明示していますが、まだそれを見つけて使用しています。これはTF 1.1のバグでしょうか?

答えて

2

それは空の文字列にCUDA_VISIBLE_DEVICESを設定することないはスクリプトに見えるCUDAデバイスをマスクしないことが判明。

documentation of CUDA_VISIBLE_DEVICES(MEによって追加強調)から:

インデックスが存在している配列で CUDAアプリケーションに表示され、それらが 配列の順に列挙されているデバイスのみ。 インデックスの1つが無効である場合、インデックスが無効インデックスに先行する のデバイスのみがCUDAアプリケーションに表示されます。 見えるように-1,1、0,2に CUDA_VISIBLE_DEVICES設定装置1 前に列挙される2 不可視とデバイス原因デバイス0と2と2,1原因装置0にCUDA_VISIBLE_DEVICES設定、 例えば、そして装置1は不可視である。それはドキュメントに記載されていないよう

それは、「有効なデバイスが存在しない」として扱われるために使用される空の文字列のように思えるけど、意味を変えました。

コードをos.environ["CUDA_VISIBLE_DEVICES"] = "-1"に変更すると問題が解決されます。

import os 
os.environ["CUDA_VISIBLE_DEVICES"]="-1"  
import tensorflow as tf 

from tensorflow.python.client import device_lib 
print(device_lib.list_local_devices()) 

を実行すると、今

[name: "/cpu:0" 
device_type: "CPU" 
memory_limit: 268435456 
locality { 
} 
incarnation: 14097726166554667970 
] 

を印刷し、tf.SessionはもうGPUのメモリを占有しませんインスタンス化します。

+1

いくつかのドキュメントの例では、さまざまな回答(あなたのものを含む)を集約(および引用)する自由を取っています(stackoverflow.com/documentation/tensorflow/10621を参照)。あなたが気にしないことを願っています。編集してください。 – npf

2

これらの設定オプションの1つを試してみたいですか? documentation 1として

config = tf.ConfigProto() 
config.gpu_options.allow_growth = True 
# or config.gpu_options.per_process_gpu_memory_fraction = 0.0 
with tf.Session(config=config) as sess: 
    ... 

、それはあなたがこの特定のセッションのためにあなたのGPUのメモリを管理するのに役立つはずですので、2番目のセッションでは、GPU上で実行することができます。

EDIT:あなたもこれを試してみてください。このanswerに従って:

import os 
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" # see issue #152 
os.environ["CUDA_VISIBLE_DEVICES"]="-1" 
+0

'config.gpu_options.per_process_gpu_memory_fraction = 0.0'オプションは私にとってはうまくいかず、まだGPUにメモリを割り当てようとしていて、他のセッションを強制終了します。 (興味深いことに、これはもう一つのセッションであり、もう一つは続行します。) – GPhilo

+0

'config.gpu_options.allow_growth = True'オプションは、IMOがかなり混乱していますが、このトリックを行うようです。 'allow_growth'はGPUメモリのプリアロケーションをオフにするだけですが、スクリプト用にCUDAデバイスを無効にしているときにメモリがあらかじめ割り当てられているのはなぜですか? – GPhilo

+0

あなたがセッションを言ったとき、私は2つの 'tf.Session'を1つのpythonプロセスで作成するときに' tf.Session'を意味しましたか?1つはGPUパート用、もう1つはCPUパート用です。 – npf

関連する問題