Я пытаюсь ограничить количество ядер, которые использует сеанс 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 (что очень дорого, потому что для загрузки моих данных требуется почти час).
Вы используете несколько сеансов параллельно? Что вы делаете на своем графике? Я просто сделал быстрый тест с некоторыми операциями, просматривающими из очереди параллельно и делая циклы, и установка этих флагов имела эффект ограничения на 1 ядро. –
Я обновил запись с графиком и некоторыми дополнительными комментариями. Я просто использую один сеанс за раз. –
Вы используете сеанс с 'с tf.Session (..) как sess:'? – fabrizioM