参照:Using GPUs
マニュアルデバイス配置
お好みのデバイス上で実行するために特定の操作を希望の場合自動的に選択されたものの代わりに、tf.device
を使用して、そのコンテキスト内のすべての操作が同じデバイス割り当てを持つようにデバイスコンテキストを作成することができます。
# Creates a graph.
with tf.device('/cpu:0'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(c))
あなたは今aとbがcpu:0
に割り当てられていることがわかります。デバイスが明示的にMatMul
操作のために指定されていなかったので、TensorFlowランタイムは操作と使用可能なデバイス(GPU:0この例では)に基づいていずれかを選択し、必要に応じて、自動的にデバイス間のテンソルをコピーします。以前
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: Tesla K40c, pci bus
id: 0000:05:00.0
b: /job:localhost/replica:0/task:0/cpu:0
a: /job:localhost/replica:0/task:0/cpu:0
MatMul: /job:localhost/replica:0/task:0/gpu:0
[[ 22. 28.]
[ 49. 64.]]
2.
を参照してください回答:あなたはあなたの中に複数のGPUを持っている場合は、マルチGPUシステム
上の単一のGPUを使用してUsing GPUs
をシステムでは、IDが最も小さいGPUがデフォルトで選択されます。あなたが別のGPU上で実行したい場合は、明示的に設定を指定する必要があります。
# Creates a graph.
with tf.device('/gpu:2'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print sess.run(c)
以前CUDA_VISIBLE_DEVICES – Masking GPUs
から1
回答あなたのCUDAアプリケーションをい特定のGPUをターゲットにする必要がありますか? GPU対応コードを記述している場合は、通常、デバイスクエリを使用して、 で目的のGPUを選択します。しかし、 テストのための迅速かつ簡単な解決策は、あなたのCUDAアプリケーションが見ているデバイスを制限 に環境変数CUDA_VISIBLE_DEVICESを使用することです。あなたはノード上のリソースを共有しようとしているか、 あなたのGPUが特定のGPUをターゲットに実行可能な有効にしたい場合、これは 便利です。
環境変数構文
= 1つののみがデバイス1
CUDA_VISIBLE_DEVICESは CUDA_VISIBLE_DEVICESが分かるであろう結果= 0,1デバイス0と1は、上記のように=」0,1” 同じ可視 CUDA_VISIBLE_DEVICESなり、引用符はオプションです CUDA_VISIBLE_DEVICES = 0,2,3デバイス0,2,3が表示されます。デバイス1 がマスクされています
CUDAはゼロから始まる可視デバイスを列挙します。最後の の場合、デバイス0,2,3がデバイス0,1,2として表示されます。 を文字列の順序を「2,3,0」に変更すると、デバイス2,3,0が列挙されます それぞれ0,1,2とする。 が存在しないデバイスにCUDA_VISIBLE_DEVICESが設定されていると、すべてのデバイスがマスクされます。 の有効なデバイス番号と無効なデバイス番号の組み合わせを指定できます。無効な値 の前のすべてのデバイスが列挙され、無効な値の後のすべてのデバイスは にマスクされます。
システムで使用可能なハードウェアのデバイスIDを確認するには、 を使用して、CUDA SDKに含まれているNVIDIAのdeviceQuery実行可能ファイルを実行できます。 ハッピープログラミング!
クリス・メイソン
は、[全体のリソースを占有しないようにTFを強制する方法を発見されましたか? (multi-gpuに関する)](https://groups.google.com/a/tensorflow.org/forum/#!searchin/discuss/gpu/discuss/QmMqfikKxlU/BC5P4XrDEgAJ)[CUDA_VISIBLE_DEVICES - Masking GPUs](http ://acceleware.com/blog/cudavisibledevices-masking-gpus) –
これは本当に役立ちます。しかし、なぜTensorFlowはマシン上のすべてのデバイスに対して自動的に初期化されますか? Btwは私が受け入れる答えを出します。 – Zk1001
TensorFlowは、「研究への生産」を目指しています。すべての計算能力を使用するデフォルトは、仕事をできるだけ早く完了させるという期待に応えているようです。実際にチューニングすることができます。しかし、あなたは3つのGPUについて言及しており、2つしかあなたのログには表示されません。どうして? –