La compilation avec XLA peut grandement améliorer les performances de vos programmes, mais l'interopérabilité TensorFlow présente un certain nombre d'angles aigus connus.
tf.Variable
sur un autre appareil
Message d'erreur : INVALID_ARGUMENT: Trying to access resource <Variable> (defined @ <Loc>) located in device CPU:0 from device GPU:0
Le cluster XLA s'exécute sur un seul appareil et ne peut ni lire ni écrire sur tf.Variable
situé sur un autre appareil. Habituellement, ce message d'erreur indique que la variable n'a pas été placée sur le bon périphérique pour commencer. Le message d'erreur doit spécifier précisément l'emplacement de la variable incriminée.
L'interconversion TensorArray TF/XLA n'est pas prise en charge
Message d'erreur : Support for TensorList crossing the XLA/TF boundary is not implemented
.
XLA prend en charge tf.TensorArray
. Cependant, l' interconversion entre les représentations TF et XLA n'est pas encore implémentée. Cette erreur survient souvent lorsque le TensorArray
est utilisé à l'intérieur du bloc compilé, mais que la dérivée est prise à l'extérieur.
Solution : compilez la portée la plus externe qui prend la dérivée.
TensorFlow tandis que les boucles doivent être délimitées (ou avoir la backprop désactivée)
Message d'erreur : 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
.
Les boucles TF while créées à l'aide tf.while_loop
prennent en charge la rétropropagation en accumulant tous les résultats intermédiaires dans un TensorArray
, mais XLA ne prend en charge que les TensorArray
bornés.
Solution : toutes les boucles while compilées doivent avoir le paramètre maximum_iterations
défini sur une valeur constante connue au moment de la compilation, ou la rétropropagation désactivée à l'aide back_prop=False
.
Le tf.TensorArray
dynamique n'est pas pris en charge
Les écritures dans tf.TensorArray(..., dynamic_size=True)
ne sont pas compilables avec XLA, car de telles écritures nécessitent un nombre inconnu de réallocations lorsque le tableau dépasse la limite d'origine.
Solution : fournissez une liaison connue statiquement à vos tableaux.
La génération de nombres aléatoires ignore la graine TF
XLA ignore actuellement les graines TF pour les opérations aléatoires. Cela affecte les opérations aléatoires TF avec état, telles que tf.random.normal
ou tf.nn.dropout
. XLA se comportera comme si la compilation était ensemencée avec une nouvelle graine unique à chaque exécution dans le même processus (la première exécution du processus donnera toujours le même résultat).
Solution : utilisez les RNG recommandés tels que tf.random.stateless_uniform
ou le tf.random.Generator
directement.
Les entrées obligatoires qui sont des fonctions de variables d'induction ne sont pas prises en charge
Message d'erreur : XLA compilation requires that operator arguments that represent shapes or dimensions be evaluated to concrete values at compile time. This error means that a shape or dimension argument could not be evaluated at compile time, usually because the value of the argument depends on a parameter to the computation, on a variable, or on a stateful operation such as a random number generator
.
XLA nécessite que certaines valeurs soient connues au moment de la compilation, telles que l'axe de réduction d'une opération de réduction ou les dimensions de transposition. Considérons le cas où, par exemple, l'axe de réduction est défini en fonction d'une variable d'induction de tf.range
: le résoudre statiquement n'est pas possible sans dérouler toute la boucle, ce qui pourrait ne pas être souhaité par l'utilisateur.
Solution : Déroulez les boucles, par exemple en convertissant tf.range
en Python range
.