Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Aliasing en XLA

Este documento describe la API de alias para XLA: al compilar un programa XLA, puede especificar el alias deseado entre las memorias intermedias de entrada y salida.

Definición de alias en tiempo de compilación

Por ejemplo, considere un módulo HLO trivial que simplemente agrega 1 a su entrada:

 HloModule increment

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

Este módulo asignará dos buffers de 4 bytes: uno para la entrada %p y otro para la salida %out .

Sin embargo, a menudo es deseable realizar la actualización en el lugar (por ejemplo, si en el frontend que genera la expresión la variable de entrada ya no está viva después del cálculo, como en el incremento p++ ).

Para realizar dicha actualización de manera eficiente, puede especificar el alias de entrada:

 HloModule increment, input_output_alias={ {}: 0 }

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

El formato especifica que toda la salida (marcada con {} ) tiene un alias para el parámetro de entrada 0 .

Consulte la API XlaBuilder::SetUpAlias para especificar el alias mediante programación.

Definición de alias en tiempo de ejecución

El alias definido en el paso anterior se especifica durante la compilación . Durante la ejecución, puede elegir si donar realmente el búfer utilizando LocalClient::RunAsync API.

Las memorias intermedias de entrada para el programa se envuelven en ExecutionInput , que a su vez contiene un árbol de MaybeOwningDeviceMemory . Si la memoria se especifica como propietaria (la propiedad del búfer se pasa al tiempo de ejecución XLA), el búfer se dona realmente y la actualización se ejecuta in situ, según lo solicitado por la API de alias de tiempo de compilación.

Sin embargo, si el búfer con alias en el momento de la compilación no se dona en tiempo de ejecución, la protección contra copia se activa: se asigna un búfer de salida adicional O , y el contenido del búfer de entrada P que estaba destinado a ser alias se copia en O (de manera tan efectiva, el programa puede ejecutarse como si el búfer O fuera donado en tiempo de ejecución).

Interoperabilidad frontend

TF / XLA

En los clústeres del programa TensorFlow compilado con XLA, todas las actualizaciones de variables de recursos tienen un alias en el momento de la compilación (el alias en tiempo de ejecución depende de si algo más tiene una referencia al tensor de la variable de recursos).