2015-12-22 4 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 графических процессоров, но я построил весь график с 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

Я обновил запись с графиком и некоторыми дополнительными комментариями. Я просто использую один сеанс за раз. –

+0

Вы используете сеанс с 'с tf.Session (..) как sess:'? – fabrizioM

ответ

0

TensorFlow делает оптимизацию, когда создается первый созданный файл DirectSession, он создаст статические пулы потоков, которые затем будут повторно использованы. Если вы хотите изменить это, укажите несколько разных пулов потоков в флагом session_inter_op_thread_pool и укажите, какой из них вы хотите использовать.

0

use_per_session_threads влияет только на inter_op_parallelism_threads, но не на intra_op_parallelism_threads. intra_op_parallelism_threads будет использоваться для пула собственных потоков (см. here), который всегда является глобальным, поэтому последующие сеансы больше не будут влиять на это.

Обратите внимание, что существуют другие функции TF, которые также могут инициировать инициализацию пула собственных потоков, так что может случиться, что он уже инициализирован до того, как вы создадите первый tf.Session. Один пример: tensorflow.python.client.device_lib.list_local_devices().

Я решаю это так, как это было в самом начале моего сценария Python, я создаю фиктивный сеанс с соответствующими значениями.

Смежные вопросы