La compilación con XLA puede mejorar en gran medida el rendimiento de sus programas, pero la interoperabilidad de TensorFlow tiene varias esquinas afiladas conocidas.
tf.Variable
en un dispositivo diferente
Mensaje de error: INVALID_ARGUMENT: Trying to access resource <Variable> (defined @ <Loc>) located in device CPU:0 from device GPU:0
XLA clúster se ejecuta en exactamente un dispositivo, y no puede leer o escribir en tf.Variable
situada en un dispositivo diferente. Por lo general, este mensaje de error indica que la variable no se colocó en el dispositivo correcto para empezar. El mensaje de error debe especificar con precisión la ubicación de la variable infractora.
La interconversión de TensorArray TF / XLA no es compatible
Mensaje de error: Support for TensorList crossing the XLA/TF boundary is not implemented
.
XLA apoya tf.TensorArray
. Sin embargo, la interconversión entre las representaciones TF y XLA aún no está implementado. Este error a menudo surge cuando el TensorArray
se utiliza dentro del bloque compilado, pero el derivado se toma fuera.
Solución: compilar el alcance más exterior que está tomando la derivada.
Los bucles while de TensorFlow deben estar delimitados (o tener backprop inhabilitado)
Mensaje de error: XLA compilation requires a fixed tensor list size. Set the max number of elements. This could also happen if you're using a TensorArray in a while loop that does not have its maximum_iteration set, you can fix this by setting maximum_iteration to a suitable value
.
TF, mientras que los bucles creados usando tf.while_loop
apoyo backpropagation mediante la acumulación de todos los resultados intermedios en un TensorArray
, pero XLA solamente soporta delimitadas TensorArray
s.
Solución: todo compilado, mientras que los bucles que o bien tienen maximum_iterations
parámetro establecido en un valor constante conocido en tiempo de compilación, o desactivar mediante retropropagación back_prop=False
.
Dinámica tf.TensorArray
no es compatible
Escrituras en tf.TensorArray(..., dynamic_size=True)
no son compilable con XLA, ya que tales escrituras requieren un número desconocido de reasignaciones cuando la matriz supera el original encuadernado.
Solución: proporcionar un conocido estáticamente ligada a sus matrices.
La generación de números aleatorios ignora la semilla TF
XLA actualmente ignora las semillas TF para operaciones aleatorias. Esto afecta a las operaciones aleatorias TF con estado, como tf.random.normal
, o tf.nn.dropout
. XLA se comportará como si la compilación fuera sembrada con una nueva semilla única en cada ejecución dentro del mismo proceso (la primera ejecución del proceso siempre producirá el mismo resultado).
Solución: utilizar los generadores de números aleatorios recomendados como tf.random.stateless_uniform
o la tf.random.Generator
directamente.