2015-12-22 10 views
5

tfセッションで使用するコアの数を制限しようとしていますが、動作していません。これは私がセッションを初期化しています方法です:使用するコア数を制限する

sess = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=1, 
             intra_op_parallelism_threads=1, 
             use_per_session_threads=True)) 

システムは、12コア/ 24スレッドを持っており、私はそれらの40から60パーセントは、任意の時点で使用されていることがわかります。システムには8つのGPUもありますが、グラフ全体をtf.device('/cpu:0')で構成します。

更新:明らかに、グラフ自体は単純なLSTM-RNNであり、tfソースコードの例と非常によく似ています。完全を期すために、ここで完全なグラフです:注意すべき

node_input = tf.placeholder(tf.float32, [n_steps, batch_size, input_size], name = 'input') 
list_input = [tf.reshape(i, (batch_size, input_size)) for i in tf.split(0, n_steps, node_input)] 
node_target = tf.placeholder(tf.float32, [n_steps, batch_size, output_size], name = 'target') 
node_target_flattened = tf.reshape(tf.transpose(node_target, perm = [1, 0, 2]), [-1, output_size]) 
node_max_length = tf.placeholder(tf.int32, name = 'batch_max_length') 
node_cell_initializer = tf.random_uniform_initializer(-0.1, 0.1) 
node_cell = LSTMCell(state_size, input_size, initializer = node_cell_initializer) 
node_initial_state = node_cell.zero_state(batch_size, tf.float32) 
nodes_output, nodes_state = rnn(node_cell, 
           list_input, 
           initial_state = node_initial_state, 
           sequence_length = node_max_length) 
node_output_flattened = tf.reshape(tf.concat(1, nodes_output), [-1, state_size]) 
node_softmax_w = tf.Variable(tf.random_uniform([state_size, output_size]), name = 'softmax_w') 
node_softmax_b = tf.Variable(tf.zeros([output_size]), name = 'softmax_b') 
node_logit = tf.matmul(node_output_flattened, node_softmax_w) + node_softmax_b 
node_cross_entropy = tf.nn.softmax_cross_entropy_with_logits(node_logit, node_target_flattened, name = 'cross_entropy') 
node_loss = tf.reduce_mean(node_cross_entropy, name = 'loss') 
node_optimizer = tf.train.AdamOptimizer().minimize(node_loss) 
node_op_initializer = tf.initialize_all_variables() 

一つ重要なことは、私がtf.Session呼ん初めてならば、私は適切なパラメータを渡すことで、そのセッションのみシングルコアで実行しません。問題は、その後の実行では、セッション固有の設定を特に許可すると思われるuse_per_session_threadsを使用しても、動作を変更できないということです。私。 sess.close()を使用してセッションを終了して新しいオプションで新しいセッションを開始しても、Pythonカーネルを再起動しない限り元の動作は変更されません(非常にコストがかかります。

+0

複数のセッションを同時に使用していますか?あなたのグラフではどんなことをしていますか?私はちょうどいくつかのオペレーションを並行してキューから読み込み、ループを実行して簡単なテストを行い、それらのフラグをセットすると1コアに制限する効果があった –

+0

グラフといくつかのコメントでエントリを更新しました。私は一度に1つのセッションを使用しています。 –

+0

あなたは 'with tf.Session(..)とセッションをsess:'として使用していますか? – fabrizioM

答えて

0

TensorFlowは、最初にを作成すると、再利用される静的スレッドプールを作成する最適化を行います。これを変更する場合は、session_inter_op_thread_poolフラグに複数の異なるスレッドプールを指定し、どちらを使用するかを指定します。

0

use_per_session_threadsinter_op_parallelism_threadsにのみ影響しますが、intra_op_parallelism_threadsには影響しません。 intra_op_parallelism_threadsは、常にグローバルであるEigenスレッドプール(here参照)に使用されます。したがって、後続のセッションはこれ以上影響を与えません。

Eigenスレッドプールの初期化を引き起こす可能性がある他のTF関数もあるため、最初にtf.Sessionを作成する前に既に初期化されている可能性があります。一例はtensorflow.python.client.device_lib.list_local_devices()です。

私はこれをPythonスクリプトの非常に早い段階で解決し、適切な値でダミーのセッションを作成します。

関連する問題