XLAを使用してコンパイルすると、プログラムのパフォーマンスを大幅に向上させることができますが、TensorFlow相互運用機能にはいくつかの既知の鋭い角があります。
tf.Variable
異なるデバイス上
エラーメッセージ: INVALID_ARGUMENT: Trying to access resource <Variable> (defined @ <Loc>) located in device CPU:0 from device GPU:0
XLAクラスタは、1つのデバイス上で動作し、それがに読み取りまたは書き込みができませんtf.Variable
異なるデバイス上に位置しています。通常、このエラーメッセージは、変数が最初から適切なデバイスに配置されていないことを示しています。エラーメッセージは、問題のある変数の場所を正確に指定する必要があります。
TensorArray TF / XLA相互変換はサポートされていません
エラーメッセージ: Support for TensorList crossing the XLA/TF boundary is not implemented
。
XLAはサポートしていtf.TensorArray
。しかしながら、TFとXLA表現との間の相互変換は、まだ実装されていません。このエラーはしばしば発生TensorArray
コンパイルブロック内で使用されるが、誘導体が外部に取り出されます。
回避策:微分を取っている最も外側のスコープをコンパイルします。
TensorFlow whileループを制限する必要がある(またはbackpropを無効にする)
エラーメッセージ: 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ながらループは使用して作成したtf.while_loop
中ですべての中間結果を蓄積することにより、サポートバックプロパゲーションをTensorArray
囲まれた、しかしXLAのみをサポートしていTensorArray
秒。
回避策:ループはどちらか持っている必要がありながら、すべてのコンパイル済み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
直接。