A compilação com XLA pode melhorar muito o desempenho de seus programas, mas a interoperabilidade do TensorFlow tem vários cantos afiados conhecidos.
tf.Variable
em um dispositivo diferente
Mensagem de erro : INVALID_ARGUMENT: Trying to access resource <Variable> (defined @ <Loc>) located in device CPU:0 from device GPU:0
O cluster XLA é executado em exatamente um dispositivo e não pode ler ou gravar em tf.Variable
localizado em um dispositivo diferente. Normalmente, essa mensagem de erro indica que a variável não foi colocada no dispositivo certo para começar. A mensagem de erro deve especificar precisamente a localização da variável incorreta.
A interconversão TensorArray TF/XLA não é compatível
Mensagem de erro : Support for TensorList crossing the XLA/TF boundary is not implemented
.
XLA suporta tf.TensorArray
. No entanto, a interconversão entre as representações TF e XLA ainda não está implementada. Esse erro geralmente ocorre quando o TensorArray
é usado dentro do bloco compilado, mas o derivado é levado para fora.
Solução alternativa : compile o escopo mais externo que está derivando.
Os loops while do TensorFlow precisam ser limitados (ou ter o backprop desativado)
Mensagem de erro : 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 while loops criados usando tf.while_loop
suportam backpropagation acumulando todos os resultados intermediários em um TensorArray
, mas XLA suporta apenas TensorArray
s limitados.
Solução alternativa : todos os loops while compilados precisam ter o parâmetro maximum_iterations
definido para um valor constante conhecido em tempo de compilação ou backpropagation desabilitado usando back_prop=False
.
O tf.TensorArray
dinâmico não é compatível
Gravações em tf.TensorArray(..., dynamic_size=True)
não são compiláveis com XLA, pois essas gravações exigem um número desconhecido de realocações quando a matriz excede o limite original.
Solução alternativa : forneça um limite estaticamente conhecido para seus arrays.
A geração de números aleatórios ignora a semente do TF
O XLA atualmente ignora as sementes do TF para operações aleatórias. Isso afeta operações aleatórias de TF com estado, como tf.random.normal
ou tf.nn.dropout
. O XLA se comportará como se a compilação fosse propagada com uma nova semente exclusiva em cada execução dentro do mesmo processo (a primeira execução do processo sempre produzirá o mesmo resultado).
Solução alternativa : use os RNGs recomendados , como tf.random.stateless_uniform
ou o tf.random.Generator
diretamente.
As entradas obrigatórias que são funções de variáveis de indução não são suportadas
Mensagem de erro : A 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 requer que certos valores sejam conhecidos em tempo de compilação, como eixo de redução de uma operação de redução ou dimensões de transposição. Considere o caso em que, por exemplo, o eixo de redução é definido em função de uma variável de indução de tf.range
: resolvê-lo estaticamente não é possível sem desenrolar o loop inteiro, o que pode não ser desejado pelo usuário.
Solução alternativa : Desenrole loops, por exemplo, convertendo tf.range
em Python range
.