Компиляция с помощью XLA может значительно повысить производительность ваших программ, но взаимодействие TensorFlow имеет ряд известных острых углов.
tf.Variable
на другом устройстве
Сообщение об ошибке : INVALID_ARGUMENT: Trying to access resource <Variable> (defined @ <Loc>) located in device CPU:0 from device GPU:0
Кластер XLA работает ровно на одном устройстве и не может читать или писать в tf.Variable
расположенную на другом устройстве. Обычно это сообщение об ошибке указывает на то, что переменная изначально не была помещена на нужное устройство. В сообщении об ошибке должно быть точно указано местоположение вызывающей ошибку переменной.
Взаимное преобразование TensorArray TF/XLA не поддерживается.
Сообщение об ошибке : Support for TensorList crossing the XLA/TF boundary is not implemented
.
XLA поддерживает tf.TensorArray
. Однако взаимное преобразование между представлениями TF и XLA еще не реализовано. Эта ошибка часто возникает, когда TensorArray
используется внутри скомпилированного блока, а производная выносится наружу.
Обходной путь : скомпилируйте самую внешнюю область видимости, которая принимает производную.
Циклы TensorFlow while должны быть ограничены (или отключено обратное распространение)
Сообщение об ошибке : 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
.
Циклы while TF, созданные с помощью tf.while_loop
поддерживают обратное распространение, накапливая все промежуточные результаты в TensorArray
, но XLA поддерживает только ограниченные TensorArray
.
Обходной путь: во всех скомпилированных циклах while необходимо либо установить для параметра maximum_iterations
постоянное значение, известное во время компиляции, либо отключить обратное распространение с помощью back_prop=False
.
Динамический tf.TensorArray
не поддерживается
Запись в tf.TensorArray(..., dynamic_size=True)
не компилируется с помощью XLA, поскольку такая запись требует неизвестного количества перераспределений, когда массив превышает исходную границу.
Обходной путь : предоставьте статически известную привязку к вашим массивам.
Генерация случайных чисел игнорирует начальное число TF
В настоящее время XLA игнорирует начальные числа TF для случайных операций. Это влияет на случайные операции TF с отслеживанием состояния, такие как tf.random.normal
или tf.nn.dropout
. XLA будет вести себя так, как если бы компиляция заполнялась новым уникальным начальным числом при каждом запуске в рамках одного и того же процесса (первый запуск процесса всегда дает один и тот же результат).
Обходной путь: используйте рекомендуемые RNG , такие как tf.random.stateless_uniform
или tf.random.Generator
напрямую.
Должны быть постоянными входы, которые являются функциями переменных индукции, не поддерживаются
Сообщение об ошибке: 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 требует, чтобы определенные значения были известны во время компиляции, например, ось уменьшения операции сокращения или размеры транспонирования. Рассмотрим случай, когда, например, ось уменьшения определяется как функция индукционной переменной tf.range
: ее статическое разрешение невозможно без развертывания всего цикла, что может быть нежелательно для пользователя.
Обходной путь: разверните циклы, например, путем преобразования tf.range
в range
Python.