このページは Cloud Translation API によって翻訳されました。
Switch to English

XLAでのエイリアス

このドキュメントでは、XLAのエイリアシングAPIについて説明します。XLAプログラムを構築するときに、入力バッファーと出力バッファーの間で必要なエイリアスを指定できます。

コンパイル時のエイリアシングの定義

たとえば、入力に1を追加する単純なHLOモジュールを考えます。

 HloModule increment

ENTRY entry {
  %p = f32[] parameter(0)
  %c = f32[] constant(1)
  ROOT %out = f32[] add(%p, %c)
}
 

このモジュールは、2つの4バイトバッファーを割り当てます。1つは入力%p用、もう1つは出力%outです。

ただし、更新をインプレースで実行することが望ましい場合がよくあります(たとえば、フロントエンドで式を生成する場合、増分p++ように、入力変数が計算後に有効ではなくなりp++ )。

このような更新を効率的に実行するには、入力エイリアスを指定できます。

 HloModule increment, input_output_alias={ {}: 0 }

ENTRY entry {
  %p = f32[] parameter(0)
  %c = f32[] constant(1)
  ROOT %out = f32[] add(%p, %c)
}
 

この形式は、出力全体( {}マークされている)が入力パラメーター0エイリアスされることを指定してい0

プログラムでエイリアスを指定するには、 XlaBuilder::SetUpAlias APIを参照してください。

実行時にエイリアスを定義する

前の手順で定義したエイリアスは、 コンパイル時に指定されます。実行中に、 LocalClient::RunAsync APIを使用して実際にバッファーを寄付するかどうかを選択できます。

プログラムへの入力バッファーは、 ExecutionInputにラップされますMaybeOwningDeviceMemoryは、 MaybeOwningDeviceMemoryツリーが含まれています。メモリが所有として指定されている場合(バッファーの所有権がXLAランタイムに渡される)、バッファーは実際に寄付され、更新はコンパイル時のエイリアシングAPIの要求に応じてインプレースで実行されます。

ただし、コンパイル時にエイリアスが設定されたバッファが実行時に寄付されない場合は、 コピー保護が作動します。追加の出力バッファOが割り当てられ、エイリアスを設定するはずだった入力バッファP内容がOコピーされます。 (したがって、プログラムは実行時にバッファーOが寄付されたかのようにプログラムを実行できます)。

フロントエンド相互運用

TF / XLA

XLAでコンパイルされたTensorFlowプログラムのクラスターでは、すべてのリソース変数の更新はコンパイル時にエイリアスされます(実行時のエイリアスは、リソース変数テンソルへの参照を他に保持しているかどうかによって異なります)。