我正在尝试限制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)
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脚本的早期解决方法,我创建了一个具有适当值的虚拟会话。
答案 1 :(得分:0)
TensorFlow进行优化,第一次创建DirectSession
时,它将创建静态线程池,然后重用。如果要更改此值,请在session_inter_op_thread_pool标志中指定多个不同的线程池,并指定要使用的线程池。