Bajo uso de GPU y rendimiento con Tensorflow + RNN

He implementado una red que intenta predecir una palabra de una oración. La red es bastante compleja, pero aquí hay una versión simple de ella:

Tomar índices de palabras en oraciones y convertirlas en incrustacionesEjecute cada oración a través de LSTMDé a cada palabra en la oración una puntuación con una multiplicación lineal de la salida LSTM

Y aquí está el código:

# 40 samples with random size up to 500, vocabulary size is 10000 with 50 dimensions
def inference(inputs):
   inputs = tf.constant(inputs)
   word_embeddings = tf.nn.embedding_lookup(embeddings, inputs)

   lengths = sequence_length(inputs)

   cell = BasicLSTMCell(cell_size)
   outputs, output_states = tf.nn.bidirectional_dynamic_rnn(cell, cell,     word_embeddings, sequence_length=lengths, dtype=tf.float32)
   lstm_out = tf.concat(outputs, 2)

   words_representations = tf.reshape(lstm_out, [-1, cell_size * 2])
   W = tf.Variable(tf.random_uniform([cell_size * 2, 1], -1, 1), name='W',     dtype=tf.float32)
   words_scores = tf.reshape(tf.matmul(words_representations, W), [-1,     max_length])

   return words_scores

Código reproducible en esencia

Mi problema es la baja utilización de la GPU, alrededor del 40%, con Titan X.

Algunas notas

Estoy usando un tamaño de lote de 40. Si bien puedo hacerlo más grande, digamos 1000, y obtener muy buenas velocidades por muestra (¡permanece casi el mismo tiempo por lote! ~ 0.7s vs ~ 0.8s) - Quiero que el tamaño de mi lote permanecer en este tamaño debido a varias razones, entre otras, para permanecer similar a un artículo que estoy tratando de implementar.En este ejemplo, el lote dado también son los datos completos, por lo que no hay problemas de procesamiento por lotes, colas, etc., lo que podría facilitar la comprensión del problema.

Lo que sospecho que es el problema, y como lo señalan las respuestas a problemas similares en los foros, es la transferencia repetida de memoria de CPU a GPU. Así es como se ve el resultado del rastreo:

Las barras verdes (pid 9 y 11) son MEMCPYHtoD o MEMCPYDtoH. ¿Cómo puedo evitarlos?

¿Qué puedo hacer para mejorar el rendimiento de la velocidad sin aumentar el tamaño del lote?

El código reproducible de muestra se puede encontraraquí. Usando Tensorflow 1.0, cudnn 5.1, cuda 8

Gracias.

Respuestas a la pregunta(0)

Su respuesta a la pregunta