Planeo ejecutar una red recurrente muy grande (por ejemplo, 2048×5), ¿es posible definir una capa en una GPU en tensorflow? ¿Cómo debo implementar el modelo para lograr la mejor eficiencia? Entiendo que hay una sobrecarga para la comunicación entre GPU o GPU-CPU-GPU.
La división de un modelo grande en múltiples GPU es ciertamente posible en TensorFlow, pero hacerlo de manera óptima es un problema de investigación difícil. En general, deberá hacer lo siguiente:
Envuelva grandes regiones contiguas de su código en un with tf.device(...):
nombrando las diferentes GPU:
with tf.device("/gpu:0"): # Define first layer. with tf.device("/gpu:1"): # Define second layer. # Define other layers, etc.
Al crear su optimizador, pase el argumento opcional colocate_gradients_with_ops=True
al método optimizer.minimize()
:
loss = ... optimizer = tf.train.AdaGradOptimizer(0.01) train_op = optimizer.minimize(loss, colocate_gradients_with_ops=True)
(Opcionalmente.) Es posible que deba habilitar la “colocación suave” en tf.ConfigProto
cuando cree su tf.Session
, si alguna de las operaciones en su modelo no puede ejecutarse en la GPU:
config = tf.ConfigProto(allow_soft_placement=True) sess = tf.Session(config=config)