Vorgangssemantik

Im Folgenden wird die Semantik der im XlaBuilder-Interface definierten Vorgänge beschrieben. In der Regel werden diese Vorgänge eins zu eins den Vorgängen zugeordnet, die in der RPC-Schnittstelle in xla_data.proto definiert sind.

Hinweis zur Nomenklatur: Der verallgemeinerte Datentyp, mit dem XLA arbeitet, ist ein N-dimensionales Array, das Elemente eines einheitlichen Typs (z. B. 32-Bit-Gleitkommazahl) enthält. In der gesamten Dokumentation wird array verwendet, um ein beliebiges mehrdimensionales Array zu bezeichnen. Sonderfälle haben zur besseren Übersicht spezifischere und vertrautere Namen. Ein Vektor ist beispielsweise ein eindimensionales Array und eine Matrix ein zweidimensionales Array.

Weitere Informationen zur Struktur eines Vorgangs finden Sie unter Formen und Layout und Gekacheltes Layout.

Bauchmuskeln

Siehe auch XlaBuilder::Abs.

Elementweiser Absolutwert x -> |x|.

Abs(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – abs.

Hinzufügen

Siehe auch XlaBuilder::Add.

Führt eine elementweise Addition von lhs und rhs durch.

Add(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für „Add“ gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Add(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Informationen zu StableHLO finden Sie unter StableHLO – add.

AddDependency

Siehe auch HloInstruction::AddDependency.

AddDependency kann in HLO-Dumps enthalten sein, sollte aber nicht manuell von Endnutzern erstellt werden.

AfterAll

Siehe auch XlaBuilder::AfterAll.

„AfterAll“ akzeptiert eine variable Anzahl von Tokens und gibt ein einzelnes Token aus. Tokens sind primitive Typen, die zwischen Operationen mit Nebeneffekten übergeben werden können, um die Reihenfolge zu erzwingen. AfterAll kann als Join von Tokens verwendet werden, um einen Vorgang nach einer Reihe von Vorgängen zu sortieren.

AfterAll(tokens)

Argumente Typ Semantik
tokens Vektor von XlaOp variadische Anzahl von Tokens

Weitere Informationen zu StableHLO finden Sie unter StableHLO – after_all.

AllGather

Siehe auch XlaBuilder::AllGather.

Führt die Verkettung über Replikate hinweg aus.

AllGather(operand, all_gather_dimension, shard_count, replica_groups, channel_id, layout, use_global_device_ids)

Argumente Typ Semantik
operand XlaOp Array, das über Replikate hinweg verkettet werden soll
all_gather_dimension int64 Verkettungsdimension
shard_count int64 Die Größe jeder Replikagruppe
replica_groups Vektor von Vektoren von int64 Gruppen, zwischen denen die Verkettung erfolgt
channel_id optional ChannelHandle Optionale Kanal-ID für die modulübergreifende Kommunikation
layout optional Layout Erstellt ein Layoutmuster, das das übereinstimmende Layout im Argument erfasst.
use_global_device_ids optional bool Gibt „true“ zurück, wenn die IDs in der ReplicaGroup-Konfiguration eine globale ID darstellen.
  • replica_groups ist eine Liste von Replikagruppen, zwischen denen die Verkettung erfolgt. Die Replika-ID für die aktuelle Replika kann mit ReplicaId abgerufen werden. Die Reihenfolge der Replikas in jeder Gruppe bestimmt die Reihenfolge, in der sich ihre Eingaben im Ergebnis befinden. replica_groups muss entweder leer sein (in diesem Fall gehören alle Replikate zu einer einzelnen Gruppe, die von 0 bis N - 1 sortiert ist) oder dieselbe Anzahl von Elementen wie die Anzahl der Replikate enthalten. Beispiel: replica_groups = {0, 2}, {1, 3} führt die Verkettung zwischen den Replikaten 0 und 2 sowie 1 und 3 durch.
  • shard_count ist die Größe jeder Replikagruppe. Wir benötigen diese Informationen, wenn replica_groups leer ist.
  • channel_id wird für die modulübergreifende Kommunikation verwendet: Nur all-gather-Vorgänge mit demselben channel_id können miteinander kommunizieren.
  • use_global_device_ids Gibt „true“ zurück, wenn die IDs in der ReplicaGroup-Konfiguration eine globale ID von (replica_id * partition_count + partition_id) anstelle einer Replikat-ID darstellen. Dies ermöglicht eine flexiblere Gruppierung von Geräten, wenn diese All-Reduce-Operation sowohl partitionen- als auch replikübergreifend ist.

Die Ausgabedimension ist die Eingabedimension, wobei all_gather_dimension shard_count-mal größer ist. Wenn es beispielsweise zwei Replikate gibt und der Operand auf den beiden Replikaten die Werte [1.0, 2.5] bzw. [3.0, 5.25] hat, ist der Ausgabewert dieses Vorgangs, bei dem all_gather_dim gleich 0 ist, auf beiden Replikaten [1.0, 2.5, 3.0,5.25].

Die API von AllGather wird intern in zwei HLO-Anweisungen (AllGatherStart und AllGatherDone) zerlegt.

Siehe auch HloInstruction::CreateAllGatherStart.

AllGatherStart und AllGatherDone dienen als Primitiven in HLO. Diese Vorgänge können in HLO-Dumps enthalten sein, sie sind jedoch nicht dafür vorgesehen, von Endnutzern manuell erstellt zu werden.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – all_gather.

AllReduce

Siehe auch XlaBuilder::AllReduce.

Führt eine benutzerdefinierte Berechnung über Replikate hinweg aus.

AllReduce(operand, computation, replica_groups, channel_id, shape_with_layout, use_global_device_ids)

Argumente Typ Semantik
operand XlaOp Array oder nicht leeres Tupel von Arrays, die über Replikate hinweg reduziert werden sollen
computation XlaComputation Berechnung der Reduzierung
replica_groups ReplicaGroup vector Gruppen, zwischen denen die Reduzierungen vorgenommen werden
channel_id optional ChannelHandle Optionale Kanal-ID für die modulübergreifende Kommunikation
shape_with_layout optional Shape Definiert das Layout der übertragenen Daten.
use_global_device_ids optional bool Gibt „true“ zurück, wenn die IDs in der ReplicaGroup-Konfiguration eine globale ID darstellen.
  • Wenn operand ein Tupel von Arrays ist, wird die All-Reduce-Operation für jedes Element des Tupels ausgeführt.
  • replica_groups ist eine Liste von Replikatgruppen, zwischen denen die Reduzierung erfolgt. Die Replikat-ID für das aktuelle Replikat kann mit ReplicaId abgerufen werden. replica_groups muss entweder leer sein (in diesem Fall gehören alle Replikate zu einer einzelnen Gruppe) oder dieselbe Anzahl von Elementen wie die Anzahl der Replikate enthalten. Beispiel: replica_groups = {0, 2}, {1, 3} führt eine Reduzierung zwischen den Replikaten 0 und 2 sowie 1 und 3 durch.
  • channel_id wird für die modulübergreifende Kommunikation verwendet: Nur all-reduce-Vorgänge mit demselben channel_id können miteinander kommunizieren.
  • shape_with_layout: Erzwingt das Layout von AllReduce auf das angegebene Layout. Damit wird das gleiche Layout für eine Gruppe von AllReduce-Vorgängen garantiert, die separat kompiliert werden.
  • use_global_device_ids Gibt „true“ zurück, wenn die IDs in der ReplicaGroup-Konfiguration eine globale ID von (replica_id * partition_count + partition_id) anstelle einer Replikat-ID darstellen. Dies ermöglicht eine flexiblere Gruppierung von Geräten, wenn diese All-Reduce-Operation sowohl partitionen- als auch replikübergreifend ist.

Die Ausgabeform entspricht der Eingabeform. Wenn es beispielsweise zwei Replikate gibt und der Operand auf den beiden Replikaten die Werte [1.0, 2.5] bzw. [3.0, 5.25] hat, ist der Ausgabewert dieses Vorgangs und der Summenberechnung auf beiden Replikaten [4.0, 7.75]. Wenn die Eingabe ein Tupel ist, ist auch die Ausgabe ein Tupel.

Um das Ergebnis von AllReduce zu berechnen, ist eine Eingabe von jedem Replikat erforderlich. Wenn ein Replikat einen AllReduce-Knoten häufiger als ein anderes ausführt, wartet das erste Replikat unbegrenzt. Da auf allen Replikaten dasselbe Programm ausgeführt wird, gibt es nicht viele Möglichkeiten, wie das passieren kann. Es ist jedoch möglich, wenn die Bedingung einer While-Schleife von Daten aus infeed abhängt und die Daten, die infeed sind, dazu führen, dass die While-Schleife auf einem Replikat häufiger durchlaufen wird als auf einem anderen.

Die API von AllReduce wird intern in zwei HLO-Anweisungen (AllReduceStart und AllReduceDone) zerlegt.

Siehe auch HloInstruction::CreateAllReduceStart.

AllReduceStart und AllReduceDone dienen als Primitiven in HLO. Diese Vorgänge können in HLO-Dumps enthalten sein, sie sind jedoch nicht dafür vorgesehen, von Endnutzern manuell erstellt zu werden.

CrossReplicaSum

Siehe auch XlaBuilder::CrossReplicaSum.

Führt AllReduce mit einer Summenberechnung aus.

CrossReplicaSum(operand, replica_groups)

Argumente Typ Semantik
operand XlaOp Array oder nicht leeres Tupel von Arrays, die über Replikate hinweg reduziert werden sollen
replica_groups Vektor von Vektoren von int64 Gruppen, zwischen denen die Reduzierungen vorgenommen werden

Gibt die Summe des Operandenwerts in jeder Untergruppe von Replikaten zurück. Alle Replikate liefern einen Beitrag zur Summe und alle Replikate erhalten die resultierende Summe für jede Untergruppe.

AllToAll

Siehe auch XlaBuilder::AllToAll.

„AllToAll“ ist ein kollektiver Vorgang, bei dem Daten von allen Kernen an alle Kerne gesendet werden. Sie umfasst zwei Phasen:

  1. Die Streuungsphase. Auf jedem Kern wird der Operand in split_count Blöcke entlang der split_dimensions aufgeteilt und die Blöcke werden auf alle Kerne verteilt. Der i-te Block wird beispielsweise an den i-ten Kern gesendet.
  2. Die Erfassungsphase. Jeder Kern verkettet die empfangenen Blöcke entlang der concat_dimension.

Die teilnehmenden Kerne können so konfiguriert werden:

  • replica_groups: Jede ReplicaGroup enthält eine Liste von Replikat-IDs, die an der Berechnung beteiligt sind. Die Replikat-ID für das aktuelle Replikat kann mit ReplicaId abgerufen werden. „AllToAll“ wird in der angegebenen Reihenfolge auf Untergruppen angewendet. replica_groups = { {1,2,3}, {4,5,0} } bedeutet beispielsweise, dass ein AllToAll innerhalb von Replikaten {1, 2, 3} und in der Sammelphase angewendet wird und die empfangenen Blöcke in derselben Reihenfolge (1, 2, 3) verkettet werden. Anschließend wird ein weiteres AllToAll auf die Replikate 4, 5 und 0 angewendet. Die Verkettungsreihenfolge ist ebenfalls 4, 5, 0. Wenn replica_groups leer ist, gehören alle Replikate zu einer Gruppe, in der Verkettungsreihenfolge ihres Erscheinens.

Voraussetzungen:

  • Die Dimensionsgröße des Operanden auf der split_dimension ist durch split_count teilbar.
  • Die Form des Operanden ist kein Tupel.

AllToAll(operand, split_dimension, concat_dimension, split_count, replica_groups, layout, channel_id)

Argumente Typ Semantik
operand XlaOp n-dimensionales Eingabearray
split_dimension int64 Ein Wert im Intervall [0,n), der die Dimension angibt, entlang der der Operand aufgeteilt wird.
concat_dimension int64 Ein Wert im Intervall [0,n), der die Dimension angibt, entlang der die geteilten Blöcke verkettet werden.
split_count int64 Die Anzahl der Kerne, die an diesem Vorgang beteiligt sind. Wenn replica_groups leer ist, sollte dies die Anzahl der Replikate sein. Andernfalls sollte dies der Anzahl der Replikate in jeder Gruppe entsprechen.
replica_groups ReplicaGroupvector Jede Gruppe enthält eine Liste von Replikat-IDs.
layout optional Layout Vom Nutzer angegebenes Speicherlayout
channel_id optional ChannelHandle Eindeutige Kennung für jedes Sende-/Empfangspaar

Weitere Informationen zu Formen und Layouts finden Sie unter xla::shapes.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – all_to_all.

AllToAll – Beispiel 1

XlaBuilder b("alltoall");
auto x = Parameter(&b, 0, ShapeUtil::MakeShape(F32, {4, 16}), "x");
AllToAll(
    x,
    /*split_dimension=*/ 1,
    /*concat_dimension=*/ 0,
    /*split_count=*/ 4);

Im obigen Beispiel sind 4 Cores am Alltoall beteiligt. Auf jedem Kern wird der Operand entlang der Dimension 1 in vier Teile aufgeteilt, sodass jeder Teil die Form f32[4,4] hat. Die vier Teile sind auf alle Kerne verteilt. Anschließend werden die empfangenen Teile von jedem Kern entlang der Dimension 0 in der Reihenfolge der Kerne 0 bis 4 verkettet. Die Ausgabe auf jedem Kern hat also die Form f32[16,4].

AllToAll – Beispiel 2 – StableHLO

Beispiel für einen AllToAll-Dataflow für StableHLO

Im obigen Beispiel sind zwei Replikate am AllToAll-Vorgang beteiligt. Auf jeder Replik hat der Operand die Form f32[2,4]. Der Operand wird entlang der Dimension 1 in zwei Teile aufgeteilt. Jeder Teil hat also die Form f32[2,2]. Die beiden Teile werden dann entsprechend ihrer Position in der Replikatgruppe zwischen den Replikaten ausgetauscht. Jede Replik sammelt den entsprechenden Teil aus beiden Operanden und verkettet sie entlang der Dimension 0. Die Ausgabe auf jedem Replikat hat daher die Form f32[4,2].

RaggedAllToAll

Siehe auch XlaBuilder::RaggedAllToAll.

RaggedAllToAll führt einen kollektiven All-to-All-Vorgang aus, bei dem Ein- und Ausgabe unregelmäßige Tensoren sind.

RaggedAllToAll(input, input_offsets, send_sizes, output, output_offsets, recv_sizes, replica_groups, channel_id)

Argumente Typ Semantik
input XlaOp N-Array vom Typ T
input_offsets XlaOp N-Array vom Typ T
send_sizes XlaOp N-Array vom Typ T
output XlaOp N-Array vom Typ T
output_offsets XlaOp N-Array vom Typ T
recv_sizes XlaOp N-Array vom Typ T
replica_groups ReplicaGroup vector Jede Gruppe enthält eine Liste von Replikat-IDs.
channel_id optional ChannelHandle Eindeutige Kennung für jedes Sende-/Empfangspaar

Ragged Tensors werden durch drei Tensoren definiert:

  • data: Der data-Tensor ist entlang seiner äußersten Dimension „ragged“, d. h., jedes indexierte Element hat eine variable Größe.
  • offsets: Der Tensor offsets indexiert die äußerste Dimension des Tensors data und stellt den Start-Offset jedes unregelmäßigen Elements des Tensors data dar.
  • sizes: Der sizes-Tensor stellt die Größe jedes unregelmäßigen Elements des data-Tensors dar. Die Größe wird in Einheiten von Unterelementen angegeben. Ein untergeordnetes Element wird als Suffix der „data“-Tensorform definiert, das durch Entfernen der äußersten „ragged“-Dimension erhalten wird.
  • Die Tensoren offsets und sizes müssen dieselbe Größe haben.

Beispiel für einen unregelmäßigen Tensor:

data: [8,3] =
{ {a,b,c},{d,e,f},{g,h,i},{j,k,l},{m,n,o},{p,q,r},{s,t,u},{v,w,x} }

offsets: [3] = {0, 1, 4}

sizes: [3] = {1, 3, 4}

// Index 'data' at 'offsets'[0], 'sizes'[0]' // {a,b,c}

// Index 'data' at 'offsets'[1], 'sizes'[1]' // {d,e,f},{g,h,i},{j,k,l}

// Index 'data' at 'offsets'[2], 'sizes'[2]' // {m,n,o},{p,q,r},{s,t,u},{v,w,x}

output_offsets muss so aufgeteilt werden, dass jedes Replikat Offsets aus der Perspektive der Zielreplikatausgabe hat.

Für den i-ten Ausgabesatz sendet das aktuelle Replikat die input[input_offsets[i]:input_offsets[i]+input_sizes[i]]-Aktualisierung an das i-te Replikat, das in output_i[output_offsets[i]:output_offsets[i]+send_sizes[i]] im i-ten Replikat output geschrieben wird.

Wenn wir beispielsweise zwei Replikate haben:

replica 0:
input: [1, 2, 2]
output:[0, 0, 0, 0]
input_offsets: [0, 1]
send_sizes: [1, 2]
output_offsets: [0, 0]
recv_sizes: [1, 1]

replica 1:
input: [3, 4, 0]
output: [0, 0, 0, 0]
input_offsets: [0, 1]
send_sizes: [1, 1]
output_offsets: [1, 2]
recv_sizes: [2, 1]

// replica 0's result will be: [1, 3, 0, 0]
// replica 1's result will be: [2, 2, 4, 0]

Das unregelmäßige All-to-All-HLO hat die folgenden Argumente:

  • input: Ragged-Eingabedatentensor.
  • output: Ragged-Ausgabedatentensor.
  • input_offsets: Ragged-Eingabe-Offsets-Tensor.
  • send_sizes: Tensor mit unregelmäßigen Sendegrößen.
  • output_offsets: Array mit unregelmäßigen Offsets in der Ausgabe des Zielreplikats.
  • recv_sizes: Ragged-Tensor für die Empfangsgrößen.

Die Tensoren *_offsets und *_sizes müssen alle dieselbe Form haben.

Für die Tensoren *_offsets und *_sizes werden zwei Formen unterstützt:

  • [num_devices]. Bei „Ragged-All-to-All“ kann maximal ein Update an jedes Remote-Gerät in der Replikatgruppe gesendet werden. Beispiel:
for (remote_device_id : replica_group) {
     SEND input[input_offsets[remote_device_id]],
     output[output_offsets[remote_device_id]],
     send_sizes[remote_device_id] }
  • Bei [num_devices, num_updates], wo „ragged-all-to-all“ bis zu num_updates Updates an dasselbe Remote-Gerät sendet (jeweils mit unterschiedlichen Offsets), für jedes Remote-Gerät in der Replikagruppe.

Beispiel:

for (remote_device_id : replica_group) {
    for (update_idx : num_updates) {
        SEND input[input_offsets[remote_device_id][update_idx]],
        output[output_offsets[remote_device_id][update_idx]]],
        send_sizes[remote_device_id][update_idx] } }

Und

Siehe auch XlaBuilder::And.

Führt ein elementweises UND von zwei Tensoren lhs und rhs aus.

And(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für „And“ gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

And(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Informationen zu StableHLO finden Sie unter StableHLO.

Asynchron

Siehe auch HloInstruction::CreateAsyncStart, HloInstruction::CreateAsyncUpdate, HloInstruction::CreateAsyncDone.

AsyncDone, AsyncStart und AsyncUpdate sind interne HLO-Anweisungen, die für asynchrone Vorgänge verwendet werden und als Primitiven in HLO dienen. Diese Vorgänge können in HLO-Dumps enthalten sein, sie sind jedoch nicht dafür vorgesehen, von Endnutzern manuell erstellt zu werden.

Atan2

Siehe auch XlaBuilder::Atan2.

Führt eine elementweise atan2-Operation für lhs und rhs aus.

Atan2(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Atan2 gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Atan2(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – atan2.

BatchNormGrad

Eine detaillierte Beschreibung des Algorithmus finden Sie auch unter XlaBuilder::BatchNormGrad und im ursprünglichen Batch-Normalisierungs-Paper.

Berechnet die Gradienten der Batch-Normalisierung.

BatchNormGrad(operand, scale, batch_mean, batch_var, grad_output, epsilon, feature_index)

Argumente Typ Semantik
operand XlaOp n-dimensionales Array, das normalisiert werden soll (x)
scale XlaOp Eindimensionales Array (\(\gamma\))
batch_mean XlaOp Eindimensionales Array (\(\mu\))
batch_var XlaOp Eindimensionales Array (\(\sigma^2\))
grad_output XlaOp An BatchNormTraining (\(\nabla y\)) übergebene Farbverläufe
epsilon float Epsilon-Wert (\(\epsilon\))
feature_index int64 Index für die Featuredimension in operand

Für jedes Feature in der Feature-Dimension (feature_index ist der Index für die Feature-Dimension in operand) werden die Gradienten in Bezug auf operand, offset und scale über alle anderen Dimensionen hinweg berechnet. feature_index muss ein gültiger Index für die Feature-Dimension in operand sein.

Die drei Gradienten werden durch die folgenden Formeln definiert (unter der Annahme eines 4‑dimensionalen Arrays als operand und mit dem Index der Feature-Dimension l, der Batchgröße m und den räumlichen Größen w und h):

\[ \begin{split} c_l&= \frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \left( \nabla y_{ijkl} \frac{x_{ijkl} - \mu_l}{\sigma^2_l+\epsilon} \right) \\\\ d_l&= \frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \nabla y_{ijkl} \\\\ \nabla x_{ijkl} &= \frac{\gamma_{l} }{\sqrt{\sigma^2_{l}+\epsilon} } \left( \nabla y_{ijkl} - d_l - c_l (x_{ijkl} - \mu_{l}) \right) \\\\ \nabla \gamma_l &= \sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \left( \nabla y_{ijkl} \frac{x_{ijkl} - \mu_l}{\sqrt{\sigma^2_{l}+\epsilon} } \right) \\\\\ \nabla \beta_l &= \sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \nabla y_{ijkl} \end{split} \]

Die Eingaben batch_mean und batch_var stellen Momentwerte für Batch- und räumliche Dimensionen dar.

Der Ausgabetyp ist ein Tupel aus drei Handles:

Ausgaben Typ Semantik
grad_operand XlaOp Gradient in Bezug auf die Eingabe operand (\(\nabla x\))
grad_scale XlaOp Gradient in Bezug auf die Eingabe **scale ** (\(\nabla\gamma\))
grad_offset XlaOp Gradient in Bezug auf die Eingabe offset(\(\nabla\beta\))

Weitere Informationen zu StableHLO finden Sie unter StableHLO – batch_norm_grad.

BatchNormInference

Eine detaillierte Beschreibung des Algorithmus finden Sie auch unter XlaBuilder::BatchNormInference und im ursprünglichen Batch-Normalisierungs-Paper.

Normalisiert ein Array über Batch- und räumliche Dimensionen hinweg.

BatchNormInference(operand, scale, offset, mean, variance, epsilon, feature_index)

Argumente Typ Semantik
operand XlaOp n-dimensionales Array, das normalisiert werden soll
scale XlaOp 1‑dimensionales Array
offset XlaOp 1‑dimensionales Array
mean XlaOp 1‑dimensionales Array
variance XlaOp 1‑dimensionales Array
epsilon float Epsilon-Wert
feature_index int64 Index für die Featuredimension in operand

Für jedes Element in der Feature-Dimension (feature_index ist der Index für die Feature-Dimension in operand) werden der Mittelwert und die Varianz über alle anderen Dimensionen hinweg berechnet. Anschließend werden der Mittelwert und die Varianz verwendet, um jedes Element in operand zu normalisieren. Die feature_index muss ein gültiger Index für die Feature-Dimension in operand sein.

BatchNormInference entspricht dem Aufruf von BatchNormTraining, ohne mean und variance für jeden Batch zu berechnen. Stattdessen werden die Eingaben mean und variance als geschätzte Werte verwendet. Ziel dieses Vorgangs ist es, die Latenz bei der Inferenz zu verringern. Daher der Name BatchNormInference.

Die Ausgabe ist ein n-dimensionales, normalisiertes Array mit derselben Form wie die Eingabe operand.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – batch_norm_inference.

BatchNormTraining

Eine detaillierte Beschreibung des Algorithmus finden Sie auch unter XlaBuilder::BatchNormTraining und the original batch normalization paper.

Normalisiert ein Array über Batch- und räumliche Dimensionen hinweg.

BatchNormTraining(operand, scale, offset, epsilon, feature_index)

Argumente Typ Semantik
operand XlaOp n-dimensionales Array, das normalisiert werden soll (x)
scale XlaOp Eindimensionales Array (\(\gamma\))
offset XlaOp Eindimensionales Array (\(\beta\))
epsilon float Epsilon-Wert (\(\epsilon\))
feature_index int64 Index für die Featuredimension in operand

Für jedes Element in der Feature-Dimension (feature_index ist der Index für die Feature-Dimension in operand) werden der Mittelwert und die Varianz über alle anderen Dimensionen hinweg berechnet. Anschließend werden der Mittelwert und die Varianz verwendet, um jedes Element in operand zu normalisieren. Die feature_index muss ein gültiger Index für die Feature-Dimension in operand sein.

Der Algorithmus funktioniert für jeden Batch in operand \(x\) , der m Elemente mit w und h als Größe der räumlichen Dimensionen enthält, so (vorausgesetzt, operand ist ein vierdimensionales Array):

  • Berechnet den Batchmittelwert \(\mu_l\) für jedes Feature l in der Feature-Dimension: \(\mu_l=\frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h x_{ijkl}\)

  • Berechnet die Batch-Varianz \(\sigma^2_l\): $\sigma^2l=\frac{1}{mwh}\sum{i=1}^m\sum{j=1}^w\sum{k=1}^h (x_{ijkl} - \mu_l)^2$

  • Normalisiert, skaliert und verschiebt: \(y_{ijkl}=\frac{\gamma_l(x_{ijkl}-\mu_l)}{\sqrt[2]{\sigma^2_l+\epsilon} }+\beta_l\)

Der Epsilon-Wert, in der Regel eine kleine Zahl, wird hinzugefügt, um Division durch null zu vermeiden.

Der Ausgabetyp ist ein Tupel aus drei XlaOp:

Ausgaben Typ Semantik
output XlaOp n-dimensionales Array mit derselben Form wie die Eingabe operand (y)
batch_mean XlaOp Eindimensionales Array (\(\mu\))
batch_var XlaOp Eindimensionales Array (\(\sigma^2\))

batch_mean und batch_var sind Momente, die mithilfe der oben genannten Formeln für die Batch- und räumlichen Dimensionen berechnet werden.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – batch_norm_training.

Bitcast

Siehe auch HloInstruction::CreateBitcast.

Bitcast kann in HLO-Dumps enthalten sein, sollte aber nicht manuell von Endnutzern erstellt werden.

BitcastConvertType

Siehe auch XlaBuilder::BitcastConvertType.

Ähnlich wie tf.bitcast in TensorFlow wird eine elementweise Bitcast-Operation von einer Datenform in eine Zielform ausgeführt. Die Eingabe- und Ausgabegröße müssen übereinstimmen: z.B. werden s32-Elemente über die Bitcast-Routine zu f32-Elementen und ein s32-Element wird zu vier s8-Elementen. Bitcast wird als Low-Level-Cast implementiert. Daher liefern Maschinen mit unterschiedlichen Gleitkommadarstellungen unterschiedliche Ergebnisse.

BitcastConvertType(operand, new_element_type)

Argumente Typ Semantik
operand XlaOp Array vom Typ T mit Dimensionen D
new_element_type PrimitiveType Typ U

Die Dimensionen des Operanden und der Zielform müssen übereinstimmen, mit Ausnahme der letzten Dimension, die sich durch das Verhältnis der Primitivgröße vor und nach der Konvertierung ändert.

Die Quell- und Zielelementtypen dürfen keine Tupel sein.

Informationen zu StableHLO finden Sie unter StableHLO – bitcast_convert.

Bitcast-Konvertierung in einen primitiven Typ mit anderer Breite

Die BitcastConvert-HLO-Anweisung unterstützt den Fall, in dem die Größe des Ausgabeelementtyps T' nicht der Größe des Eingabeelements T entspricht. Da der gesamte Vorgang konzeptionell ein Bitcast ist und die zugrunde liegenden Bytes nicht geändert werden, muss sich die Form des Ausgabeelements ändern. Für B = sizeof(T), B' = sizeof(T') gibt es zwei mögliche Fälle.

Erstens: Wenn B > B', erhält die Ausgabedimension eine neue untergeordnete Dimension der Größe B/B'. Beispiel:

  f16[10,2]{1,0} %output = f16[10,2]{1,0} bitcast-convert(f32[10]{0} %input)

Die Regel für effektive Skalare bleibt unverändert:

  f16[2]{0} %output = f16[2]{0} bitcast-convert(f32[] %input)

Alternativ erfordert die Anleitung für B' > B, dass die letzte logische Dimension der Eingabeform gleich B'/B ist. Diese Dimension wird bei der Konvertierung entfernt:

  f32[10]{0} %output = f32[10]{0} bitcast-convert(f16[10,2]{1,0} %input)

Beachten Sie, dass Konvertierungen zwischen verschiedenen Bitbreiten nicht elementweise erfolgen.

Nachricht an alle

Siehe auch XlaBuilder::Broadcast.

Fügt einem Array Dimensionen hinzu, indem die Daten im Array dupliziert werden.

Broadcast(operand, broadcast_sizes)

Argumente Typ Semantik
operand XlaOp Das zu duplizierende Array
broadcast_sizes ArraySlice<int64> Die Größen der neuen Dimensionen

Die neuen Dimensionen werden links eingefügt. Wenn broadcast_sizes die Werte {a0, ..., aN} hat und die Operandenform die Dimensionen {b0, ..., bM} hat, hat die Form der Ausgabe die Dimensionen {a0, ..., aN, b0, ..., bM}.

Die neuen Dimensionen werden in Kopien des Operanden indexiert, d.h.

output[i0, ..., iN, j0, ..., jM] = operand[j0, ..., jM]

Wenn operand beispielsweise ein Skalar f32 mit dem Wert 2.0f ist und broadcast_sizes {2, 3} ist, ist das Ergebnis ein Array mit der Form f32[2, 3] und alle Werte im Ergebnis sind 2.0f.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – broadcast.

BroadcastInDim

Siehe auch XlaBuilder::BroadcastInDim.

Erhöht die Größe und Anzahl der Dimensionen eines Arrays, indem die Daten im Array dupliziert werden.

BroadcastInDim(operand, out_dim_size, broadcast_dimensions)

Argumente Typ Semantik
operand XlaOp Das zu duplizierende Array
out_dim_size ArraySlice<int64> Die Größen der Dimensionen der Zielform
broadcast_dimensions ArraySlice<int64> Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Ähnlich wie bei Broadcast, aber es können Dimensionen an beliebiger Stelle hinzugefügt und vorhandene Dimensionen mit der Größe 1 erweitert werden.

Die operand wird auf die durch out_dim_size beschriebene Form übertragen. broadcast_dimensions ordnet die Dimensionen von operand den Dimensionen der Zielform zu. Die i-te Dimension des Operanden wird also der broadcast_dimension[i]-ten Dimension der Ausgabeform zugeordnet. Die Dimensionen von operand müssen die Größe 1 haben oder dieselbe Größe wie die Dimension in der Ausgabedimension haben, auf die sie abgebildet werden. Die verbleibenden Dimensionen werden mit Dimensionen der Größe 1 gefüllt. Beim Broadcasting mit degenerierten Dimensionen wird dann entlang dieser degenerierten Dimensionen gesendet, um die Ausgabedimension zu erreichen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Anruf

Siehe auch XlaBuilder::Call.

Ruft eine Berechnung mit den angegebenen Argumenten auf.

Call(computation, operands...)

Argumente Typ Semantik
computation XlaComputation Berechnung vom Typ T_0, T_1, ..., T_{N-1} -> S mit N Parametern beliebigen Typs
operands Folge von N XlaOps N Argumente beliebigen Typs

Die Stelligkeit und die Typen von operands müssen mit den Parametern von computation übereinstimmen. Es ist zulässig, kein operands zu haben.

CompositeCall

Siehe auch XlaBuilder::CompositeCall.

Kapselt einen Vorgang, der aus anderen StableHLO-Vorgängen besteht (zusammengesetzt), Eingaben und composite_attributes entgegennimmt und Ergebnisse erzeugt. Die Semantik des Vorgangs wird durch das Attribut „decomposition“ implementiert. Der zusammengesetzte Vorgang kann durch seine Zerlegung ersetzt werden, ohne die Programmsemantik zu ändern. Wenn durch das Inlining der Zerlegung nicht dieselbe Semantik für den Vorgang erzielt wird, sollten Sie „custom_call“ verwenden.

Das Feld „Version“ (Standardwert: 0) wird verwendet, um anzugeben, wann sich die Semantik eines Composites ändert.

Dieser Vorgang wird als kCall mit dem Attribut is_composite=true implementiert. Das Feld decomposition wird durch das Attribut computation angegeben. In den Frontend-Attributen werden die verbleibenden Attribute mit dem Präfix composite. gespeichert.

Beispiel für den Vorgang „CompositeCall“:

f32[] call(f32[] %cst), to_apply=%computation, is_composite=true,
frontend_attributes = {
  composite.name="foo.bar",
  composite.attributes={n = 1 : i32, tensor = dense<1> : tensor<i32>},
  composite.version="1"
}

CompositeCall(computation, operands..., name, attributes, version)

Argumente Typ Semantik
computation XlaComputation Berechnung vom Typ T_0, T_1, ..., T_{N-1} -> S mit N Parametern beliebigen Typs
operands Folge von N XlaOps variable Anzahl von Werten
name string Name des Composites
attributes optional string optionales in einen String umgewandeltes Attribut-Dictionary
version optional int64 Nummer für Versionsupdates für die Semantik des zusammengesetzten Vorgangs

Die decomposition eines Vorgangs ist kein Feld, sondern wird als „to_apply“-Attribut angezeigt, das auf die Funktion verweist, die die Implementierung auf niedrigerer Ebene enthält, d. h. to_apply=%funcname.

Weitere Informationen zu Composite und Decomposition finden Sie in der StableHLO-Spezifikation.

Cbrt

Siehe auch XlaBuilder::Cbrt.

Elementweise Kubikwurzeloperation x -> cbrt(x).

Cbrt(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Cbrt unterstützt auch das optionale Argument result_accuracy:

Cbrt(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Informationen zu StableHLO finden Sie unter StableHLO – cbrt.

Aufrunden

Siehe auch XlaBuilder::Ceil.

Elementweise Obergrenze x -> ⌈x⌉.

Ceil(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – ceil.

Cholesky

Siehe auch XlaBuilder::Cholesky.

Berechnet die Cholesky-Zerlegung einer Reihe von symmetrischen (hermitischen) positiv definiten Matrizen.

Cholesky(a, lower)

Argumente Typ Semantik
a XlaOp Ein Array eines komplexen oder Gleitkommatyps mit mehr als zwei Dimensionen.
lower bool ob das obere oder untere Dreieck von a verwendet werden soll.

Wenn lower gleich true ist, werden die unteren Dreiecksmatrizen l so berechnet, dass $a = l . l^T$. Wenn lower gleich false ist, werden obere Dreiecksmatrizen u berechnet, sodass\(a = u^T . u\).

Eingabedaten werden nur aus dem unteren/oberen Dreieck von a gelesen, je nach Wert von lower. Werte aus dem anderen Dreieck werden ignoriert. Ausgabedaten werden im selben Dreieck zurückgegeben. Die Werte im anderen Dreieck sind implementierungsdefiniert und können beliebig sein.

Wenn a mehr als zwei Dimensionen hat, wird a als Batch von Matrizen behandelt, wobei alle Dimensionen außer den beiden untergeordneten Dimensionen Batchdimensionen sind.

Wenn a nicht symmetrisch (hermitesch) positiv definit ist, ist das Ergebnis implementierungsdefiniert.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – cholesky.

Einschränken

Siehe auch XlaBuilder::Clamp.

Begrenzt einen Operanden auf den Bereich zwischen einem Mindest- und einem Höchstwert.

Clamp(min, operand, max)

Argumente Typ Semantik
min XlaOp Array vom Typ T
operand XlaOp Array vom Typ T
max XlaOp Array vom Typ T

Gibt bei einem Operanden sowie einem Mindest- und einem Höchstwert den Operanden zurück, wenn er im Bereich zwischen dem Mindest- und dem Höchstwert liegt. Andernfalls wird der Mindestwert zurückgegeben, wenn der Operand unter diesem Bereich liegt, oder der Höchstwert, wenn der Operand über diesem Bereich liegt. Der Wert ist clamp(a, x, b) = min(max(a, x), b).

Alle drei Arrays müssen dieselbe Form haben. Alternativ können min und/oder max als eingeschränkte Form des Broadcasting ein Skalar vom Typ T sein.

Beispiel mit skalaren min und max:

let operand: s32[3] = {-1, 5, 9};
let min: s32 = 0;
let max: s32 = 6;
==>
Clamp(min, operand, max) = s32[3]{0, 5, 6};

Weitere Informationen zu StableHLO finden Sie unter StableHLO – clamp.

Minimieren

Siehe auch XlaBuilder::Collapse. und den Vorgang tf.reshape.

Reduziert die Dimensionen eines Arrays auf eine Dimension.

Collapse(operand, dimensions)

Argumente Typ Semantik
operand XlaOp Array vom Typ T
dimensions int64 vector in der richtigen Reihenfolge, aufeinanderfolgende Teilmenge der Dimensionen von T.

Mit „Collapse“ wird die angegebene Teilmenge der Dimensionen des Operanden durch eine einzelne Dimension ersetzt. Die Eingabeargumente sind ein beliebiges Array vom Typ T und ein Compile-Zeitkonstantenvektor mit Dimensionsindexen. Die Dimensionsindexe müssen eine fortlaufende Teilmenge der Dimensionen von T in aufsteigender Reihenfolge (niedrige bis hohe Dimensionsnummern) sein. {0, 1, 2}, {0, 1} oder {1, 2} sind also gültige Dimensionssets, {1, 0} oder {0, 2} jedoch nicht. Sie werden durch eine einzelne neue Dimension ersetzt, die sich an derselben Position in der Dimensionsfolge befindet wie die Dimensionen, die sie ersetzt. Die Größe der neuen Dimension entspricht dem Produkt der ursprünglichen Dimensionsgrößen. Die niedrigste Dimensionsnummer in dimensions ist die am langsamsten variierende Dimension (wichtigste) im Schleifennest, in dem diese Dimensionen zusammengefasst werden. Die höchste Dimensionsnummer ist die am schnellsten variierende (unwichtigste). Wenn eine allgemeinere Reihenfolge für das Minimieren erforderlich ist, sehen Sie sich den Operator tf.reshape an.

Sei v beispielsweise ein Array mit 24 Elementen:

let v = f32[4x2x3] { { {10, 11, 12}, {15, 16, 17} },
{ {20, 21, 22}, {25, 26, 27} },
{ {30, 31, 32}, {35, 36, 37} },
{ {40, 41, 42}, {45, 46, 47} } };

// Collapse to a single dimension, leaving one dimension.
let v012 = Collapse(v, {0,1,2});
then v012 == f32[24] {10, 11, 12, 15, 16, 17,
20, 21, 22, 25, 26, 27,
30, 31, 32, 35, 36, 37,
40, 41, 42, 45, 46, 47};

// Collapse the two lower dimensions, leaving two dimensions.
let v01 = Collapse(v, {0,1});
then v01 == f32[4x6] { {10, 11, 12, 15, 16, 17},
{20, 21, 22, 25, 26, 27},
{30, 31, 32, 35, 36, 37},
{40, 41, 42, 45, 46, 47} };

// Collapse the two higher dimensions, leaving two dimensions.
let v12 = Collapse(v, {1,2});
then v12 == f32[8x3] { {10, 11, 12},
{15, 16, 17},
{20, 21, 22},
{25, 26, 27},
{30, 31, 32},
{35, 36, 37},
{40, 41, 42},
{45, 46, 47} };

Clz

Siehe auch XlaBuilder::Clz.

Zählt elementweise die führenden Nullen.

Clz(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

CollectiveBroadcast

Siehe auch XlaBuilder::CollectiveBroadcast.

Sendet Daten an alle Replikate. Daten werden von der ersten Replikat-ID in jeder Gruppe an die anderen IDs in derselben Gruppe gesendet. Wenn sich eine Replikat-ID in keiner Replikatgruppe befindet, ist die Ausgabe für dieses Replikat ein Tensor, der aus Nullen in shape besteht.

CollectiveBroadcast(operand, replica_groups, channel_id)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
replica_groups ReplicaGroupvector Jede Gruppe enthält eine Liste mit Replikat-IDs.
channel_id optional ChannelHandle Eindeutige Kennung für jedes Sende-/Empfangspaar

Informationen zu StableHLO finden Sie unter StableHLO – collective_broadcast.

CollectivePermute

Siehe auch XlaBuilder::CollectivePermute.

CollectivePermute ist ein kollektiver Vorgang, bei dem Daten zwischen Replikaten gesendet und empfangen werden.

CollectivePermute(operand, source_target_pairs, channel_id, inplace)

Argumente Typ Semantik
operand XlaOp n-dimensionales Eingabearray
source_target_pairs <int64, int64> vector Eine Liste von Paaren (source_replica_id, target_replica_id). Für jedes Paar wird der Operand vom Quellreplikat an das Zielreplikat gesendet.
channel_id optional ChannelHandle Optionale Channel-ID für die modulübergreifende Kommunikation
inplace optional bool Flag, das angibt, ob die Permutation direkt erfolgen soll

Beachten Sie die folgenden Einschränkungen für source_target_pairs:

  • Zwei beliebige Paare dürfen nicht dieselbe Zielreplikat-ID und nicht dieselbe Quellreplikat-ID haben.
  • Wenn eine Replikat-ID in keinem Paar ein Ziel ist, ist die Ausgabe für dieses Replikat ein Tensor, der aus Nullen mit derselben Form wie die Eingabe besteht.

Die API des CollectivePermute-Vorgangs wird intern in zwei HLO-Anweisungen (CollectivePermuteStart und CollectivePermuteDone) zerlegt.

Siehe auch HloInstruction::CreateCollectivePermuteStart.

CollectivePermuteStart und CollectivePermuteDone dienen als Primitiven in HLO. Diese Vorgänge können in HLO-Dumps enthalten sein, sind aber nicht für die manuelle Erstellung durch Endnutzer vorgesehen.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – collective_permute.

Vergleichen

Siehe auch XlaBuilder::Compare.

Führt einen elementweisen Vergleich von lhs und rhs durch:

Eq

Siehe auch XlaBuilder::Eq.

Führt einen elementweisen Gleichheitsvergleich von lhs und rhs durch.

\(lhs = rhs\)

Eq(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Eq gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Eq(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Für Eq ist eine totale Ordnung über den Gleitkommazahlen vorhanden, indem Folgendes erzwungen wird:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

EqTotalOrder(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Informationen zu StableHLO finden Sie unter StableHLO – compare.

Ne

Siehe auch XlaBuilder::Ne.

Führt einen elementweisen Ungleich-Vergleich von lhs und rhs durch.

\(lhs != rhs\)

Ne(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Ne gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Ne(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Für Ne wird eine Gesamtordnung über den Gleitkommazahlen unterstützt, indem Folgendes erzwungen wird:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

NeTotalOrder(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Informationen zu StableHLO finden Sie unter StableHLO – compare.

Ge

Siehe auch XlaBuilder::Ge.

Führt einen elementweisen greater-or-equal-than von lhs und rhs durch.

\(lhs >= rhs\)

Ge(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Ge gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Ge(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Für Gt ist eine Totalordnung über den Gleitkommazahlen vorhanden, indem Folgendes erzwungen wird:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

GtTotalOrder(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Informationen zu StableHLO finden Sie unter StableHLO – compare.

Gt

Siehe auch XlaBuilder::Gt.

Führt einen elementweisen Größer-als-Vergleich von lhs und rhs durch.

\(lhs > rhs\)

Gt(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für „Gt“ gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Gt(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Informationen zu StableHLO finden Sie unter StableHLO – compare.

Le

Siehe auch XlaBuilder::Le.

Führt einen elementweisen less-or-equal-than von lhs und rhs durch.

\(lhs <= rhs\)

Le(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Le gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Le(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Für Le ist eine Gesamtordnung über den Gleitkommazahlen vorhanden, indem Folgendes erzwungen wird:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

LeTotalOrder(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Informationen zu StableHLO finden Sie unter StableHLO – compare.

Lt

Siehe auch XlaBuilder::Lt.

Führt einen elementweisen Vergleich „Kleiner als“ von lhs und rhs durch.

\(lhs < rhs\)

Lt(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für „Lt“ gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Lt(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Für „Lt“ ist eine Gesamtbestellung über den Gleitkommazahlen vorhanden, indem Folgendes erzwungen wird:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

LtTotalOrder(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Informationen zu StableHLO finden Sie unter StableHLO – compare.

Komplex

Siehe auch XlaBuilder::Complex.

Führt die elementweise Konvertierung in einen komplexen Wert aus einem Paar aus reellen und imaginären Werten, lhs und rhs, durch.

Complex(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für „Complex“ gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Complex(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Informationen zu StableHLO finden Sie unter StableHLO – complex.

ConcatInDim (Concatenate)

Siehe auch XlaBuilder::ConcatInDim.

Mit CONCATENATE wird ein Array aus mehreren Array-Operanden erstellt. Das Array hat dieselbe Anzahl von Dimensionen wie jeder der Eingabearray-Operanden (die dieselbe Anzahl von Dimensionen wie einander haben müssen) und enthält die Argumente in der Reihenfolge, in der sie angegeben wurden.

Concatenate(operands..., dimension)

Argumente Typ Semantik
operands Sequenz von N XlaOp N Arrays vom Typ T mit den Dimensionen [L0, L1, ...]. Erfordert N >= 1.
dimension int64 Ein Wert im Intervall [0, N), der die Dimension angibt, die zwischen den operands verkettet werden soll.

Mit Ausnahme von dimension müssen alle Dimensionen identisch sein. Das liegt daran, dass XLA keine unregelmäßigen Arrays unterstützt. Außerdem können 0-dimensionale Werte nicht verkettet werden, da die Dimension, entlang der die Verkettung erfolgt, nicht benannt werden kann.

1‑dimensionales Beispiel:

Concat({ {2, 3}, {4, 5}, {6, 7} }, 0)
//Output:  {2, 3, 4, 5, 6, 7}

2‑dimensionales Beispiel:

let a = { {1, 2},
         {3, 4},
         {5, 6} };

let b = { {7, 8} };

Concat({a, b}, 0)

//Output:  { {1, 2},
//          {3, 4},
//          {5, 6},
//          {7, 8} }

Diagramm:

Weitere Informationen zu StableHLO finden Sie unter StableHLO – concatenate.

Bedingt

Siehe auch XlaBuilder::Conditional.

Conditional(predicate, true_operand, true_computation, false_operand, false_computation)

Argumente Typ Semantik
predicate XlaOp Skalar vom Typ PRED
true_operand XlaOp Argument vom Typ \(T_0\)
true_computation XlaComputation XlaComputation vom Typ \(T_0 \to S\)
false_operand XlaOp Argument vom Typ \(T_1\)
false_computation XlaComputation XlaComputation vom Typ \(T_1 \to S\)

Führt true_computation aus, wenn predicate gleich true ist, false_computation, wenn predicate gleich false ist, und gibt das Ergebnis zurück.

Die true_computation muss ein einzelnes Argument vom Typ \(T_0\) annehmen und wird mit true_operand aufgerufen, das vom selben Typ sein muss. Die false_computation muss ein einzelnes Argument vom Typ \(T_1\) annehmen und wird mit false_operand aufgerufen, das denselben Typ haben muss. Der Typ des zurückgegebenen Werts von true_computation und false_computation muss identisch sein.

Je nach Wert von predicate wird nur eine der beiden Optionen true_computation und false_computation ausgeführt.

Conditional(branch_index, branch_computations, branch_operands)

Argumente Typ Semantik
branch_index XlaOp Skalar vom Typ S32
branch_computations Sequenz von N XlaComputation XlaComputations vom Typ \(T_0 \to S , T_1 \to S , ..., T_{N-1} \to S\)
branch_operands Sequenz von N XlaOp Argumente vom Typ \(T_0 , T_1 , ..., T_{N-1}\)

Führt branch_computations[branch_index] aus und gibt das Ergebnis zurück. Wenn branch_index ein S32 ist, das < 0 oder >= N ist, wird branch_computations[N-1] als Standardzweig ausgeführt.

Jede branch_computations[b] muss ein einzelnes Argument vom Typ \(T_b\) entgegennehmen und wird mit branch_operands[b] aufgerufen, das denselben Typ haben muss. Der Typ des zurückgegebenen Werts der einzelnen branch_computations[b] muss identisch sein.

Je nach Wert von branch_index wird nur einer der branch_computations ausgeführt.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – if.

Konstante

Siehe auch XlaBuilder::ConstantLiteral.

Erstellt eine output aus einer konstanten literal.

Constant(literal)

Argumente Typ Semantik
literal LiteralSlice Konstante Ansicht eines vorhandenen Literal

Weitere Informationen zu StableHLO finden Sie unter StableHLO – constant.

ConvertElementType

Siehe auch XlaBuilder::ConvertElementType.

Ähnlich wie bei einem elementweisen static_cast in C++ wird mit ConvertElementType eine elementweise Konvertierungsoperation von einer Datenform in eine Zielform ausgeführt. Die Dimensionen müssen übereinstimmen und die Konvertierung erfolgt elementweise, z.B. werden s32-Elemente über eine s32-zu-f32-Konvertierungsroutine zu f32-Elementen.

ConvertElementType(operand, new_element_type)

Argumente Typ Semantik
operand XlaOp Array vom Typ T mit Dimensionen D
new_element_type PrimitiveType Typ U

Die Dimensionen des Operanden und der Zielform müssen übereinstimmen. Die Quell- und Ziel-Elementtypen dürfen keine Tupel sein.

Bei einer Konvertierung wie T=s32 in U=f32 wird eine Normalisierungsroutine für die Konvertierung von Ganzzahlen in Gleitkommazahlen wie „round-to-nearest-even“ (auf die nächste gerade Zahl runden) ausgeführt.

let a: s32[3] = {0, 1, 2};
let b: f32[3] = convert(a, f32);
then b == f32[3]{0.0, 1.0, 2.0}

Informationen zu StableHLO finden Sie unter StableHLO – convert.

Conv (Convolution)

Siehe auch XlaBuilder::Conv.

Berechnet eine Faltung, wie sie in neuronalen Netzen verwendet wird. Eine Faltung kann als n-dimensionales Fenster betrachtet werden, das sich über einen n-dimensionalen Basisbereich bewegt. Für jede mögliche Position des Fensters wird eine Berechnung durchgeführt.

Conv Stellt eine Faltungsanweisung in die Berechnungswarteschlange ein, die die Standard-Faltungsdimensionsnummern ohne Dilation verwendet.

Die Auffüllung wird in Kurzform als SAME oder VALID angegeben. Beim SAME-Padding wird die Eingabe (lhs) mit Nullen aufgefüllt, sodass die Ausgabe dieselbe Form wie die Eingabe hat, wenn kein Striding berücksichtigt wird. VALID-Padding bedeutet einfach kein Padding.

Conv(lhs, rhs, window_strides, padding, feature_group_count, batch_group_count, precision_config, preferred_element_type)

Argumente Typ Semantik
lhs XlaOp (n+2)-dimensionales Array von Eingaben
rhs XlaOp (n+2)-dimensionales Array mit Kernelgewichten
window_strides ArraySlice<int64> n-dimensionales Array von Kernel-Strides
padding Padding enum für Padding
feature_group_count int64 die Anzahl der Funktionsgruppen
batch_group_count int64 Anzahl der Batchgruppen
precision_config optional PrecisionConfig Enum für den Genauigkeitsgrad
preferred_element_type optional PrimitiveType enum des skalaren Elementtyps

Für Conv sind verschiedene Steuerungsebenen verfügbar:

Sei n die Anzahl der räumlichen Dimensionen. Das lhs-Argument ist ein (n+2)-dimensionales Array, das die Grundfläche beschreibt. Dies wird als Eingabe bezeichnet, obwohl natürlich auch die rechte Seite eine Eingabe ist. In einem neuronalen Netzwerk sind das die Eingabeaktivierungen. Die n+2-Dimensionen sind in dieser Reihenfolge:

  • batch: Jede Koordinate in dieser Dimension stellt eine unabhängige Eingabe dar, für die die Faltung ausgeführt wird.
  • z/depth/features: Jeder (y,x)-Position im Basisbereich ist ein Vektor zugeordnet, der in diese Dimension eingeht.
  • spatial_dims: Beschreibt die räumlichen Dimensionen von n, die den Basisbereich definieren, über den sich das Fenster bewegt.

Das rhs-Argument ist ein (n+2)-dimensionales Array, das den Faltungsfilter/Kernel/das Faltungsfenster beschreibt. Die Dimensionen sind in dieser Reihenfolge:

  • output-z: Die z-Dimension der Ausgabe.
  • input-z: Die Größe dieser Dimension multipliziert mit feature_group_count sollte der Größe der Dimension z auf der linken Seite entsprechen.
  • spatial_dims: Beschreibt die räumlichen n-Dimensionen, die das n-dimensionale Fenster definieren, das sich über den Basisbereich bewegt.

Das Argument window_strides gibt den Stride des Faltungsfensters in den räumlichen Dimensionen an. Wenn der Stride in der ersten räumlichen Dimension beispielsweise 3 ist, kann das Fenster nur an Koordinaten platziert werden, bei denen der erste räumliche Index durch 3 teilbar ist.

Das Argument padding gibt an, wie viel Nullenauffüllung auf den Basisbereich angewendet werden soll. Der Padding-Betrag kann negativ sein. Der absolute Wert des negativen Padding gibt die Anzahl der Elemente an, die vor der Faltung aus der angegebenen Dimension entfernt werden sollen. padding[0] gibt den Abstand für die Dimension y und padding[1] den Abstand für die Dimension x an. Jedes Paar hat das niedrige Padding als erstes und das hohe Padding als zweites Element. Das niedrige Padding wird in Richtung niedrigerer Indexe angewendet, das hohe Padding in Richtung höherer Indexe. Wenn padding[1] beispielsweise (2,3) ist, wird in der zweiten räumlichen Dimension links mit zwei Nullen und rechts mit drei Nullen aufgefüllt. Die Verwendung von Padding entspricht dem Einfügen dieser Nullwerte in die Eingabe (lhs) vor der Faltung.

Mit den Argumenten lhs_dilation und rhs_dilation wird der Dilation-Faktor angegeben, der in jeder räumlichen Dimension auf die linke bzw. rechte Seite angewendet werden soll. Wenn der Dilation-Faktor in einer räumlichen Dimension „d“ ist, werden implizit „d-1“ Lücken zwischen den einzelnen Einträgen in dieser Dimension eingefügt, wodurch sich die Größe des Arrays erhöht. Die Lücken werden mit einem No-Op-Wert gefüllt, was für die Faltung Nullen bedeutet.

Die Erweiterung der rechten Seite wird auch als Atrous-Faltung bezeichnet. Weitere Informationen finden Sie unter tf.nn.atrous_conv2d. Die Erweiterung der linken Seite wird auch als transponierte Faltung bezeichnet. Weitere Informationen finden Sie unter tf.nn.conv2d_transpose.

Das Argument feature_group_count (Standardwert 1) kann für gruppierte Faltungen verwendet werden. feature_group_count muss ein Teiler sowohl der Eingabe- als auch der Ausgabefeatured-Dimension sein. Wenn feature_group_count größer als 1 ist, bedeutet das, dass die Eingabe- und Ausgabefeature-Dimension und die rhs-Ausgabefeature-Dimension konzeptionell gleichmäßig in viele feature_group_count-Gruppen aufgeteilt werden, wobei jede Gruppe aus einer fortlaufenden Untersequenz von Features besteht. Die Eingabefeature-Dimension von rhs muss gleich der Eingabefeature-Dimension von lhs geteilt durch feature_group_count sein. Sie hat also bereits die Größe einer Gruppe von Eingabefeatures. Die i-ten Gruppen werden zusammen verwendet, um feature_group_count für viele separate Faltungen zu berechnen. Die Ergebnisse dieser Faltungen werden in der Ausgabefeatured-Dimension verkettet.

Bei der faltenden Schicht wird das feature_group_count-Argument auf die Eingabe-Feature-Dimension festgelegt und der Filter wird von [filter_height, filter_width, in_channels, channel_multiplier] in [filter_height, filter_width, 1, in_channels * channel_multiplier] umgeformt. Weitere Informationen finden Sie unter tf.nn.depthwise_conv2d.

Das Argument batch_group_count (Standardwert 1) kann für gruppierte Filter während der Backpropagation verwendet werden. batch_group_count muss ein Teiler der Größe der Batchdimension lhs (Eingabe) sein. Wenn batch_group_count größer als 1 ist, sollte die Ausgabebatchdimension die Größe input batch / batch_group_count haben. Die batch_group_count muss ein Teiler der Größe des Ausgabefeature sein.

Die Ausgabedimensionen sind in dieser Reihenfolge:

  • batch: Die Größe dieser Dimension multipliziert mit batch_group_count sollte der Größe der Dimension batch in „lhs“ entsprechen.
  • z: Hat dieselbe Größe wie output-z im Kernel (rhs).
  • spatial_dims: Ein Wert für jede gültige Platzierung des Faltungsfensters.

Die Abbildung oben zeigt, wie das Feld batch_group_count funktioniert. Dazu wird jeder LHS-Batch in batch_group_count Gruppen unterteilt. Das Gleiche geschieht mit den Ausgabefunktionen. Anschließend führen wir für jede dieser Gruppen paarweise Faltungen durch und verketten die Ausgabe entlang der Ausgabefunktionsdimension. Die operationelle Semantik aller anderen Dimensionen (Feature und räumlich) bleibt unverändert.

Die gültigen Positionen des Faltungsfensters werden durch die Strides und die Größe der Grundfläche nach dem Padding bestimmt.

Um zu beschreiben, was eine Faltung bewirkt, betrachten wir eine 2D-Faltung und wählen einige feste batch-, z-, y- und x-Koordinaten in der Ausgabe aus. Dann ist (y,x) die Position einer Ecke des Fensters im Basisbereich (z.B. die obere linke Ecke, je nachdem, wie Sie die räumlichen Dimensionen interpretieren). Wir haben jetzt ein 2D-Fenster aus dem Basisbereich, in dem jeder 2D-Punkt einem 1D-Vektor zugeordnet ist. So erhalten wir einen 3D-Quader. Da wir die Ausgabekoordinate z festgelegt haben, erhalten wir aus dem Faltungs-Kernel auch einen 3D-Quader. Die beiden Begrenzungsrahmen haben dieselben Abmessungen. Wir können also die Summe der elementweisen Produkte zwischen den beiden Begrenzungsrahmen bilden (ähnlich einem Skalarprodukt). Das ist der Ausgabewert.

Wenn output-z beispielsweise 5 ist, werden für jede Position des Fensters 5 Werte in der Ausgabe in der Dimension z der Ausgabe generiert. Diese Werte unterscheiden sich darin, welcher Teil des Faltungskerns verwendet wird. Für jede output-z-Koordinate wird ein separater dreidimensionaler Wertebereich verwendet. Sie können sich das als fünf separate Faltungen mit jeweils einem anderen Filter vorstellen.

Hier ist Pseudocode für eine 2D-Faltung mit Padding und Striding:

for (b, oz, oy, ox) { // output coordinates
  value = 0;
  for (iz, ky, kx) { // kernel coordinates and input z
    iy = oy*stride_y + ky - pad_low_y;
    ix = ox*stride_x + kx - pad_low_x;
    if ((iy, ix) inside the base area considered without padding) {
      value += input(b, iz, iy, ix) * kernel(oz, iz, ky, kx);
    }
  }
  output(b, oz, oy, ox) = value;
}

Mit precision_config wird die Konfiguration der Genauigkeit angegeben. Die Stufe bestimmt, ob die Hardware versuchen soll, mehr Maschinencode-Befehle zu generieren, um bei Bedarf eine genauere Dtype-Emulation zu ermöglichen (z.B. die Emulation von f32 auf einer TPU, die nur bf16-Matmuls unterstützt). Mögliche Werte sind DEFAULT, HIGH und HIGHEST. Weitere Informationen finden Sie in den MXU-Abschnitten.

preferred_element_type ist ein Skalarelement von Ausgabetypen mit höherer/niedrigerer Genauigkeit, das für die Akkumulierung verwendet wird. preferred_element_type empfiehlt den Akkumulationstyp für den angegebenen Vorgang, dies ist jedoch nicht garantiert. So können einige Hardware-Back-Ends stattdessen in einem anderen Typ akkumulieren und in den bevorzugten Ausgabetyp konvertieren.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Convolution.

ConvWithGeneralPadding

Siehe auch XlaBuilder::ConvWithGeneralPadding.

ConvWithGeneralPadding(lhs, rhs, window_strides, padding, feature_group_count, batch_group_count, precision_config, preferred_element_type)

Entspricht Conv, wobei die Padding-Konfiguration explizit ist.

Argumente Typ Semantik
lhs XlaOp (n+2)-dimensionales Array von Eingaben
rhs XlaOp (n+2)-dimensionales Array mit Kernelgewichten
window_strides ArraySlice<int64> n-dimensionales Array von Kernel-Strides
padding ArraySlice< pair<int64,int64>> n-dimensionales Array mit (niedrig, hoch)-Padding
feature_group_count int64 die Anzahl der Funktionsgruppen
batch_group_count int64 Anzahl der Batchgruppen
precision_config optional PrecisionConfig Enum für den Genauigkeitsgrad
preferred_element_type optional PrimitiveType enum des skalaren Elementtyps

ConvWithGeneralDimensions

Siehe auch XlaBuilder::ConvWithGeneralDimensions.

ConvWithGeneralDimensions(lhs, rhs, window_strides, padding, dimension_numbers, feature_group_count, batch_group_count, precision_config, preferred_element_type)

Entspricht Conv, wobei die Dimensionsnummern explizit angegeben sind.

Argumente Typ Semantik
lhs XlaOp (n+2)-dimensionales Array von Eingaben
rhs XlaOp (n+2)-dimensionales Array mit Kernelgewichten
window_strides ArraySlice<int64> n-dimensionales Array mit Kernel-Strides
padding Padding enum für Padding
dimension_numbers ConvolutionDimensionNumbers Anzahl der Dimensionen
feature_group_count int64 Anzahl der Featuregruppen
batch_group_count int64 Anzahl der Batchgruppen
precision_config optional PrecisionConfig Aufzählung für den Genauigkeitsgrad
preferred_element_type optional PrimitiveType enum des skalaren Elementtyps

ConvGeneral

Siehe auch XlaBuilder::ConvGeneral.

ConvGeneral(lhs, rhs, window_strides, padding, dimension_numbers, feature_group_count, batch_group_count, precision_config, preferred_element_type)

Wie Conv, wobei die Dimensionsnummern und die Padding-Konfiguration explizit angegeben werden.

Argumente Typ Semantik
lhs XlaOp (n+2)-dimensionales Array von Eingaben
rhs XlaOp (n+2)-dimensionales Array mit Kernelgewichten
window_strides ArraySlice<int64> n-dimensionales Array mit Kernel-Strides
padding ArraySlice< pair<int64,int64>> n-dimensionales Array mit (low, high)-Padding
dimension_numbers ConvolutionDimensionNumbers Anzahl der Dimensionen
feature_group_count int64 Anzahl der Featuregruppen
batch_group_count int64 Anzahl der Batchgruppen
precision_config optional PrecisionConfig Aufzählung für den Genauigkeitsgrad
preferred_element_type optional PrimitiveType enum des skalaren Elementtyps

ConvGeneralDilated

Siehe auch XlaBuilder::ConvGeneralDilated.

ConvGeneralDilated(lhs, rhs, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, feature_group_count, batch_group_count, precision_config, preferred_element_type, window_reversal)

Entspricht Conv, wobei die Padding-Konfiguration, die Dilation-Faktoren und die Dimensionsnummern explizit angegeben werden.

Argumente Typ Semantik
lhs XlaOp (n+2)-dimensionales Array von Eingaben
rhs XlaOp (n+2)-dimensionales Array mit Kernelgewichten
window_strides ArraySlice<int64> n-dimensionales Array mit Kernel-Strides
padding ArraySlice< pair<int64,int64>> n-dimensionales Array mit (low, high)-Padding
lhs_dilation ArraySlice<int64> Array mit Faktoren für die n-dimensionale Dilation der linken Seite
rhs_dilation ArraySlice<int64> Array mit Faktoren für die n-dimensionale RHS-Erweiterung
dimension_numbers ConvolutionDimensionNumbers Anzahl der Dimensionen
feature_group_count int64 Anzahl der Featuregruppen
batch_group_count int64 Anzahl der Batchgruppen
precision_config optional PrecisionConfig Aufzählung für den Genauigkeitsgrad
preferred_element_type optional PrimitiveType enum des skalaren Elementtyps
window_reversal optional vector<bool> Flag, das verwendet wird, um die Dimension logisch umzukehren, bevor die Faltung angewendet wird.

Kopieren

Siehe auch HloInstruction::CreateCopyStart.

Copy wird intern in zwei HLO-Anweisungen zerlegt: CopyStart und CopyDone. Copy sowie CopyStart und CopyDone dienen als Primitiven in HLO. Diese Vorgänge können in HLO-Dumps enthalten sein, sind aber nicht dafür vorgesehen, von Endnutzern manuell erstellt zu werden.

COS

Siehe auch XlaBuilder::Cos.

Elementweiser Kosinus x -> cos(x).

Cos(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

„cos“ unterstützt auch das optionale Argument result_accuracy:

Cos(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Kosinus.

Cosh

Siehe auch XlaBuilder::Cosh.

Elementweiser hyperbolischer Kosinus x -> cosh(x).

Cosh(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Cosh unterstützt auch das optionale Argument result_accuracy:

Cosh(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

.

CustomCall

Siehe auch XlaBuilder::CustomCall.

Eine vom Nutzer bereitgestellte Funktion in einer Berechnung aufrufen.

Die Dokumentation zu Custom Calls finden Sie unter Entwicklerdetails – XLA Custom Calls.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – custom_call.

Div

Siehe auch XlaBuilder::Div.

Führt eine elementweise Division von Dividend lhs und Divisor rhs aus.

Div(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Bei einem Ganzzahl-Divisionsüberlauf (Division/Rest mit Vorzeichen/ohne Vorzeichen durch Null oder Division/Rest mit Vorzeichen von INT_SMIN mit -1) wird ein implementierungsdefinierter Wert ausgegeben.

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für „Div“ gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Div(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – divide.

Domain

Siehe auch HloInstruction::CreateDomain.

Domain kann in HLO-Dumps vorkommen, sollte aber nicht manuell von Endnutzern erstellt werden.

Punkt

Siehe auch XlaBuilder::Dot.

Dot(lhs, rhs, precision_config, preferred_element_type)

Argumente Typ Semantik
lhs XlaOp Array vom Typ T
rhs XlaOp Array vom Typ T
precision_config optional PrecisionConfig Enum für den Genauigkeitsgrad
preferred_element_type optional PrimitiveType enum des skalaren Elementtyps

Die genaue Semantik dieses Vorgangs hängt von den Rängen der Operanden ab:

Eingabe Ausgabe Semantik
vector [n] dot vector [n] Skalar Skalarprodukt von Vektoren
Matrix [m × k] dot Vektor [k] Vektor [m] Matrix-Vektor-Multiplikation
Matrix [m × k] dot Matrix [k × n] Matrix [m × n] Matrix-Matrix-Multiplikation

Bei der Operation wird die Summe der Produkte über die zweite Dimension von lhs (oder die erste, wenn sie 1 Dimension hat) und die erste Dimension von rhs berechnet. Das sind die „kontrahierten“ Dimensionen. Die kontrahierten Dimensionen von lhs und rhs müssen dieselbe Größe haben. In der Praxis kann sie verwendet werden, um Skalarprodukte zwischen Vektoren, Vektor-/Matrix-Multiplikationen oder Matrix-/Matrix-Multiplikationen auszuführen.

Mit precision_config wird die Konfiguration der Genauigkeit angegeben. Die Stufe bestimmt, ob die Hardware versuchen soll, mehr Maschinencode-Befehle zu generieren, um bei Bedarf eine genauere Dtype-Emulation zu ermöglichen (z.B. die Emulation von f32 auf einer TPU, die nur bf16-Matmuls unterstützt). Mögliche Werte sind DEFAULT, HIGH und HIGHEST. Weitere Informationen finden Sie in den MXU-Abschnitten.

preferred_element_type ist ein Skalarelement von Ausgabetypen mit höherer/niedrigerer Genauigkeit, das für die Akkumulierung verwendet wird. preferred_element_type empfiehlt den Akkumulationstyp für den angegebenen Vorgang, dies ist jedoch nicht garantiert. So können einige Hardware-Back-Ends stattdessen in einem anderen Typ akkumulieren und in den bevorzugten Ausgabetyp konvertieren.

Informationen zu StableHLO finden Sie unter StableHLO – dot.

DotGeneral

Siehe auch XlaBuilder::DotGeneral.

DotGeneral(lhs, rhs, dimension_numbers, precision_config, preferred_element_type)

Argumente Typ Semantik
lhs XlaOp Array vom Typ T
rhs XlaOp Array vom Typ T
dimension_numbers DotDimensionNumbers Kontrahierungs- und Batch-Dimensionsnummern
precision_config optional PrecisionConfig Aufzählung für den Genauigkeitsgrad
preferred_element_type optional PrimitiveType enum des skalaren Elementtyps

Ähnlich wie „Dot“, aber es können Kontraktions- und Batch-Dimensionsnummern für lhs und rhs angegeben werden.

DotDimensionNumbers-Felder Typ Semantik
lhs_contracting_dimensions repeated int64 lhs Kontrahierende Dimensionszahlen
rhs_contracting_dimensions repeated int64 rhs Kontrahierende Dimensionszahlen
lhs_batch_dimensions repeated int64 lhs Batchdimension Nummern
rhs_batch_dimensions repeated int64 rhs Batchdimension Nummern

Mit DotGeneral wird die Summe der Produkte über die in dimension_numbers angegebenen Kontraktionsdimensionen berechnet.

Die zugehörigen Kontraktionsdimensionsnummern aus lhs und rhs müssen nicht identisch sein, aber dieselben Dimensionsgrößen haben.

Beispiel mit kontrahierten Dimensionsnummern:

lhs = { {1.0, 2.0, 3.0},
        {4.0, 5.0, 6.0} }

rhs = { {1.0, 1.0, 1.0},
        {2.0, 2.0, 2.0} }

DotDimensionNumbers dnums;
dnums.add_lhs_contracting_dimensions(1);
dnums.add_rhs_contracting_dimensions(1);

DotGeneral(lhs, rhs, dnums) -> { { 6.0, 12.0},
                                 {15.0, 30.0} }

Die zugehörigen Batch-Dimensionsnummern aus lhs und rhs müssen dieselben Dimensionsgrößen haben.

Beispiel mit Batch-Dimensionsnummern (Batchgröße 2, 2×2-Matrizen):

lhs = { { {1.0, 2.0},
          {3.0, 4.0} },
        { {5.0, 6.0},
          {7.0, 8.0} } }

rhs = { { {1.0, 0.0},
          {0.0, 1.0} },
        { {1.0, 0.0},
          {0.0, 1.0} } }

DotDimensionNumbers dnums;
dnums.add_lhs_contracting_dimensions(2);
dnums.add_rhs_contracting_dimensions(1);
dnums.add_lhs_batch_dimensions(0);
dnums.add_rhs_batch_dimensions(0);

DotGeneral(lhs, rhs, dnums) -> {
    { {1.0, 2.0},
      {3.0, 4.0} },
    { {5.0, 6.0},
      {7.0, 8.0} } }
Eingabe Ausgabe Semantik
[b0, m, k] dot [b0, k, n] [b0, m, n] Batch-Matrixmultiplikation
[b0, b1, m, k] dot [b0, b1, k, n] [b0, b1, m, n] Batch-Matrixmultiplikation

Die resultierende Dimensionsnummer beginnt also mit der Batch-Dimension, dann mit der lhs-Dimension (nicht kontrahierend/nicht Batch) und schließlich mit der rhs-Dimension (nicht kontrahierend/nicht Batch).

Mit precision_config wird die Konfiguration der Genauigkeit angegeben. Die Stufe bestimmt, ob die Hardware versuchen soll, mehr Maschinencode-Befehle zu generieren, um bei Bedarf eine genauere Dtype-Emulation zu ermöglichen (z.B. die Emulation von f32 auf einer TPU, die nur bf16-Matmuls unterstützt). Mögliche Werte sind DEFAULT, HIGH und HIGHEST. Weitere Informationen finden Sie in den MXU-Abschnitten.

preferred_element_type ist ein Skalarelement von Ausgabetypen mit höherer/niedrigerer Genauigkeit, das für die Akkumulierung verwendet wird. preferred_element_type empfiehlt den Akkumulationstyp für den angegebenen Vorgang, dies ist jedoch nicht garantiert. So können einige Hardware-Back-Ends stattdessen in einem anderen Typ akkumulieren und in den bevorzugten Ausgabetyp konvertieren.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – dot_general.

ScaledDot

Siehe auch XlaBuilder::ScaledDot.

ScaledDot(lhs, lhs_scale, rhs, rhs_scale, dimension_number, precision_config,preferred_element_type)

Argumente Typ Semantik
lhs XlaOp Array vom Typ T
rhs XlaOp Array vom Typ T
lhs_scale XlaOp Array vom Typ T
rhs_scale XlaOp Array vom Typ T
dimension_number ScatterDimensionNumbers Dimensionsnummern für Scatter-Vorgang
precision_config PrecisionConfig Aufzählung für den Genauigkeitsgrad
preferred_element_type optional PrimitiveType enum des skalaren Elementtyps

Ähnlich wie DotGeneral.

Erstellt einen skalierten Punktvorgang mit den Operanden „lhs“, „lhs_scale“, „rhs“ und „rhs_scale“, wobei die Kontraktions- und Batchdimensionen in „dimension_numbers“ angegeben werden.

RaggedDot

Siehe auch XlaBuilder::RaggedDot.

Eine Aufschlüsselung der Berechnung von RaggedDot finden Sie unter StableHLO – chlo.ragged_dot.

DynamicReshape

Siehe auch XlaBuilder::DynamicReshape.

Dieser Vorgang ist funktional identisch mit reshape, aber die Ergebnisform wird dynamisch über output_shape angegeben.

DynamicReshape(operand, dim_sizes, new_size_bounds, dims_are_dynamic)

Argumente Typ Semantik
operand XlaOp N-dimensionales Array vom Typ T
dim_sizes Vektor von XlaOP N-dimensionale Vektorgrößen
new_size_bounds Vektor von int63 N-dimensionaler Vektor von Grenzen
dims_are_dynamic Vektor von bool N-dimensionale dynamische Dimension

Weitere Informationen zu StableHLO finden Sie unter StableHLO – dynamic_reshape.

DynamicSlice

Siehe auch XlaBuilder::DynamicSlice.

Mit DynamicSlice wird ein Unterarray aus dem Eingabearray an der dynamischen start_indices extrahiert. Die Größe des Slices in jeder Dimension wird in size_indices übergeben. Damit wird der Endpunkt der exklusiven Slice-Intervalle in jeder Dimension angegeben: [start, start + size). Die Form von start_indices muss eindimensional sein. Die Größe der Dimension muss der Anzahl der Dimensionen von operand entsprechen.

DynamicSlice(operand, start_indices, slice_sizes)

Argumente Typ Semantik
operand XlaOp N-dimensionales Array vom Typ T
start_indices Sequenz von N XlaOp Liste mit N Skalar-Ganzzahlen, die die Startindexe des Slices für jede Dimension enthalten. Der Wert muss größer oder gleich null sein.
size_indices ArraySlice<int64> Liste mit N Ganzzahlen, die die Segmentgröße für jede Dimension enthält. Jeder Wert muss größer als null sein und „start“ + „size“ muss kleiner oder gleich der Größe der Dimension sein, um einen Umbruch modulo der Dimensionsgröße zu vermeiden.

Die effektiven Slice-Indexe werden berechnet, indem die folgende Transformation für jeden Index i in [1, N) angewendet wird, bevor der Slice ausgeführt wird:

start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - slice_sizes[i])

So wird sichergestellt, dass der extrahierte Ausschnitt immer innerhalb der Grenzen des Operanden-Arrays liegt. Wenn sich der Slice vor der Transformation innerhalb der Grenzen befindet, hat die Transformation keine Auswirkungen.

1‑dimensionales Beispiel:

let a = {0.0, 1.0, 2.0, 3.0, 4.0};
let s = {2};

DynamicSlice(a, s, {2});
// Result: {2.0, 3.0}

2‑dimensionales Beispiel:

let b =
{ {0.0,  1.0,  2.0},
  {3.0,  4.0,  5.0},
  {6.0,  7.0,  8.0},
  {9.0, 10.0, 11.0} }
let s = {2, 1}

DynamicSlice(b, s, {2, 2});
//Result:
// { { 7.0,  8.0},
//   {10.0, 11.0} }

Weitere Informationen zu StableHLO finden Sie unter StableHLO – dynamic_slice.

DynamicUpdateSlice

Siehe auch XlaBuilder::DynamicUpdateSlice.

DynamicUpdateSlice generiert ein Ergebnis, das dem Wert des Eingabearrays operand entspricht, wobei ein Segment update bei start_indices überschrieben wird. Die Form von update bestimmt die Form des aktualisierten Unterarrays des Ergebnisses. Die Form von start_indices muss eindimensional sein. Die Größe der Dimension muss der Anzahl der Dimensionen von operand entsprechen.

DynamicUpdateSlice(operand, update, start_indices)

Argumente Typ Semantik
operand XlaOp N-dimensionales Array vom Typ T
update XlaOp N-dimensionales Array vom Typ T mit der Slice-Aktualisierung. Jede Dimension der Aktualisierungsform muss größer als null sein und „start“ + „update“ muss für jede Dimension kleiner oder gleich der Operandengröße sein, damit keine Aktualisierungsindexe außerhalb des gültigen Bereichs generiert werden.
start_indices Sequenz von N XlaOp Liste mit N Skalar-Ganzzahlen, die die Startindexe des Slices für jede Dimension enthalten. Der Wert muss größer oder gleich null sein.

Die effektiven Slice-Indexe werden berechnet, indem die folgende Transformation für jeden Index i in [1, N) angewendet wird, bevor der Slice ausgeführt wird:

start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - update.dimension_size[i])

So wird sichergestellt, dass der aktualisierte Ausschnitt immer innerhalb der Grenzen des Operanden-Arrays liegt. Wenn sich der Slice vor der Transformation innerhalb der Grenzen befindet, hat die Transformation keine Auswirkungen.

1‑dimensionales Beispiel:

let a = {0.0, 1.0, 2.0, 3.0, 4.0}
let u = {5.0, 6.0}
let s = {2}

DynamicUpdateSlice(a, u, s)
// Result: {0.0, 1.0, 5.0, 6.0, 4.0}

2‑dimensionales Beispiel:

let b =
{ {0.0,  1.0,  2.0},
  {3.0,  4.0,  5.0},
  {6.0,  7.0,  8.0},
  {9.0, 10.0, 11.0} }
let u =
{ {12.0, 13.0},
  {14.0, 15.0},
  {16.0, 17.0} }

let s = {1, 1}

DynamicUpdateSlice(b, u, s)
// Result:
// { {0.0,  1.0,  2.0},
//   {3.0, 12.0, 13.0},
//   {6.0, 14.0, 15.0},
//   {9.0, 16.0, 17.0} }

Weitere Informationen zu StableHLO finden Sie unter StableHLO – dynamic_update_slice.

Erf

Siehe auch XlaBuilder::Erf.

Elementweise Fehlerfunktion x -> erf(x), wobei:

\(\text{erf}(x) = \frac{2}{\sqrt{\pi} }\int_0^x e^{-t^2} \, dt\).

Erf(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Erf unterstützt auch das optionale Argument result_accuracy:

Erf(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Exp

Siehe auch XlaBuilder::Exp.

Elementweise natürliche Exponentialfunktion x -> e^x.

Exp(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

„Exp“ unterstützt auch das optionale Argument result_accuracy:

Exp(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Exponential.

Expm1

Siehe auch XlaBuilder::Expm1.

Elementweise natürliche Exponentialfunktion minus 1 x -> e^x - 1.

Expm1(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

„expm1“ unterstützt auch das optionale result_accuracy-Argument:

Expm1(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Informationen zu StableHLO finden Sie unter StableHLO – exponential_minus_one.

FFT

Siehe auch XlaBuilder::Fft.

Der XLA-FFT-Vorgang implementiert die Vorwärts- und Rücktransformation der Fourier-Transformation für reelle und komplexe Ein-/Ausgaben. Es werden mehrdimensionale FFTs auf bis zu drei Achsen unterstützt.

Fft(operand, ftt_type, fft_length)

Argumente Typ Semantik
operand XlaOp Das Array, das wir einer Fourier-Transformation unterziehen.
fft_type FftType Siehe die folgende Tabelle.
fft_length ArraySlice<int64> Die Längen der Zeitachse der Achsen, die transformiert werden. Dies ist insbesondere für IRFFT erforderlich, um die innerste Achse richtig zu dimensionieren, da RFFT(fft_length=[16]) dieselbe Ausgabedimension wie RFFT(fft_length=[17]) hat.
FftType Semantik
FFT Führt die komplexe FFT vorwärts aus. Die Form ist unverändert.
IFFT Inverse komplex-zu-komplex-FFT. Die Form ist unverändert.
RFFT Vorwärts-FFT von reell zu komplex. Die Form der innersten Achse wird auf fft_length[-1] // 2 + 1 reduziert, wenn fft_length[-1] ein Wert ungleich null ist. Dabei wird der umgekehrte konjugierte Teil des transformierten Signals über der Nyquist-Frequenz hinaus weggelassen.
IRFFT Inverse reell-zu-komplex-FFT (d.h. nimmt komplexe Zahlen entgegen und gibt reelle Zahlen zurück). Die Form der innersten Achse wird auf fft_length[-1] erweitert, wenn fft_length[-1] ein Wert ungleich null ist. Der Teil des transformierten Signals über der Nyquist-Frequenz wird aus dem umgekehrten Konjugat der Einträge von 1 bis fft_length[-1] // 2 + 1 abgeleitet.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – fft.

Mehrdimensionale FFT

Wenn mehr als ein fft_length angegeben wird, entspricht dies der Anwendung einer Kaskade von FFT-Vorgängen auf jede der innersten Achsen. Beachten Sie, dass bei den Fällen „real“ –> „complex“ und „complex“ –> „real“ die Transformation der innersten Achse (effektiv) zuerst durchgeführt wird (RFFT; zuletzt für IRFFT). Daher ändert sich die Größe der innersten Achse. Andere Achsentransformationen sind dann komplex –> komplex.

Implementierungsdetails

Die CPU-FFT basiert auf TensorFFT von Eigen. GPU FFT verwendet cuFFT.

Etage

Siehe auch XlaBuilder::Floor.

Elementweise Untergrenze x -> ⌊x⌋.

Floor(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – floor.

Fusion

Siehe auch HloInstruction::CreateFusion.

Der Fusion-Vorgang stellt HLO-Anweisungen dar und dient als Primitive in HLO. Dieser Vorgang kann in HLO-Dumps enthalten sein, sollte aber nicht manuell von Endnutzern erstellt werden.

Erfassen

Mit dem XLA-Vorgang „gather“ werden mehrere Slices (jeweils mit einem potenziell unterschiedlichen Laufzeit-Offset) eines Eingabearrays zusammengefügt.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – gather.

Allgemeine Semantik

Siehe auch XlaBuilder::Gather. Eine intuitivere Beschreibung finden Sie im Abschnitt „Informelle Beschreibung“ unten.

gather(operand, start_indices, dimension_numbers, slice_sizes, indices_are_sorted)

Argumente Typ Semantik
operand XlaOp Das Array, aus dem die Daten stammen.
start_indices XlaOp Array mit den Startindexen der Segmente, die wir erfassen.
dimension_numbers GatherDimensionNumbers Die Dimension in start_indices, die die Startindexe „enthält“. Eine detaillierte Beschreibung finden Sie unten.
slice_sizes ArraySlice<int64> slice_sizes[i] sind die Grenzen für den Slice in Dimension i.
indices_are_sorted bool Gibt an, ob die Indexe garantiert vom Aufrufer sortiert werden.

Der Einfachheit halber bezeichnen wir Dimensionen im Ausgabearray nicht als offset_dims, sondern als batch_dims.

Die Ausgabe ist ein Array mit batch_dims.size + offset_dims.size Dimensionen.

operand.rank muss der Summe von offset_dims.size und collapsed_slice_dims.size entsprechen. Außerdem muss slice_sizes.size gleich operand.rank sein.

Wenn index_vector_dim gleich start_indices.rank ist, gehen wir implizit davon aus, dass start_indices eine nachgestellte 1-Dimension hat. Wenn start_indices also die Form [6,7] hat und index_vector_dim gleich 2 ist, gehen wir implizit davon aus, dass die Form von start_indices gleich [6,7,1] ist.

Die Grenzen für das Ausgabearray entlang der Dimension i werden so berechnet:

  1. Wenn i in batch_dims vorhanden ist (d.h. für ein bestimmtes k gleich batch_dims[k] ist), werden die entsprechenden Dimensionsgrenzen aus start_indices.shape ausgewählt und index_vector_dim wird übersprungen (d.h. start_indices.shape.dims[k] wird ausgewählt, wenn k < index_vector_dim ist, und start_indices.shape.dims[k+1] andernfalls).

  2. Wenn i in offset_dims vorhanden ist (d.h. gleich offset_dims[k] für ein bestimmtes k), wählen wir die entsprechende Grenze aus slice_sizes aus, nachdem wir collapsed_slice_dims berücksichtigt haben (d.h. wir wählen adjusted_slice_sizes[k] aus, wobei adjusted_slice_sizes slice_sizes mit den Grenzen an den Indexpositionen collapsed_slice_dims ist).

Formal wird der Operandenindex In, der einem bestimmten Ausgabindex Out entspricht, so berechnet:

  1. Sei G = { Out[k] for k in batch_dims }. Verwende G, um einen Vektor S zu erstellen, sodass S[i] = start_indices[Combine(G, i)], wobei Combine(A, b) b an der Position index_vector_dim in A einfügt. Dies ist auch dann definiert, wenn G leer ist: Wenn G leer ist, gilt S = start_indices.

  2. Erstellen Sie einen Startindex, Sin, in operand, indem Sie S mit start_index_map aufteilen.S Genauer gesagt:

    1. Sin[start_index_map[k]] = S[k], wenn k < start_index_map.size.

    2. Sin[_] = 0 andernfalls.

  3. Erstelle einen Index Oin in operand, indem du die Indexe an den Offsetdimensionen in Out gemäß dem collapsed_slice_dims-Satz verteilst. Genauer gesagt:

    1. Oin[remapped_offset_dims(k)] = Out[offset_dims[k]], wenn k < offset_dims.size (remapped_offset_dims wird unten definiert).

    2. Oin[_] = 0 andernfalls.

  4. In ist Oin + Sin, wobei + die elementweise Addition ist.

remapped_offset_dims ist eine monotone Funktion mit dem Definitionsbereich [0, offset_dims.size) und dem Wertebereich [0, operand.rank) \ collapsed_slice_dims. Beispiel: Wenn offset_dims.size gleich 4, operand.rank gleich 6 und collapsed_slice_dims gleich {0, 2} ist, dann ist remapped_offset_dims gleich {01, 13, 24, 35}.

Wenn indices_are_sorted auf „true“ gesetzt ist, kann XLA davon ausgehen, dass start_indices vom Nutzer sortiert wurden (in aufsteigender Reihenfolge, nachdem die Werte gemäß start_index_map verteilt wurden). Andernfalls sind die Semantik implementierungsdefiniert.

Informelle Beschreibung und Beispiele

Informell entspricht jeder Index Out im Ausgabearray einem Element E im Operandenarray, das so berechnet wird:

  • Wir verwenden die Batchdimensionen in Out, um einen Startindex aus start_indices abzurufen.

  • Wir verwenden start_index_map, um den Startindex (dessen Größe möglicherweise kleiner als operand.rank ist) einem „vollständigen“ Startindex in operand zuzuordnen.

  • Wir schneiden dynamisch einen Slice mit der Größe slice_sizes aus dem vollständigen Startindex heraus.

  • Wir passen das Segment an, indem wir die collapsed_slice_dims-Dimensionen reduzieren. Da alle Dimensionen für zusammengefasste Slices eine Grenze von 1 haben müssen, ist diese Umformung immer zulässig.

  • Wir verwenden die Offsetdimensionen in Out, um in diesen Slice zu indexieren und das Eingabeelement E abzurufen, das dem Ausgabeelement Out entspricht.

In allen folgenden Beispielen ist index_vector_dim auf start_indices.rank – 1 festgelegt. Interessantere Werte für index_vector_dim ändern die Operation nicht grundlegend, machen die visuelle Darstellung aber umständlicher.

Um zu verstehen, wie alles zusammenpasst, sehen wir uns ein Beispiel an, in dem 5 Slices der Form [8,6] aus einem [16,11]-Array abgerufen werden. Die Position eines Slice im [16,11]-Array kann als Indexvektor der Form S64[2] dargestellt werden. Die Menge der fünf Positionen kann also als S64[5,2]-Array dargestellt werden.

Das Verhalten des Gather-Vorgangs kann dann als Indexumwandlung dargestellt werden, die [G,O0,O1], einen Index in der Ausgabedimension, verwendet und ihn auf folgende Weise einem Element im Eingabearray zuordnet:

Zuerst wird mit G ein (X,Y)-Vektor aus dem Array mit den Gather-Indizes ausgewählt. Das Element im Ausgabearray am Index [G,O0,O1] ist dann das Element im Eingabearray am Index [X+O0,Y+O1].

slice_sizes ist [8,6], was den Bereich von O0 und O1 bestimmt. Dies wiederum bestimmt die Grenzen des Segments.

Dieser Sammelvorgang fungiert als dynamischer Batch-Slice mit G als Batch-Dimension.

Die Gather-Indizes können mehrdimensional sein. Eine allgemeinere Version des obigen Beispiels mit einem „gather indices“-Array der Form [4,5,2] würde Indexe so übersetzen:

Auch hier fungiert G0 als dynamischer Batch-Slice und G1 als Batch-Dimensionen. Die Segmentgröße ist weiterhin [8,6].

Der Gather-Vorgang in XLA verallgemeinert die oben beschriebene informelle Semantik auf folgende Weise:

  1. Wir können konfigurieren, welche Dimensionen in der Ausgabedimension die Offsetdimensionen sind (Dimensionen mit O0, O1 im letzten Beispiel). Die Batchdimensionen der Ausgabe (Dimensionen mit G0, G1 im letzten Beispiel) sind die Ausgabedimensionen, die keine Offsetdimensionen sind.

  2. Die Anzahl der Ausgabedimensionen, die explizit in der Ausgabeform vorhanden sind, kann kleiner sein als die Anzahl der Eingabedimensionen. Diese „fehlenden“ Dimensionen, die explizit als collapsed_slice_dims aufgeführt sind, müssen eine Slice-Größe von 1 haben. Da sie eine Segmentgröße von 1 haben, ist der einzige gültige Index für sie 0. Das Auslassen führt daher nicht zu Unklarheiten.

  3. Das aus dem Array „Gather Indices“ extrahierte Segment ((X, Y) im letzten Beispiel) kann weniger Elemente als die Anzahl der Dimensionen des Eingabearrays haben. Eine explizite Zuordnung gibt an, wie der Index erweitert werden soll, damit er dieselbe Anzahl von Dimensionen wie die Eingabe hat.

Als letztes Beispiel verwenden wir (2) und (3), um tf.gather_nd zu implementieren:

G0 und G1 werden wie gewohnt verwendet, um einen Startindex aus dem Array der Gather-Indizes herauszuschneiden. Der Startindex hat jedoch nur ein Element, X. Ebenso gibt es nur einen Ausgabeversetzungsindex mit dem Wert O0. Bevor sie jedoch als Indexe in das Eingabearray verwendet werden, werden sie gemäß „Gather Index Mapping“ (start_index_map in der formalen Beschreibung) und „Offset Mapping“ (remapped_offset_dims in der formalen Beschreibung) in [X,0] bzw. [0,O0] erweitert, was zu [X,O0] führt. Mit anderen Worten: Der Ausgabewertindex [G0,G1,O0] wird dem Eingabewertindex [GatherIndices[G0,G1,0],O0] zugeordnet, was uns die Semantik für tf.gather_nd liefert.

slice_sizes für diesen Fall ist [1,11]. Intuitiv bedeutet das, dass mit jedem Index X im Array „gather_indices“ eine ganze Zeile ausgewählt wird und das Ergebnis die Verkettung aller dieser Zeilen ist.

GetDimensionSize

Siehe auch XlaBuilder::GetDimensionSize.

Gibt die Größe der angegebenen Dimension des Operanden zurück. Der Operand muss ein Array sein.

GetDimensionSize(operand, dimension)

Argumente Typ Semantik
operand XlaOp n-dimensionales Eingabearray
dimension int64 Ein Wert im Intervall [0, n), der die Dimension angibt.

Informationen zu StableHLO finden Sie unter StableHLO – get_dimension_size.

GetTupleElement

Siehe auch XlaBuilder::GetTupleElement.

Indizes in ein Tupel mit einem zur Kompilierzeit konstanten Wert.

Der Wert muss eine Kompilierzeitkonstante sein, damit die Typinferenz den Typ des resultierenden Werts bestimmen kann.

Das entspricht std::get<int N>(t) in C++. Konzeptionell:

let v: f32[10] = f32[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
let s: s32 = 5;
let t: (f32[10], s32) = tuple(v, s);
let element_1: s32 = gettupleelement(t, 1); // Inferred shape matches s32.

Siehe auch tf.tuple.

GetTupleElement(tuple_data, index)

Argument Typ Semantik
tuple_data XlaOP Das Tupel
index int64 Index der Tupelform

Weitere Informationen zu StableHLO finden Sie unter StableHLO – get_tuple_element.

Imag

Siehe auch XlaBuilder::Imag.

Elementweiser imaginärer Teil einer komplexen (oder reellen) Form. x -> imag(x). Wenn der Operand ein Gleitkommatyp ist, wird 0 zurückgegeben.

Imag(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – imag.

Infeed

Siehe auch XlaBuilder::Infeed.

Infeed(shape, config)

Argument Typ Semantik
shape Shape Form der Daten, die über die Infeed-Schnittstelle gelesen werden. Das Feld „layout“ der Form muss so festgelegt werden, dass es mit dem Layout der Daten übereinstimmt, die an das Gerät gesendet werden. Andernfalls ist das Verhalten nicht definiert.
config optional string Konfiguration des Vorgangs.

Liest ein einzelnes Datenelement aus der impliziten Infeed-Streaming-Schnittstelle des Geräts, interpretiert die Daten als die angegebene Form und ihr Layout und gibt ein XlaOp der Daten zurück. Mehrere Infeed-Vorgänge sind in einer Berechnung zulässig, aber es muss eine Gesamtordnung zwischen den Infeed-Vorgängen geben. Die beiden Infeed im folgenden Code haben beispielsweise eine Gesamtordnung, da eine Abhängigkeit zwischen den while-Schleifen besteht.

result1 = while (condition, init = init_value) {
  Infeed(shape)
  }

result2 = while (condition, init = result1) {
  Infeed(shape)
  }

Verschachtelte Tupelformen werden nicht unterstützt. Bei einer leeren Tupelform ist der Infeed-Vorgang effektiv ein No-Op und wird fortgesetzt, ohne Daten aus dem Infeed des Geräts zu lesen.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Infeed.

Iota

Siehe auch XlaBuilder::Iota.

Iota(shape, iota_dimension)

Erstellt ein konstantes Literal auf dem Gerät anstelle eines potenziell großen Host-Transfers. Erstellt ein Array mit der angegebenen Form, das Werte ab null enthält, die entlang der angegebenen Dimension um eins erhöht werden. Bei Gleitkommatypen entspricht das erstellte Array ConvertElementType(Iota(...)), wobei Iota ein Ganzzahltyp ist und die Konvertierung in den Gleitkommatyp erfolgt.

Argumente Typ Semantik
shape Shape Form des Arrays, das von Iota() erstellt wurde
iota_dimension int64 Die Dimension, entlang derer inkrementiert werden soll.

Beispiel: Iota(s32[4, 8], 0) gibt Folgendes zurück:

[[0, 0, 0, 0, 0, 0, 0, 0 ],
 [1, 1, 1, 1, 1, 1, 1, 1 ],
 [2, 2, 2, 2, 2, 2, 2, 2 ],
 [3, 3, 3, 3, 3, 3, 3, 3 ]]

Iota(s32[4, 8], 1) für Retouren

[[0, 1, 2, 3, 4, 5, 6, 7 ],
 [0, 1, 2, 3, 4, 5, 6, 7 ],
 [0, 1, 2, 3, 4, 5, 6, 7 ],
 [0, 1, 2, 3, 4, 5, 6, 7 ]]

Weitere Informationen zu StableHLO finden Sie unter StableHLO – iota.

IsFinite

Siehe auch XlaBuilder::IsFinite.

Prüft, ob jedes Element von operand endlich ist, d.h. nicht positiv oder negativ unendlich und nicht NaN ist. Gibt ein Array von PRED-Werten mit derselben Form wie die Eingabe zurück, wobei jedes Element true ist, wenn das entsprechende Eingabeelement endlich ist.

IsFinite(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – is_finite.

Log

Siehe auch XlaBuilder::Log.

Elementweiser natürlicher Logarithmus x -> ln(x).

Log(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

„Log“ unterstützt auch das optionale Argument result_accuracy:

Log(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – log.

Log1p

Siehe auch XlaBuilder::Log1p.

Elementweiser verschobener natürlicher Logarithmus x -> ln(1+x).

Log1p(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Die Funktion „log1p“ unterstützt auch das optionale Argument result_accuracy:

Log1p(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – log_plus_one.

Logistisch

Siehe auch XlaBuilder::Logistic.

Elementweise Berechnung der logistischen Funktion x -> logistic(x).

Logistic(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Die Funktion „logistic“ unterstützt auch das optionale Argument result_accuracy:

Logistic(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Logistik.

Karte

Siehe auch XlaBuilder::Map.

Map(operands..., computation, dimensions)

Argumente Typ Semantik
operands Folge von N XlaOps N Arrays vom Typ T0..T{N-1}
computation XlaComputation Berechnung vom Typ T_0, T_1, .., T_{N + M -1} -> S mit N Parametern vom Typ T und M Parametern vom beliebigen Typ.
dimensions int64-Array Array von Kartendimensionen
static_operands Folge von N XlaOps Statische Vorgänge für den Kartenvorgang

Wendet eine Skalarfunktion auf die angegebenen operands-Arrays an. Das Ergebnis ist ein Array mit denselben Dimensionen, in dem jedes Element das Ergebnis der zugeordneten Funktion ist, die auf die entsprechenden Elemente in den Eingabearrays angewendet wird.

Die zugeordnete Funktion ist eine beliebige Berechnung mit der Einschränkung, dass sie N Eingaben vom skalaren Typ T und eine einzelne Ausgabe vom Typ S hat. Die Ausgabe hat dieselben Dimensionen wie die Operanden, mit der Ausnahme, dass der Elementtyp T durch S ersetzt wird.

Beispiel: Map(op1, op2, op3, computation, par1) ordnet elem_out <- computation(elem1, elem2, elem3, par1) an jedem (mehrdimensionalen) Index in den Eingabearrays zu, um das Ausgabearray zu erstellen.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Map.

Max.

Siehe auch XlaBuilder::Max.

Führt die elementweise Max-Operation für die Tensoren lhs und rhs aus.

Max(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Max gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Max(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Maximum.

Min.

Siehe auch XlaBuilder::Min.

Führt eine elementweise Min-Operation für lhs und rhs aus.

Min(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Min gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Min(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Minimum.

Mul

Siehe auch XlaBuilder::Mul.

Berechnet das elementweise Produkt von lhs und rhs.

Mul(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Mul gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Mul(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – multiply.

Neg

Siehe auch XlaBuilder::Neg.

Elementweise Negation x -> -x.

Neg(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – negate.

Nicht

Siehe auch XlaBuilder::Not.

Elementweises logisches NICHT x -> !(x).

Not(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Informationen zu StableHLO finden Sie unter StableHLO – nicht.

OptimizationBarrier

Siehe auch XlaBuilder::OptimizationBarrier.

Verhindert, dass Berechnungen über die Barriere hinweg verschoben werden.

OptimizationBarrier(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Sorgt dafür, dass alle Eingaben vor allen Operatoren ausgewertet werden, die von den Ausgaben der Barriere abhängen.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – optimization_barrier.

Oder

Siehe auch XlaBuilder::Or.

Führt ein elementweises ODER von lhs und rhs aus .

Or(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für „Oder“ gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Or(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Informationen zu StableHLO finden Sie unter StableHLO – oder.

Ausgang

Siehe auch XlaBuilder::Outfeed.

Schreibt Eingaben in den Outfeed.

Outfeed(operand, shape_with_layout, outfeed_config)

Argumente Typ Semantik
operand XlaOp Array vom Typ T
shape_with_layout Shape Definiert das Layout der übertragenen Daten
outfeed_config string Konstante der Konfiguration für die Outfeed-Anweisung

shape_with_layout gibt die angelegte Form an, die wir ausgeben möchten.

Informationen zu StableHLO finden Sie unter StableHLO – Outfeed.

Pad

Siehe auch XlaBuilder::Pad.

Pad(operand, padding_value, padding_config)

Argumente Typ Semantik
operand XlaOp Array vom Typ T
padding_value XlaOp Skalar vom Typ T, mit dem der hinzugefügte Padding-Bereich gefüllt werden soll
padding_config PaddingConfig Abstand an beiden Rändern (niedrig, hoch) und zwischen den Elementen jeder Dimension

Erweitert das angegebene operand-Array durch Auffüllen um das Array herum sowie zwischen den Elementen des Arrays mit dem angegebenen padding_value. padding_config gibt die Menge des Rand- und Innen-Paddings für jede Dimension an.

PaddingConfig ist ein wiederholtes Feld von PaddingConfigDimension, das für jede Dimension drei Felder enthält: edge_padding_low, edge_padding_high und interior_padding.

Mit edge_padding_low und edge_padding_high wird die Menge an Padding angegeben, die jeweils am unteren Ende (neben Index 0) und am oberen Ende (neben dem höchsten Index) jeder Dimension hinzugefügt wird. Der Betrag des Rand-Paddings kann negativ sein. Der absolute Wert des negativen Paddings gibt die Anzahl der Elemente an, die aus der angegebenen Dimension entfernt werden sollen.

interior_padding gibt den Abstand zwischen zwei Elementen in jeder Dimension an. Er darf nicht negativ sein. Die innere Auffüllung erfolgt logisch vor der Auffüllung von Rändern. Bei negativer Auffüllung von Rändern werden Elemente also aus dem inneren aufgefüllten Operanden entfernt.

Dieser Vorgang ist ein No-Op, wenn alle Edge-Padding-Paare (0, 0) und alle Werte für das innere Padding 0 sind. Die Abbildung unten zeigt Beispiele für verschiedene edge_padding- und interior_padding-Werte für ein zweidimensionales Array.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – pad.

Parameter

Siehe auch XlaBuilder::Parameter.

Parameter steht für eine Argumenteingabe für eine Berechnung.

PartitionID

Siehe auch XlaBuilder::BuildPartitionId.

Erstellt partition_id des aktuellen Prozesses.

PartitionID(shape)

Argumente Typ Semantik
shape Shape Form der Daten

PartitionID kann in HLO-Dumps vorkommen, sollte aber nicht manuell von Endnutzern erstellt werden.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – partition_id.

PopulationCount

Siehe auch XlaBuilder::PopulationCount.

Berechnet die Anzahl der Bits, die in jedem Element von operand festgelegt sind.

PopulationCount(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Informationen zu StableHLO finden Sie unter StableHLO – popcnt.

Pow

Siehe auch XlaBuilder::Pow.

Führt die elementweise Potenzierung von lhs mit rhs aus.

Pow(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Pow gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Pow(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Informationen zu StableHLO finden Sie unter StableHLO – power.

Real

Siehe auch XlaBuilder::Real.

Elementweiser Realteil einer komplexen (oder reellen) Form. x -> real(x). Wenn der Operand ein Gleitkommatyp ist, gibt Real denselben Wert zurück.

Real(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – real.

Recv

Siehe auch XlaBuilder::Recv.

Recv, RecvWithTokens und RecvToHost sind Vorgänge, die als Kommunikationsprimitive in HLO dienen. Diese Vorgänge sind in HLO-Dumps in der Regel Teil der Low-Level-Ein-/Ausgabe oder der geräteübergreifenden Übertragung, sie sind jedoch nicht für die manuelle Erstellung durch Endnutzer vorgesehen.

Recv(shape, handle)

Argumente Typ Semantik
shape Shape Form der zu empfangenden Daten
handle ChannelHandle Eindeutige Kennung für jedes Sende-/Empfangspaar

Empfängt Daten der angegebenen Form von einer Send-Anweisung in einer anderen Berechnung, die dasselbe Channel-Handle verwendet. Gibt einen XlaOp für die empfangenen Daten zurück.

Informationen zu StableHLO finden Sie unter StableHLO – recv.

RecvDone

Siehe auch HloInstruction::CreateRecv und HloInstruction::CreateRecvDone.

Ähnlich wie bei Send steht die Client-API des Vorgangs Recv für die synchrone Kommunikation. Die Anweisung wird jedoch intern in zwei HLO-Anweisungen (Recv und RecvDone) zerlegt, um asynchrone Datenübertragungen zu ermöglichen.

Recv(const Shape& shape, int64 channel_id)

Weist Ressourcen zu, die zum Empfangen von Daten aus einem Send-Befehl mit derselben channel_id erforderlich sind. Gibt einen Kontext für die zugewiesenen Ressourcen zurück, der von einer nachfolgenden RecvDone-Anweisung verwendet wird, um auf den Abschluss der Datenübertragung zu warten. Der Kontext ist ein Tupel aus {Empfangspuffer (Form), Anforderungs-ID (U32)} und kann nur von einem RecvDone-Befehl verwendet werden.

Wartet bei einem Kontext, der durch eine Recv-Anweisung erstellt wurde, darauf, dass die Datenübertragung abgeschlossen ist, und gibt die empfangenen Daten zurück.

Einschränken

Siehe auch XlaBuilder::Reduce.

Wendet eine Reduktionsfunktion parallel auf ein oder mehrere Arrays an.

Reduce(operands..., init_values..., computation, dimensions_to_reduce)

Argumente Typ Semantik
operands Sequenz von N XlaOp N Arrays vom Typ T_0,..., T_{N-1}.
init_values Sequenz von N XlaOp N Skalare vom Typ T_0,..., T_{N-1}.
computation XlaComputation Berechnung vom Typ T_0,..., T_{N-1}, T_0, ...,T_{N-1} -> Collate(T_0,..., T_{N-1}).
dimensions_to_reduce int64-Array Ungeordnetes Array mit Dimensionen, die reduziert werden sollen.

Wobei:

  • N muss größer oder gleich 1 sein.
  • Die Berechnung muss „ungefähr“ assoziativ sein (siehe unten).
  • Alle Eingabearrays müssen dieselben Dimensionen haben.
  • Alle Anfangswerte müssen unter computation eine Identität bilden.
  • Wenn N = 1, ist Collate(T) T.
  • Wenn N > 1, ist Collate(T_0, ..., T_{N-1}) ein Tupel aus N-Elementen vom Typ T.

Bei dieser Operation werden eine oder mehrere Dimensionen jedes Eingabearrays in Skalare reduziert. Die Anzahl der Dimensionen jedes zurückgegebenen Arrays ist number_of_dimensions(operand) - len(dimensions). Die Ausgabe des Vorgangs ist Collate(Q_0, ..., Q_N), wobei Q_i ein Array vom Typ T_i ist. Die Dimensionen werden unten beschrieben.

Verschiedene Backends dürfen die Berechnung der Reduzierung neu zuordnen. Dies kann zu numerischen Unterschieden führen, da einige Reduktionsfunktionen wie die Addition für Gleitkommazahlen nicht assoziativ sind. Wenn der Bereich der Daten jedoch begrenzt ist, ist die Gleitkommaaddition für die meisten praktischen Anwendungen assoziativ genug.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – reduce.

Beispiele

Wenn Sie ein eindimensionales Array mit Werten [10, 11, 12, 13] mit der Reduzierungsfunktion f (das ist computation) reduzieren, kann das so berechnet werden:

f(10, f(11, f(12, f(init_value, 13)))

Es gibt aber auch viele andere Möglichkeiten, z.B.:

f(init_value, f(f(10, f(init_value, 11)), f(f(init_value, 12), f(init_value, 13))))

Im Folgenden finden Sie ein grobes Pseudocode-Beispiel für die Implementierung der Reduzierung, wobei die Summe als Reduzierungsberechnung mit einem Anfangswert von 0 verwendet wird.

result_shape <- remove all dims in dimensions from operand_shape

# Iterate over all elements in result_shape. The number of r's here is equal
# to the number of dimensions of the result.
for r0 in range(result_shape[0]), r1 in range(result_shape[1]), ...:
  # Initialize this result element
  result[r0, r1...] <- 0

  # Iterate over all the reduction dimensions
  for d0 in range(dimensions[0]), d1 in range(dimensions[1]), ...:
    # Increment the result element with the value of the operand's element.
    # The index of the operand's element is constructed from all ri's and di's
    # in the right order (by construction ri's and di's together index over the
    # whole operand shape).
    result[r0, r1...] += operand[ri... di]

Hier ein Beispiel für das Reduzieren eines 2D-Arrays (einer Matrix). Die Form hat zwei Dimensionen, Dimension 0 mit der Größe 2 und Dimension 1 mit der Größe 3:

Ergebnisse der Reduzierung von Dimension 0 oder 1 mit einer „add“-Funktion:

Beachten Sie, dass beide Reduzierungsergebnisse eindimensionale Arrays sind. Im Diagramm wird das eine als Spalte und das andere als Zeile dargestellt, um die Übersichtlichkeit zu erhöhen.

Hier ist ein komplexeres Beispiel mit einem 3D-Array. Die Anzahl der Dimensionen ist 3, Dimension 0 hat die Größe 4, Dimension 1 die Größe 2 und Dimension 2 die Größe 3. Der Einfachheit halber werden die Werte 1 bis 6 in Dimension 0 repliziert.

Ähnlich wie beim 2D-Beispiel können wir nur eine Dimension reduzieren. Wenn wir beispielsweise Dimension 0 reduzieren, erhalten wir ein zweidimensionales Array, in dem alle Werte über Dimension 0 in einen Skalar eingefügt wurden:

|  4   8  12 |
| 16  20  24 |

Wenn wir Dimension 2 reduzieren, erhalten wir ebenfalls ein zweidimensionales Array, in dem alle Werte aus Dimension 2 in einen Skalar gefaltet wurden:

| 6  15 |
| 6  15 |
| 6  15 |
| 6  15 |

Die relative Reihenfolge der verbleibenden Dimensionen in der Eingabe wird in der Ausgabe beibehalten. Da sich die Anzahl der Dimensionen ändert, können einigen Dimensionen jedoch neue Zahlen zugewiesen werden.

Wir können auch mehrere Dimensionen reduzieren. Wenn Sie die Dimensionen 0 und 1 reduzieren, erhalten Sie das 1D-Array [20, 28, 36].

Wenn das 3D-Array über alle Dimensionen hinweg reduziert wird, ergibt sich der Skalar 84.

Variadic Reduce

Bei N > 1 ist die Anwendung der Reduce-Funktion etwas komplexer, da sie gleichzeitig auf alle Eingaben angewendet wird. Die Operanden werden in der folgenden Reihenfolge für die Berechnung bereitgestellt:

  • Ausführen des reduzierten Werts für den ersten Operanden
  • Reduzierter Wert für den N-ten Operanden wird ausgeführt
  • Eingabewert für den ersten Operanden
  • Eingabewert für den N-ten Operanden

Betrachten Sie beispielsweise die folgende Reduzierungsfunktion, mit der das Maximum und das Argmax eines eindimensionalen Arrays parallel berechnet werden können:

f: (Float, Int, Float, Int) -> Float, Int
f(max, argmax, value, index):
  if value >= max:
    return (value, index)
  else:
    return (max, argmax)

Für 1‑D-Eingabearrays V = Float[N], K = Int[N] und Initialisierungswerte I_V = Float, I_K = Int entspricht das Ergebnis f_(N-1) der Reduzierung über die einzige Eingabedimension der folgenden rekursiven Anwendung:

f_0 = f(I_V, I_K, V_0, K_0)
f_1 = f(f_0.first, f_0.second, V_1, K_1)
...
f_(N-1) = f(f_(N-2).first, f_(N-2).second, V_(N-1), K_(N-1))

Wenn diese Reduzierung auf ein Array von Werten und ein Array von sequenziellen Indexen (d.h. iota) angewendet wird, werden die Arrays gemeinsam durchlaufen und ein Tupel mit dem Maximalwert und dem entsprechenden Index zurückgegeben.

ReducePrecision

Siehe auch XlaBuilder::ReducePrecision.

Modelliert die Auswirkungen der Konvertierung von Gleitkommawerten in ein Format mit niedrigerer Genauigkeit (z. B. IEEE-FP16) und zurück in das ursprüngliche Format. Die Anzahl der Exponenten- und Mantissenbits im Format mit niedrigerer Genauigkeit kann beliebig angegeben werden. Allerdings werden möglicherweise nicht alle Bitgrößen auf allen Hardwareimplementierungen unterstützt.

ReducePrecision(operand, exponent_bits, mantissa_bits)

Argumente Typ Semantik
operand XlaOp Array vom Gleitkommatyp T.
exponent_bits int32 Anzahl der Exponentenbits im Format mit geringerer Genauigkeit
mantissa_bits int32 Anzahl der Mantissenbits im Format mit niedrigerer Genauigkeit

Das Ergebnis ist ein Array vom Typ T. Die Eingabewerte werden auf den nächsten Wert gerundet, der mit der angegebenen Anzahl von Mantissenbits dargestellt werden kann (mit der Semantik „ties to even“). Alle Werte, die den durch die Anzahl der Exponentenbits angegebenen Bereich überschreiten, werden auf „positive“ oder „negative infinity“ (plus oder minus unendlich) begrenzt. NaN-Werte werden beibehalten, können aber in kanonische NaN-Werte umgewandelt werden.

Das Format mit niedrigerer Genauigkeit muss mindestens ein Exponentenbit haben, um einen Nullwert von einem Unendlichwert zu unterscheiden, da beide eine Nullmantisse haben. Außerdem muss es eine nicht negative Anzahl von Mantissenbits haben. Die Anzahl der Exponenten- oder Mantissenbits kann den entsprechenden Wert für den Typ T überschreiten. Der entsprechende Teil der Konvertierung ist dann einfach ein No-Op.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – reduce_precision.

ReduceScatter

Siehe auch XlaBuilder::ReduceScatter.

„ReduceScatter“ ist ein kollektiver Vorgang, der effektiv „AllReduce“ ausführt und das Ergebnis dann aufteilt, indem es in shard_count Blöcke entlang der scatter_dimension aufgeteilt wird. Die Replik i in der Replikgruppe empfängt den ith-Shard.

ReduceScatter(operand, computation, scatter_dimension, shard_count, replica_groups, channel_id, layout, use_global_device_ids)

Argumente Typ Semantik
operand XlaOp Array oder nicht leeres Tupel von Arrays, die über Replikate hinweg reduziert werden sollen.
computation XlaComputation Berechnung der Reduzierung
scatter_dimension int64 Dimension für die Streuung.
shard_count int64 Anzahl der Blöcke, auf die scatter_dimension aufgeteilt werden soll
replica_groups ReplicaGroup vector Gruppen, zwischen denen die Reduzierungen vorgenommen werden
channel_id optional ChannelHandle Optionale Kanal-ID für die modulübergreifende Kommunikation
layout optional Layout Vom Nutzer angegebenes Speicherlayout
use_global_device_ids optional bool Vom Nutzer angegebenes Flag
  • Wenn operand ein Tupel von Arrays ist, wird die Reduce-Scatter-Operation für jedes Element des Tupels ausgeführt.
  • replica_groups ist eine Liste von Replikagruppen, zwischen denen die Reduzierung erfolgt. Die Replikat-ID für das aktuelle Replikat kann mit ReplicaId abgerufen werden. Die Reihenfolge der Replikate in jeder Gruppe bestimmt die Reihenfolge, in der das All-Reduce-Ergebnis verteilt wird. replica_groups muss entweder leer sein (in diesem Fall gehören alle Replikate zu einer einzelnen Gruppe) oder dieselbe Anzahl an Elementen wie die Anzahl der Replikate enthalten. Wenn es mehrere Replikagruppen gibt, müssen sie alle dieselbe Größe haben. Bei replica_groups = {0, 2}, {1, 3} wird beispielsweise eine Reduzierung zwischen den Replikaten 0 und 2 sowie 1 und 3 durchgeführt und das Ergebnis dann verteilt.
  • shard_count ist die Größe jeder Replikagruppe. Wir benötigen diese Informationen, wenn replica_groups leer ist. Wenn replica_groups nicht leer ist, muss shard_count der Größe jeder Replikagruppe entsprechen.
  • channel_id wird für die modulübergreifende Kommunikation verwendet: Nur reduce-scatter-Vorgänge mit demselben channel_id können miteinander kommunizieren.
  • layout Weitere Informationen zu Layouts finden Sie unter xla::shapes.
  • use_global_device_ids ist ein vom Nutzer angegebenes Flag. Wenn false(Standard) verwendet wird, sind die Zahlen in replica_groups ReplicaId. Wenn true verwendet wird, stellen die replica_groups eine globale ID von (ReplicaID*partition_count + partition_id) dar. Beispiel:
    • Bei 2 Replikaten und 4 Partitionen
    • replica_groups={ {0,1,4,5},{2,3,6,7} } and use_global_device_ids=true
    • group[0] = (0,0), (0,1), (1,0), (1,1)
    • group[1] = (0,2), (0,3), (1,2), (1,3)
    • Dabei ist jedes Paar (replica_id, partition_id).

Die Ausgabedimensionen entsprechen den Eingabedimensionen, wobei die scatter_dimension-Dimension shard_count-mal kleiner ist. Wenn es beispielsweise zwei Replikate gibt und der Operand auf den beiden Replikaten die Werte [1.0, 2.25] bzw. [3.0, 5.25] hat, ist der Ausgabewert dieses Vorgangs, bei dem scatter_dim gleich 0 ist, [4.0] für das erste Replikat und [7.5] für das zweite Replikat.

Informationen zu StableHLO finden Sie unter StableHLO – reduce_scatter.

ReduceScatter – Beispiel 1 – StableHLO

Beispiel für ReduceScatter-Dataflow für StableHLO

Im obigen Beispiel sind zwei Replikate am ReduceScatter beteiligt. Auf jedem Replikat hat der Operand die Form f32[2,4]. Auf den Replikaten wird eine All-Reduce-Operation (Summe) ausgeführt, die auf jedem Replikat einen reduzierten Wert der Form f32[2,4] erzeugt. Dieser reduzierte Wert wird dann entlang der Dimension 1 in zwei Teile aufgeteilt, sodass jeder Teil die Form f32[2,2] hat. Jedes Replikat in der Prozessgruppe erhält den Teil, der seiner Position in der Gruppe entspricht. Daher hat die Ausgabe auf jedem Replikat die Form f32[2,2].

ReduceWindow

Siehe auch XlaBuilder::ReduceWindow.

Wendet eine Reduktionsfunktion auf alle Elemente in jedem Fenster einer Sequenz von N mehrdimensionalen Arrays an und gibt ein einzelnes oder ein Tupel von N mehrdimensionalen Arrays aus. Jedes Ausgabearray hat dieselbe Anzahl von Elementen wie die Anzahl der gültigen Positionen des Fensters. Ein Pooling-Layer kann als ReduceWindow ausgedrückt werden. Ähnlich wie bei Reduce wird die angewendete computation immer links von der init_values übergeben.

ReduceWindow(operands..., init_values..., computation, window_dimensions, window_strides, padding)

Argumente Typ Semantik
operands N XlaOps Eine Sequenz von N mehrdimensionalen Arrays vom Typ T_0,..., T_{N-1}, die jeweils die Grundfläche darstellen, auf der das Fenster platziert wird.
init_values N XlaOps Die N Startwerte für die Reduzierung, einer für jeden der N Operanden. Weitere Informationen finden Sie unter Reduzieren.
computation XlaComputation Reduktionsfunktion vom Typ T_0, ..., T_{N-1}, T_0, ..., T_{N-1} -> Collate(T_0, ..., T_{N-1}), die auf Elemente in jedem Fenster aller Eingabeoperanden angewendet werden soll.
window_dimensions ArraySlice<int64> Array von Ganzzahlen für Fensterdimensionswerte
window_strides ArraySlice<int64> Array von Ganzzahlen für Fenster-Stride-Werte
base_dilations ArraySlice<int64> Array von Ganzzahlen für die Basis-Dilation-Werte
window_dilations ArraySlice<int64> Array von Ganzzahlen für die Werte der Fenstererweiterung
padding Padding Padding-Typ für das Fenster (Padding::kSame, das so aufgefüllt wird, dass die Ausgabegröße bei einem Stride von 1 mit der Eingabegröße übereinstimmt, oder Padding::kValid, bei dem keine Auffüllung verwendet wird und das Fenster „angehalten“ wird, sobald es nicht mehr passt)

Wobei:

  • N muss größer oder gleich 1 sein.
  • Alle Eingabearrays müssen dieselben Dimensionen haben.
  • Wenn N = 1, ist Collate(T) T.
  • Wenn N > 1, ist Collate(T_0, ..., T_{N-1}) ein Tupel aus N-Elementen vom Typ (T0,...T{N-1}).

Weitere Informationen zu StableHLO finden Sie unter StableHLO – reduce_window.

ReduceWindow – Beispiel 1

Die Eingabe ist eine Matrix der Größe [4x6] und sowohl window_dimensions als auch window_stride_dimensions sind [2x3].

// Create a computation for the reduction (maximum).
XlaComputation max;
{
  XlaBuilder builder(client_, "max");
  auto y = builder.Parameter(0, ShapeUtil::MakeShape(F32, {}), "y");
  auto x = builder.Parameter(1, ShapeUtil::MakeShape(F32, {}), "x");
  builder.Max(y, x);
  max = builder.Build().value();
}

// Create a ReduceWindow computation with the max reduction computation.
XlaBuilder builder(client_, "reduce_window_2x3");
auto shape = ShapeUtil::MakeShape(F32, {4, 6});
auto input = builder.Parameter(0, shape, "input");
builder.ReduceWindow(
    input,
    /*init_val=*/builder.ConstantLiteral(LiteralUtil::MinValue(F32)),
    *max,
    /*window_dimensions=*/{2, 3},
    /*window_stride_dimensions=*/{2, 3},
    Padding::kValid);

Ein Stride von 1 in einer Dimension gibt an, dass die Position eines Fensters in der Dimension 1 Element vom benachbarten Fenster entfernt ist. Wenn Sie angeben möchten, dass sich keine Fenster überlappen, muss window_stride_dimensions gleich window_dimensions sein. Die Abbildung unten veranschaulicht die Verwendung von zwei verschiedenen Schrittwerten. Padding wird auf jede Dimension der Eingabe angewendet. Die Berechnungen sind dieselben, als ob die Eingabe mit den Dimensionen erfolgt wäre, die sie nach dem Padding hat.

Ein nicht triviales Beispiel für Padding ist die Berechnung des Minimums im Reduzierungsfenster (Anfangswert ist MAX_FLOAT) mit Dimension 3 und Schrittweite 2 für das Eingabearray [10000, 1000, 100, 10, 1]. Beim Padding kValid werden die Minima für zwei gültige Fenster berechnet: [10000, 1000, 100] und [100, 10, 1]. Das Ergebnis ist [100, 1]. Beim Padding kSame wird das Array zuerst so aufgefüllt, dass die Form nach dem Reduce-Window dieselbe wie die Eingabe für den Stride 1 ist. Dazu werden auf beiden Seiten anfängliche Elemente hinzugefügt, sodass [MAX_VALUE, 10000, 1000, 100, 10, 1, MAX_VALUE] entsteht. Wenn Sie „reduce-window“ auf das aufgefüllte Array anwenden, werden drei Fenster [MAX_VALUE, 10000, 1000], [1000, 100, 10] und [10, 1, MAX_VALUE] verarbeitet und [1000, 10, 1] wird ausgegeben.

Die Auswertungsreihenfolge der Reduktionsfunktion ist beliebig und möglicherweise nicht deterministisch. Daher sollte die Reduktionsfunktion nicht zu empfindlich auf eine erneute Zuordnung reagieren. Weitere Informationen finden Sie in der Diskussion zur Assoziativität im Kontext von Reduce.

ReduceWindow – Beispiel 2 – StableHLO

Beispiel für den Dataflow von ReduceWindow für StableHLO

Im obigen Beispiel:

Eingabe: Der Operand hat die Eingabeform S32[3,2]. Mit den Werten [[1,2],[3,4],[5,6]]

Schritt 1: Durch die Basis-Dilation mit dem Faktor 2 entlang der Zeilendimension werden Lücken zwischen den einzelnen Zeilen des Operanden eingefügt. Nach der Erweiterung wird oben ein Padding von zwei Zeilen und unten ein Padding von einer Zeile angewendet. Dadurch wird der Tensor höher.

Schritt 2: Es wird ein Fenster mit der Form [2,1] und der Fenstererweiterung [3,1] definiert. Das bedeutet, dass in jedem Fenster zwei Elemente aus derselben Spalte ausgewählt werden. Das zweite Element befindet sich jedoch drei Zeilen unter dem ersten und nicht direkt darunter.

Schritt 3: Die Fenster werden dann mit dem Stride [4,1] über den Operanden geschoben. Dadurch wird das Fenster jeweils um vier Zeilen nach unten und um eine Spalte horizontal verschoben. Die Auffüllzellen werden mit init_value (in diesem Fall init_value = 0) gefüllt. Werte, die in die Dilation-Zellen fallen, werden ignoriert. Aufgrund von Schrittweite und Padding überlappen sich einige Fenster nur mit Nullen und Lücken, während andere sich mit echten Eingabewerten überlappen.

Schritt 4: Innerhalb jedes Fensters werden die Elemente mithilfe der Reduzierungsfunktion (a, b) → a + b kombiniert, beginnend mit dem Startwert 0. In den beiden oberen Fenstern sind nur Padding und Löcher zu sehen, daher sind die Ergebnisse 0. In den unteren Fenstern werden die Werte 3 und 4 aus der Eingabe erfasst und als Ergebnisse zurückgegeben.

Ergebnisse) Die endgültige Ausgabe hat die Form S32[2,2] mit den Werten: [[0,0],[3,4]]

Rem

Siehe auch XlaBuilder::Rem.

Berechnet den elementweisen Rest von Dividend lhs und Divisor rhs.

Das Vorzeichen des Ergebnisses wird vom Dividenden übernommen und der absolute Wert des Ergebnisses ist immer kleiner als der absolute Wert des Divisors.

Rem(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Rem gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Rem(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – remainder.

ReplicaId

Siehe auch XlaBuilder::ReplicaId.

Gibt die eindeutige ID (U32-Skalar) des Replikats zurück.

ReplicaId()

Die eindeutige ID jedes Replikats ist eine Ganzzahl ohne Vorzeichen im Intervall [0, N), wobei N die Anzahl der Replikate ist. Da auf allen Replikaten dasselbe Programm ausgeführt wird, gibt ein ReplicaId()-Aufruf im Programm auf jedem Replikat einen anderen Wert zurück.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – replica_id.

Umformen

Siehe auch XlaBuilder::Reshape. und den Vorgang Collapse.

Ändert die Dimensionen eines Arrays in eine neue Konfiguration.

Reshape(operand, dimensions)

Argumente Typ Semantik
operand XlaOp Array vom Typ T
dimensions int64 vector Vektor der Größen der neuen Dimensionen

Konzeptionell wird bei „reshape“ zuerst ein Array in einen eindimensionalen Vektor von Datenwerten umgewandelt und dann in eine neue Form gebracht. Die Eingabeargumente sind ein beliebiges Array vom Typ T, ein Compile-Zeitkonstantenvektor mit Dimensionsindexen und ein Compile-Zeitkonstantenvektor mit Dimensionsgrößen für das Ergebnis. Der dimensions-Vektor bestimmt die Größe des Ausgabearrays. Der Wert an Index 0 in dimensions ist die Größe von Dimension 0, der Wert an Index 1 ist die Größe von Dimension 1 usw. Das Produkt der dimensions-Dimensionen muss dem Produkt der Dimensionsgrößen des Operanden entsprechen. Wenn das reduzierte Array in das mehrdimensionale Array umgewandelt wird, das durch dimensions definiert ist, werden die Dimensionen in dimensions von der langsamsten (wichtigsten) zur schnellsten (unwichtigsten) Variation sortiert.

Sei v beispielsweise ein Array mit 24 Elementen:

let v = f32[4x2x3] { { {10, 11, 12}, {15, 16, 17} },
                    { {20, 21, 22}, {25, 26, 27} },
                    { {30, 31, 32}, {35, 36, 37} },
                    { {40, 41, 42}, {45, 46, 47} } };

let v012_24 = Reshape(v, {24});
then v012_24 == f32[24] {10, 11, 12, 15, 16, 17, 20, 21, 22, 25, 26, 27,
                         30, 31, 32, 35, 36, 37, 40, 41, 42, 45, 46, 47};

let v012_83 = Reshape(v, {8,3});
then v012_83 == f32[8x3] { {10, 11, 12}, {15, 16, 17},
                          {20, 21, 22}, {25, 26, 27},
                          {30, 31, 32}, {35, 36, 37},
                          {40, 41, 42}, {45, 46, 47} };

Als Sonderfall kann mit „reshape“ ein Array mit einem Element in einen Skalar und umgekehrt umgewandelt werden. Beispiel:

Reshape(f32[1x1] { {5} }, {}) == 5;
Reshape(5, {1,1}) == f32[1x1] { {5} };

Weitere Informationen zu StableHLO finden Sie unter StableHLO – reshape.

Umformen (explizit)

Siehe auch XlaBuilder::Reshape.

Reshape(shape, operand)

„Reshape“-Vorgang, bei dem eine explizite Zielform verwendet wird.

Argumente Typ Semantik
shape Shape Ausgabeform vom Typ T
operand XlaOp Array vom Typ T

Rev (reverse)

Siehe auch XlaBuilder::Rev.

Rev(operand, dimensions)

Argumente Typ Semantik
operand XlaOp Array vom Typ T
dimensions ArraySlice<int64> Umzukehrende Dimensionen

Kehrt die Reihenfolge der Elemente im operand-Array entlang der angegebenen dimensions um und generiert ein Ausgabearray mit derselben Form. Jedes Element des Operanden-Arrays an einem mehrdimensionalen Index wird im Ausgabearray an einem transformierten Index gespeichert. Der mehrdimensionale Index wird transformiert, indem der Index in jeder umzukehrenden Dimension umgekehrt wird. Wenn eine Dimension der Größe N eine der umzukehrenden Dimensionen ist, wird ihr Index i in N – 1 – i transformiert.

Eine Anwendung für den Rev-Vorgang besteht darin, das Faltungs-Gewichts-Array während der Gradientenberechnung in neuronalen Netzwerken entlang der beiden Fensterdimensionen umzukehren.

Informationen zu StableHLO finden Sie unter StableHLO – reverse.

RngNormal

Siehe auch XlaBuilder::RngNormal.

Erstellt eine Ausgabe mit einer bestimmten Form mit Zufallszahlen, die gemäß der \(N(\mu, \sigma)\) Normalverteilung generiert werden. Die Parameter \(\mu\) und \(\sigma\)sowie die Ausgabedimension müssen einen Gleitkomma-Elementtyp haben. Die Parameter müssen außerdem skalare Werte haben.

RngNormal(mu, sigma, shape)

Argumente Typ Semantik
mu XlaOp Skalar vom Typ T, der den Mittelwert der generierten Zahlen angibt
sigma XlaOp Skalar vom Typ T, der die Standardabweichung der generierten
shape Shape Ausgabeform vom Typ T

Weitere Informationen zu StableHLO finden Sie unter StableHLO – rng.

RngUniform

Siehe auch XlaBuilder::RngUniform.

Erstellt eine Ausgabe mit einer bestimmten Form mit Zufallszahlen, die gemäß der Gleichverteilung über dem Intervall \([a,b)\)generiert werden. Die Parameter und der Ausgabeelementtyp müssen ein boolescher Typ, ein integraler Typ oder ein Gleitkommatyp sein und die Typen müssen konsistent sein. Die CPU- und GPU-Back-Ends unterstützen derzeit nur F64, F32, F16, BF16, S64, U64, S32 und U32. Außerdem müssen die Parameter skalare Werte haben. Wenn \(b <= a\) das Ergebnis ist, wird es durch die Implementierung definiert.

RngUniform(a, b, shape)

Argumente Typ Semantik
a XlaOp Skalar vom Typ T, der die Untergrenze des Intervalls angibt
b XlaOp Skalar vom Typ T, der die Obergrenze des Intervalls angibt
shape Shape Ausgabeform vom Typ T

Weitere Informationen zu StableHLO finden Sie unter StableHLO – rng.

RngBitGenerator

Siehe auch XlaBuilder::RngBitGenerator.

Generiert eine Ausgabe mit einer bestimmten Form, die mit gleichmäßig zufälligen Bits gefüllt ist, wobei der angegebene Algorithmus (oder das Backend-Standardverfahren) verwendet wird. Gibt einen aktualisierten Zustand (mit derselben Form wie der Anfangszustand) und die generierten Zufallsdaten zurück.

„Initial state“ ist der Ausgangszustand der aktuellen Zufallszahlengenerierung. Die Form und die gültigen Werte hängen vom verwendeten Algorithmus ab.

Die Ausgabe ist garantiert eine deterministische Funktion des Anfangszustands, aber sie ist nicht garantiert deterministisch zwischen Backends und verschiedenen Compilerversionen.

RngBitGenerator(algorithm, initial_state, shape)

Argumente Typ Semantik
algorithm RandomAlgorithm Der zu verwendende PRNG-Algorithmus.
initial_state XlaOp Anfangszustand für den PRNG-Algorithmus.
shape Shape Ausgabeform für generierte Daten.

Verfügbare Werte für algorithm:

Weitere Informationen zu StableHLO finden Sie unter StableHLO – rng_bit_generator.

RngGetAndUpdateState

Siehe auch HloInstruction::CreateRngGetAndUpdateState.

Die API der verschiedenen Rng-Operationen wird intern in HLO-Anweisungen zerlegt, einschließlich RngGetAndUpdateState.

RngGetAndUpdateState dient als Primitiv in HLO. Diese Operation kann in HLO-Dumps enthalten sein, sie ist jedoch nicht für die manuelle Erstellung durch Endnutzer vorgesehen.

Runde

Siehe auch XlaBuilder::Round.

Elementweise Rundung, Bindungen von null weg.

Round(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

RoundNearestAfz

Siehe auch XlaBuilder::RoundNearestAfz.

Führt eine elementweise Rundung zur nächsten Ganzzahl durch, wobei bei Gleichstand von null weg gerundet wird.

RoundNearestAfz(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – round_nearest_afz.

RoundNearestEven

Siehe auch XlaBuilder::RoundNearestEven.

Elementweise Rundung, bei Gleichstand wird auf die nächste gerade Zahl gerundet.

RoundNearestEven(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – round_nearest_even.

Rsqrt

Siehe auch XlaBuilder::Rsqrt.

Elementweise Reziprok-Operation der Quadratwurzel x -> 1.0 / sqrt(x).

Rsqrt(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Rsqrt unterstützt auch das optionale Argument result_accuracy:

Rsqrt(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Informationen zu StableHLO finden Sie unter StableHLO – rsqrt.

Scannen

Siehe auch XlaBuilder::Scan.

Wendet eine Reduzierungsfunktion auf ein Array über eine bestimmte Dimension an und erzeugt einen Endzustand und ein Array von Zwischenwerten.

Scan(inputs..., inits..., to_apply, scan_dimension, is_reverse, is_associative)

Argumente Typ Semantik
inputs Reihenfolge der m-XlaOps Die zu durchsuchenden Arrays.
inits Reihenfolge der k-XlaOps Erste Übertragungen
to_apply XlaComputation Berechnung vom Typ i_0, ..., i_{m-1}, c_0, ..., c_{k-1} -> (o_0, ..., o_{n-1}, c'_0, ..., c'_{k-1}).
scan_dimension int64 Die Dimension, die gescannt werden soll.
is_reverse bool Bei „true“ wird in umgekehrter Reihenfolge gescannt.
is_associative bool (Tri-State) Wenn „true“, ist der Vorgang assoziativ.

Die Funktion to_apply wird sequenziell auf Elemente in inputs entlang scan_dimension angewendet. Wenn is_reverse „false“ ist, werden die Elemente in der Reihenfolge 0 bis N-1 verarbeitet, wobei N die Größe von scan_dimension ist. Wenn is_reverse „true“ ist, werden Elemente von N-1 bis 0 verarbeitet.

Die to_apply-Funktion verwendet m + k Operanden:

  1. m aktuelle Elemente aus inputs.
  2. k – Übertragen Sie Werte aus dem vorherigen Schritt (oder inits für das erste Element).

Die Funktion to_apply gibt ein Tupel von n + k-Werten zurück:

  1. n-Elemente von outputs.
  2. k neue Übertragungswerte.

Der Scanvorgang erzeugt ein Tupel von n + k-Werten:

  1. Die n-Ausgabearrays mit den Ausgabewerten für jeden Schritt.
  2. Die endgültigen k-Übertragswerte nach der Verarbeitung aller Elemente.

Die Typen der m-Eingaben müssen mit den Typen der ersten m-Parameter von to_apply übereinstimmen, wobei eine zusätzliche Scan-Dimension hinzukommt. Die Typen der n-Ausgaben müssen mit den Typen der ersten n-Rückgabewerte von to_apply übereinstimmen, wobei eine zusätzliche Scan-Dimension hinzukommt. Die zusätzliche Scan-Dimension muss für alle Ein- und Ausgaben dieselbe Größe N haben. Die Typen der letzten k-Parameter und Rückgabewerte von to_apply sowie die k-Initialisierungen müssen übereinstimmen.

Beispiel (m, n, k == 1, N == 3): Für den ersten Übertrag i, die Eingabe [a, b, c], die Funktion f(x, c) -> (y, c') und scan_dimension=0, is_reverse=false:

  • Schritt 0: f(a, i) -> (y0, c0)
  • Schritt 1: f(b, c0) -> (y1, c1)
  • Schritt 2: f(c, c1) -> (y2, c2)

Die Ausgabe von Scan ist ([y0, y1, y2], c2).

Streudiagramm

Siehe auch XlaBuilder::Scatter.

Der XLA-Scatter-Vorgang generiert eine Folge von Ergebnissen, die die Werte des Eingabearrays operands sind. Dabei werden mehrere Slices (an den durch scatter_indices angegebenen Indexen) mit der Folge von Werten in updates aktualisiert, wobei update_computation verwendet wird.

Scatter(operands..., scatter_indices, updates..., update_computation, dimension_numbers, indices_are_sorted, unique_indices)

Argumente Typ Semantik
operands Sequenz von N XlaOp N Arrays vom Typ T_0, ..., T_N, in die die Daten verteilt werden sollen.
scatter_indices XlaOp Array mit den Startindexen der Segmente, die verteilt werden müssen.
updates Sequenz von N XlaOp N Arrays vom Typ T_0, ..., T_N. updates[i] enthält die Werte, die für die Streuung von operands[i] verwendet werden müssen.
update_computation XlaComputation Berechnung, die zum Kombinieren der vorhandenen Werte im Eingabearray und der Aktualisierungen während des Scatter-Vorgangs verwendet werden soll. Diese Berechnung sollte vom Typ T_0, ..., T_N, T_0, ..., T_N -> Collate(T_0, ..., T_N) sein.
index_vector_dim int64 Die Dimension in scatter_indices, die die Startindexe enthält.
update_window_dims ArraySlice<int64> Die Menge der Dimensionen in updates-Form, die Fensterdimensionen sind.
inserted_window_dims ArraySlice<int64> Die Menge der Fensterdimensionen, die in die updates-Form eingefügt werden müssen.
scatter_dims_to_operand_dims ArraySlice<int64> Eine Dimensionszuordnung von den Scatter-Indizes zum Operandenindexbereich. Dieses Array wird als Zuordnung von i zu scatter_dims_to_operand_dims[i] interpretiert . Sie muss eineindeutig und total sein.
dimension_number ScatterDimensionNumbers Dimensionsnummern für den Scatter-Vorgang
indices_are_sorted bool Gibt an, ob die Indexe garantiert vom Aufrufer sortiert werden.
unique_indices bool Gibt an, ob die Indexe vom Aufrufer garantiert eindeutig sind.

Wobei:

  • N muss größer oder gleich 1 sein.
  • operands[0], ..., operands[N-1] müssen alle dieselben Dimensionen haben.
  • updates[0], ..., updates[N-1] müssen alle dieselben Dimensionen haben.
  • Wenn N = 1, ist Collate(T) T.
  • Wenn N > 1, ist Collate(T_0, ..., T_N) ein Tupel aus N-Elementen vom Typ T.

Wenn index_vector_dim gleich scatter_indices.rank ist, gehen wir implizit davon aus, dass scatter_indices eine nachgestellte 1-Dimension hat.

Wir definieren update_scatter_dims vom Typ ArraySlice<int64> als die Menge der Dimensionen in updates-Form, die nicht in update_window_dims enthalten sind, in aufsteigender Reihenfolge.

Die Argumente von „scatter“ müssen die folgenden Einschränkungen erfüllen:

  • Jedes updates-Array muss update_window_dims.size + scatter_indices.rank - 1 Dimensionen haben.

  • Die Grenzen der Dimension i in jedem updates-Array müssen den folgenden Anforderungen entsprechen:

    • Wenn i in update_window_dims vorhanden ist (d.h. für ein bestimmtes k gleich update_window_dims[k]), darf die Grenze der Dimension i in updates die entsprechende Grenze von operand nach Berücksichtigung von inserted_window_dims nicht überschreiten (d.h. adjusted_window_bounds[k], wobei adjusted_window_bounds die Grenzen von operand mit den Grenzen an den Indexpositionen inserted_window_dims enthält).
    • Wenn i in update_scatter_dims vorhanden ist (d.h. für ein bestimmtes k gleich update_scatter_dims[k]), muss die Grenze der Dimension i in updates gleich der entsprechenden Grenze von scatter_indices sein, wobei index_vector_dim übersprungen wird (d.h. scatter_indices.shape.dims[k], wenn k < index_vector_dim, und scatter_indices.shape.dims[k+1] andernfalls).
  • update_window_dims muss in aufsteigender Reihenfolge vorliegen, darf keine sich wiederholenden Dimensionsnummern enthalten und muss im Bereich [0, updates.rank) liegen.

  • inserted_window_dims muss in aufsteigender Reihenfolge vorliegen, darf keine sich wiederholenden Dimensionsnummern enthalten und muss im Bereich [0, operand.rank) liegen.

  • operand.rank muss der Summe von update_window_dims.size und inserted_window_dims.size entsprechen.

  • scatter_dims_to_operand_dims.size muss gleich scatter_indices.shape.dims[index_vector_dim] sein und seine Werte müssen im Bereich [0, operand.rank) liegen.

Für einen bestimmten Index U in jedem updates-Array wird der entsprechende Index I im entsprechenden operands-Array, in dem dieses Update angewendet werden muss, so berechnet:

  1. Sei G = { U[k] für k in update_scatter_dims }. Verwenden Sie G, um einen Indexvektor S im Array scatter_indices zu suchen, sodass S[i] = scatter_indices[Combine(G, i)], wobei Combine(A, b) b an den Positionen index_vector_dim in A einfügt.
  2. Erstellen Sie einen Index Sin in operand, indem Sie S mithilfe der scatter_dims_to_operand_dims-Karte streuen.S Formeller:
    1. Sin[scatter_dims_to_operand_dims[k]] = S[k], wenn k < scatter_dims_to_operand_dims.size.
    2. Sin[_] = 0 andernfalls.
  3. Erstellt einen Index Win in jedem operands-Array, indem die Indexe bei update_window_dims in U gemäß inserted_window_dims verteilt werden. Formeller:
    1. Win[window_dims_to_operand_dims(k)] = U[k], wenn k in update_window_dims ist, wobei window_dims_to_operand_dims die monotone Funktion mit dem Definitionsbereich [0, update_window_dims.size) und dem Wertebereich [0, operand.rank) \ inserted_window_dims ist. Wenn beispielsweise update_window_dims.size gleich 4, operand.rank gleich 6 und inserted_window_dims gleich {0, 2} ist, dann ist window_dims_to_operand_dims gleich {01, 13, 24, 35}).
    2. Win[_] = 0 andernfalls.
  4. I ist Win + Sin, wobei + die elementweise Addition ist.

Zusammenfassend lässt sich der Scatter-Vorgang so definieren:

  • Initialisieren Sie output mit operands, d.h. für alle Indexe J, für alle Indexe O im Array operands[J]:
    output[J][O] = operands[J][O]
  • Für jeden Index U im Array updates[J] und den entsprechenden Index O im Array operand[J] gilt: Wenn O ein gültiger Index für output ist, dann
    (output[0][O], ..., output[N-1][O]) = update_computation(output[0][O], ..., output[N-1][O], updates[0][U], ..., updates[N-1][U])(output

Die Reihenfolge, in der Updates angewendet werden, ist nicht deterministisch. Wenn also mehrere Indexe in updates auf denselben Index in operands verweisen, ist der entsprechende Wert in output nicht deterministisch.

Der erste Parameter, der an update_computation übergeben wird, ist immer der aktuelle Wert aus dem Array output und der zweite Parameter ist immer der Wert aus dem Array updates. Das ist besonders wichtig, wenn die update_computation nicht kommutativ ist.

Wenn indices_are_sorted auf „true“ gesetzt ist, kann XLA davon ausgehen, dass scatter_indices vom Nutzer sortiert wurden (in aufsteigender Reihenfolge, nachdem die Werte gemäß scatter_dims_to_operand_dims verteilt wurden). Andernfalls sind die Semantik implementierungsdefiniert.

Wenn unique_indices auf „true“ gesetzt ist, kann XLA davon ausgehen, dass alle verteilten Elemente eindeutig sind. Daher konnte XLA nicht atomare Vorgänge verwenden. Wenn unique_indices auf „true“ gesetzt ist und die Indizes, auf die verteilt wird, nicht eindeutig sind, ist die Semantik implementierungsdefiniert.

Der Scatter-Vorgang kann informell als Umkehrung des Gather-Vorgangs betrachtet werden. Das heißt, der Scatter-Vorgang aktualisiert die Elemente in der Eingabe, die vom entsprechenden Gather-Vorgang extrahiert werden.

Eine detaillierte informelle Beschreibung und Beispiele finden Sie im Abschnitt „Informelle Beschreibung“ unter Gather.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – scatter.

Scatter – Beispiel 1 – StableHLO

Beispiel für einen Scatter-Dataflow für StableHLO

Im Bild oben ist jede Zeile der Tabelle ein Beispiel für einen Aktualisierungsindex. Sehen wir uns die einzelnen Schritte von links(Index aktualisieren) nach rechts(Ergebnisindex) an:

Die Eingabe input hat die Form S32[2,3,4,2]. scatter_indices hat die Form S64[2,2,3,2]. updates hat die Form S32[2,2,3,1,2].

Update Index) As part of the input we are given update_window_dims:[3,4]. Das bedeutet, dass die Dimensionen 3 und 4 von updates Fensterdimensionen sind, die gelb hervorgehoben werden. Daraus lässt sich ableiten, dass update_scatter_dims = [0,1,2].

Update Scatter Index) Shows us the extracted updated_scatter_dims for each. (Der nicht gelbe Teil der Spalte „Update Index“)

Startindex: Wenn wir uns das scatter_indices-Tensorbild ansehen, sehen wir, dass die Werte aus dem vorherigen Schritt (Update scatter Index) uns die Position des Startindex liefern. Aus index_vector_dim geht auch die Dimension des starting_indices hervor, die die Startindexe enthält. Für scatter_indices ist das Dimension 3 mit der Größe 2.

Der vollständige Startindex scatter_dims_to_operand_dims = [2,1] gibt an, dass das erste Element des Indexvektors in die Operandendimension 2 geht. Das zweite Element des Indexvektors wird auf die Operandendimension 1 angewendet. Die verbleibenden Operanden-Dimensionen werden mit 0 gefüllt.

Vollständiger Batching-Index: Der lila hervorgehobene Bereich wird in dieser Spalte(vollständiger Batching-Index), der Spalte „Update-Scatter-Index“ und der Spalte „Update-Index“ angezeigt.

Vollfensterindex) Berechnet aus dem update_window_dimensions [3,4].

Ergebnisindex: Die Summe aus dem Index für den vollständigen Start, dem Index für das vollständige Batching und dem Index für den vollständigen Zeitraum im operand-Tensor. Die grün hervorgehobenen Regionen entsprechen ebenfalls der Abbildung operand. Die letzte Zeile wird übersprungen, da sie außerhalb des operand-Tensors liegt.

Auswählen

Siehe auch XlaBuilder::Select.

Erstellt ein Ausgabearray aus Elementen von zwei Eingabearrays basierend auf den Werten eines Prädikatsarrays.

Select(pred, on_true, on_false)

Argumente Typ Semantik
pred XlaOp Array vom Typ PRED
on_true XlaOp Array vom Typ T
on_false XlaOp Array vom Typ T

Die Arrays on_true und on_false müssen dieselbe Form haben. Das ist auch die Form des Ausgabearrays. Das Array pred muss dieselbe Dimensionalität wie on_true und on_false mit dem Elementtyp PRED haben.

Für jedes Element P von pred wird das entsprechende Element des Ausgabearrays aus on_true übernommen, wenn der Wert von P gleich true ist, und aus on_false, wenn der Wert von P gleich false ist. Als eingeschränkte Form des Broadcasting kann pred ein Skalar vom Typ PRED sein. In diesem Fall wird das Ausgabearray vollständig aus on_true übernommen, wenn pred gleich true ist, und aus on_false, wenn pred gleich false ist.

Beispiel mit nicht skalarer pred:

let pred: PRED[4] = {true, false, false, true};
let v1: s32[4] = {1, 2, 3, 4};
let v2: s32[4] = {100, 200, 300, 400};
==>
Select(pred, v1, v2) = s32[4]{1, 200, 300, 4};

Beispiel mit skalarer pred:

let pred: PRED = true;
let v1: s32[4] = {1, 2, 3, 4};
let v2: s32[4] = {100, 200, 300, 400};
==>
Select(pred, v1, v2) = s32[4]{1, 2, 3, 4};

Auswahlen zwischen Tupeln werden unterstützt. Tupel werden für diesen Zweck als skalare Typen betrachtet. Wenn on_true und on_false Tupel sind (die dieselbe Form haben müssen!), muss pred ein Skalar vom Typ PRED sein.

Informationen zu StableHLO finden Sie unter StableHLO – select.

SelectAndScatter

Siehe auch XlaBuilder::SelectAndScatter.

Dieser Vorgang kann als zusammengesetzter Vorgang betrachtet werden, bei dem zuerst ReduceWindow für das operand-Array berechnet wird, um ein Element aus jedem Fenster auszuwählen. Anschließend wird das source-Array auf die Indexe der ausgewählten Elemente verteilt, um ein Ausgabearray mit derselben Form wie das Operandenarray zu erstellen. Mit der binären select-Funktion wird ein Element aus jedem Fenster ausgewählt. Dazu wird sie auf jedes Fenster angewendet. Sie wird mit der Eigenschaft aufgerufen, dass der Indexvektor des ersten Parameters lexikografisch kleiner als der Indexvektor des zweiten Parameters ist. Die Funktion select gibt true zurück, wenn der erste Parameter ausgewählt ist, und false, wenn der zweite Parameter ausgewählt ist. Die Funktion muss transitiv sein (d. h., wenn select(a, b) und select(b, c) true sind, dann ist auch select(a, c) true), damit das ausgewählte Element nicht von der Reihenfolge der Elemente abhängt, die für ein bestimmtes Fenster durchlaufen werden.

Die Funktion scatter wird auf jeden ausgewählten Index im Ausgabearray angewendet. Er hat zwei skalare Parameter:

  1. Aktueller Wert am ausgewählten Index im Ausgabearray
  2. Der Streuungswert aus source, der für den ausgewählten Index gilt

Die beiden Parameter werden kombiniert und es wird ein skalarer Wert zurückgegeben, mit dem der Wert am ausgewählten Index im Ausgabearray aktualisiert wird. Anfangs sind alle Indexe des Ausgabearrays auf init_value gesetzt.

Das Ausgabearray hat dieselbe Form wie das operand-Array und das source-Array muss dieselbe Form wie das Ergebnis der Anwendung einer ReduceWindow-Operation auf das operand-Array haben. Mit SelectAndScatter können die Gradientenwerte für eine Pooling-Schicht in einem neuronalen Netzwerk rückpropagiert werden.

SelectAndScatter(operand, select, window_dimensions, window_strides, padding, source, init_value, scatter)

Argumente Typ Semantik
operand XlaOp Array vom Typ T, über das die Fenster gleiten
select XlaComputation binäre Berechnung vom Typ T, T -> PRED, die auf alle Elemente in jedem Fenster angewendet wird; gibt true zurück, wenn der erste Parameter ausgewählt ist, und false, wenn der zweite Parameter ausgewählt ist
window_dimensions ArraySlice<int64> Array von Ganzzahlen für Fensterdimensionswerte
window_strides ArraySlice<int64> Array von Ganzzahlen für Fenster-Stride-Werte
padding Padding Padding-Typ für das Fenster (Padding::kSame oder Padding::kValid)
source XlaOp Array vom Typ T mit den zu streuenden Werten
init_value XlaOp Skalarwert vom Typ T für den Anfangswert des Ausgabearrays
scatter XlaComputation binäre Berechnung vom Typ T, T -> T, um jedes Scatter-Quellenelement mit seinem Zielelement anzuwenden

In der Abbildung unten sehen Sie Beispiele für die Verwendung von SelectAndScatter. Die Funktion select berechnet den Maximalwert der Parameter. Wenn sich die Fenster überschneiden, wie in Abbildung 2 unten, kann ein Index des operand-Arrays mehrmals von verschiedenen Fenstern ausgewählt werden. In der Abbildung wird das Element mit dem Wert 9 sowohl vom oberen blauen als auch vom oberen roten Fenster ausgewählt. Die binäre Additionsfunktion scatter erzeugt das Ausgabeelement mit dem Wert 8 (2 + 6).

Die Auswertungsreihenfolge der Funktion scatter ist beliebig und kann nicht deterministisch sein. Daher sollte die scatter-Funktion nicht zu empfindlich auf eine erneute Zuordnung reagieren. Weitere Informationen finden Sie in der Diskussion zur Assoziativität im Kontext von Reduce.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – select_and_scatter.

Senden

Siehe auch XlaBuilder::Send.

Send, SendWithTokens und SendToHost sind Vorgänge, die als Kommunikationsprimitive in HLO dienen. Diese Vorgänge sind in HLO-Dumps in der Regel Teil der Low-Level-Ein-/Ausgabe oder der geräteübergreifenden Übertragung, sie sind jedoch nicht für die manuelle Erstellung durch Endnutzer vorgesehen.

Send(operand, handle)

Argumente Typ Semantik
operand XlaOp Zu sendende Daten (Array vom Typ T)
handle ChannelHandle Eindeutige Kennung für jedes Sende-/Empfangspaar

Sendet die angegebenen Operanden an eine Recv-Anweisung in einer anderen Berechnung, die dasselbe Channel-Handle verwendet. Es werden keine Daten zurückgegeben.

Ähnlich wie beim Vorgang Recv stellt die Client-API des Vorgangs Send die synchrone Kommunikation dar und wird intern in zwei HLO-Anweisungen (Send und SendDone) zerlegt, um asynchrone Datenübertragungen zu ermöglichen. Siehe auch HloInstruction::CreateSend und HloInstruction::CreateSendDone.

Send(HloInstruction operand, int64 channel_id)

Leitet eine asynchrone Übertragung des Operanden an die Ressourcen ein, die durch die Recv-Anweisung mit derselben Channel-ID zugewiesen wurden. Gibt einen Kontext zurück, der von einer nachfolgenden SendDone-Anweisung verwendet wird, um auf den Abschluss der Datenübertragung zu warten. Der Kontext ist ein Tupel aus {Operand (Form), Anforderungs-ID (U32)} und kann nur von einem SendDone-Befehl verwendet werden.

Informationen zu StableHLO finden Sie unter StableHLO – send.

SendDone

Siehe auch HloInstruction::CreateSendDone.

SendDone(HloInstruction context)

Wartet in einem Kontext, der durch eine Send-Anweisung erstellt wurde, bis die Datenübertragung abgeschlossen ist. Mit der Anleitung werden keine Daten zurückgegeben.

Planung von Kanalanweisungen

Die Ausführungsreihenfolge der vier Anweisungen für jeden Channel (Recv, RecvDone, Send, SendDone) ist wie unten beschrieben.

  • Recv findet vor Send statt.
  • Send findet vor RecvDone statt.
  • Recv findet vor RecvDone statt.
  • Send findet vor SendDone statt.

Wenn die Backend-Compiler einen linearen Zeitplan für jede Berechnung generieren, die über Channel-Anweisungen kommuniziert, darf es keine Zyklen zwischen den Berechnungen geben. Die folgenden Zeitpläne führen beispielsweise zu Deadlocks.

SetDimensionSize

Siehe auch XlaBuilder::SetDimensionSize.

Legt die dynamische Größe der angegebenen Dimension von XlaOp fest. Der Operand muss ein Array sein.

SetDimensionSize(operand, val, dimension)

Argumente Typ Semantik
operand XlaOp n-dimensionales Eingabearray.
val XlaOp int32, das die dynamische Größe zur Laufzeit darstellt.
dimension int64 Ein Wert im Intervall [0, n), der die Dimension angibt.

Der Operand wird als Ergebnis übergeben. Die dynamische Dimension wird vom Compiler erfasst.

Gepaddete Werte werden von nachgelagerten Reduktionsvorgängen ignoriert.

let v: f32[10] = f32[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
let five: s32 = 5;
let six: s32 = 6;

// Setting dynamic dimension size doesn't change the upper bound of the static
// shape.
let padded_v_five: f32[10] = set_dimension_size(v, five, /*dimension=*/0);
let padded_v_six: f32[10] = set_dimension_size(v, six, /*dimension=*/0);

// sum == 1 + 2 + 3 + 4 + 5
let sum:f32[] = reduce_sum(padded_v_five);
// product == 1 * 2 * 3 * 4 * 5
let product:f32[] = reduce_product(padded_v_five);

// Changing padding size will yield different result.
// sum == 1 + 2 + 3 + 4 + 5 + 6
let sum:f32[] = reduce_sum(padded_v_six);

ShiftLeft

Siehe auch XlaBuilder::ShiftLeft.

Führt eine elementweise Linksverschiebung von lhs um rhs Bits aus.

ShiftLeft(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für ShiftLeft gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

ShiftLeft(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – shift_left.

ShiftRightArithmetic

Siehe auch XlaBuilder::ShiftRightArithmetic.

Führt eine elementweise arithmetische Rechtsverschiebung von lhs um rhs Bits durch.

ShiftRightArithmetic(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für ShiftRightArithmetic gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

ShiftRightArithmetic(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – shift_right_arithmetic.

ShiftRightLogical

Siehe auch XlaBuilder::ShiftRightLogical.

Führt eine elementweise logische Rechtsverschiebung von lhs um rhs Bits aus.

ShiftRightLogical(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für ShiftRightLogical gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

ShiftRightLogical(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – shift_right_logical.

Signieren

Siehe auch XlaBuilder::Sign.

Sign(operand) Elementweise Vorzeichenoperation x -> sgn(x), wobei

\[\text{sgn}(x) = \begin{cases} -1 & x < 0\\ -0 & x = -0\\ NaN & x = NaN\\ +0 & x = +0\\ 1 & x > 0 \end{cases}\]

mit dem Vergleichsoperator des Elementtyps von operand.

Sign(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Weitere Informationen zu StableHLO finden Sie unter StableHLO – sign.

Sinus

Sin(operand) Elementweise Sinusfunktion x -> sin(x):

Siehe auch XlaBuilder::Sin.

Sin(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Die Funktion „Sin“ unterstützt auch das optionale Argument result_accuracy:

Sin(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Sinus.

Slice

Siehe auch XlaBuilder::Slice.

Beim Slicing wird ein Unterarray aus dem Eingabearray extrahiert. Das Unterarray hat dieselbe Anzahl von Dimensionen wie die Eingabe und enthält die Werte innerhalb eines umgebenden Rechtecks im Eingabearray, wobei die Dimensionen und Indexe des umgebenden Rechtecks als Argumente für den Slice-Vorgang angegeben werden.

Slice(operand, start_indices, limit_indices, strides)

Argumente Typ Semantik
operand XlaOp N-dimensionales Array vom Typ T
start_indices ArraySlice<int64> Liste mit N Ganzzahlen, die die Startindexe des Slice für jede Dimension enthalten. Die Werte müssen größer oder gleich null sein.
limit_indices ArraySlice<int64> Liste mit N Ganzzahlen, die die Endindexe (exklusiv) für den Slice für jede Dimension enthält. Jeder Wert muss größer oder gleich dem entsprechenden start_indices-Wert für die Dimension und kleiner oder gleich der Größe der Dimension sein.
strides ArraySlice<int64> Liste mit N Ganzzahlen, die den Eingabestride des Slice festlegen. Mit dem Slice wird jedes strides[d]-Element in Dimension d ausgewählt.

1‑dimensionales Beispiel:

let a = {0.0, 1.0, 2.0, 3.0, 4.0}
Slice(a, {2}, {4})
// Result: {2.0, 3.0}

2‑dimensionales Beispiel:

let b =
 { {0.0,  1.0,  2.0},
   {3.0,  4.0,  5.0},
   {6.0,  7.0,  8.0},
   {9.0, 10.0, 11.0} }

Slice(b, {2, 1}, {4, 3})
// Result:
//   { { 7.0,  8.0},
//     {10.0, 11.0} }

Weitere Informationen zu StableHLO finden Sie unter StableHLO – slice.

Sortieren

Siehe auch XlaBuilder::Sort.

Sort(operands, comparator, dimension, is_stable)

Argumente Typ Semantik
operands ArraySlice<XlaOp> Die zu sortierenden Operanden.
comparator XlaComputation Die zu verwendende Vergleichsberechnung.
dimension int64 Die Dimension, nach der sortiert werden soll.
is_stable bool Gibt an, ob stabiles Sortieren verwendet werden soll.

Wenn nur ein Operand angegeben wird:

  • Wenn der Operand ein eindimensionaler Tensor (ein Array) ist, ist das Ergebnis ein sortiertes Array. Wenn Sie das Array in aufsteigender Reihenfolge sortieren möchten, sollte der Comparator einen „kleiner als“-Vergleich durchführen. Formal gilt nach dem Sortieren des Arrays für alle Indexpositionen i, j mit i < j entweder comparator(value[i], value[j]) = comparator(value[j], value[i]) = false oder comparator(value[i], value[j]) = true.

  • Wenn der Operand eine höhere Anzahl von Dimensionen hat, wird er entlang der angegebenen Dimension sortiert. Bei einem zweidimensionalen Tensor (einer Matrix) wird mit dem Dimensionswert 0 jede Spalte unabhängig sortiert und mit dem Dimensionswert 1 jede Zeile unabhängig sortiert. Wenn keine Dimensionsnummer angegeben wird, wird standardmäßig die letzte Dimension ausgewählt. Für die sortierte Dimension gilt dieselbe Sortierreihenfolge wie im eindimensionalen Fall.

Wenn n > 1-Operanden angegeben werden:

  • Alle n-Operanden müssen Tensoren mit denselben Dimensionen sein. Die Elementtypen der Tensoren können unterschiedlich sein.

  • Alle Operanden werden zusammen sortiert, nicht einzeln. Konzeptionell werden die Operanden als Tupel behandelt. Beim Prüfen, ob die Elemente der einzelnen Operanden an den Indexpositionen i und j getauscht werden müssen, wird der Comparator mit 2 * n skalaren Parametern aufgerufen. Dabei entspricht der Parameter 2 * k dem Wert an der Position i des Operanden k-th und der Parameter 2 * k + 1 dem Wert an der Position j des Operanden k-th. Normalerweise werden also die Parameter 2 * k und 2 * k + 1 miteinander verglichen und möglicherweise andere Parameterpaare als Tiebreaker verwendet.

  • Das Ergebnis ist ein Tupel, das aus den Operanden in sortierter Reihenfolge (entlang der oben angegebenen Dimension) besteht. Der i-th-Operand des Tupels entspricht dem i-th-Operanden von „Sort“.

Wenn es beispielsweise drei Operanden operand0 = [3, 1], operand1 = [42, 50] und operand2 = [-3.0, 1.1] gibt und der Comparator nur die Werte von operand0 mit „kleiner als“ vergleicht, ist die Ausgabe der Sortierung das Tupel ([1, 3], [50, 42], [1.1, -3.0]).

Wenn is_stable auf „true“ gesetzt ist, ist die Sortierung garantiert stabil. Das bedeutet, dass die relative Reihenfolge der gleichen Werte beibehalten wird, wenn der Comparator Elemente als gleich betrachtet. Zwei Elemente e1 und e2 sind genau dann gleich, wenn comparator(e1, e2) = comparator(e2, e1) = false. Standardmäßig ist is_stable auf „false“ gesetzt.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – sort.

Sqrt

Siehe auch XlaBuilder::Sqrt.

Elementweise Quadratwurzeloperation x -> sqrt(x).

Sqrt(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

„Sqrt“ unterstützt auch das optionale Argument result_accuracy:

Sqrt(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – sqrt.

Untergeordnet

Siehe auch XlaBuilder::Sub.

Führt eine elementweise Subtraktion von lhs und rhs durch.

Sub(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für „Sub“ gibt es eine alternative Variante mit Unterstützung für Broadcasting in verschiedenen Dimensionen:

Sub(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – subtract.

Lederbraun

Siehe auch XlaBuilder::Tan.

Elementweise Tangente x -> tan(x).

Tan(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

„tan“ unterstützt auch das optionale Argument result_accuracy:

Tan(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – tan.

Tanh

Siehe auch XlaBuilder::Tanh.

Elementweiser hyperbolischer Tangens x -> tanh(x).

Tanh(operand)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion

Tanh unterstützt auch das optionale Argument result_accuracy:

Tanh(operand, result_accuracy)

Argumente Typ Semantik
operand XlaOp Der Operand für die Funktion
result_accuracy optional ResultAccuracy Die Genauigkeitstypen, die der Nutzer für unäre Operationen mit mehreren Implementierungen anfordern kann

Weitere Informationen zu result_accuracy finden Sie unter Genauigkeit der Ergebnisse.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – tanh.

TopK

Siehe auch XlaBuilder::TopK.

Mit TopK werden die Werte und Indexe der k größten oder kleinsten Elemente für die letzte Dimension des angegebenen Tensors ermittelt.

TopK(operand, k, largest)

Argumente Typ Semantik
operand XlaOp Der Tensor, aus dem die obersten k-Elemente extrahiert werden sollen. Der Tensor muss mindestens eine Dimension haben. Die Größe der letzten Dimension des Tensors muss größer oder gleich k sein.
k int64 Die Anzahl der zu extrahierenden Elemente.
largest bool Gibt an, ob die größten oder kleinsten k Elemente extrahiert werden sollen.

Für einen eindimensionalen Eingabetensor (ein Array) werden die k größten oder kleinsten Einträge im Array ermittelt und ein Tupel aus zwei Arrays (values, indices) ausgegeben. values[j] ist also der j-größte/kleinste Eintrag in operand und sein Index ist indices[j].

Für einen Eingabetensor mit mehr als einer Dimension werden die k Einträge mit den höchsten Werten entlang der letzten Dimension berechnet. Alle anderen Dimensionen (Zeilen) bleiben in der Ausgabe erhalten. Für einen Operanden mit der Form [A, B, ..., P, Q], wobei Q >= k, ist die Ausgabe also ein Tupel (values, indices), wobei gilt:

values.shape = indices.shape = [A, B, ..., P, k]

Wenn zwei Elemente in einer Zeile gleich sind, wird das Element mit dem niedrigeren Index zuerst angezeigt.

Transponieren

Weitere Informationen finden Sie unter tf.reshape.

Transpose(operand, permutation)

Argumente Typ Semantik
operand XlaOp Der zu transponierende Operand.
permutation ArraySlice<int64> So werden die Dimensionen permutiert.

Permutiert die Operanden-Dimensionen mit der angegebenen Permutation, sodass ∀ i . 0 ≤ i < number of dimensions ⇒ input_dimensions[permutation[i]] = output_dimensions[i].

Dies entspricht Reshape(operand, permutation, Permute(permutation, operand.shape.dimensions)).

Weitere Informationen zu StableHLO finden Sie unter StableHLO – transpose.

TriangularSolve

Siehe auch XlaBuilder::TriangularSolve.

Löst Systeme linearer Gleichungen mit unteren oder oberen Dreieckskoeffizientenmatrizen durch Vorwärts- oder Rückwärtssubstitution. Bei der Übertragung entlang der führenden Dimensionen wird eines der Matrixsysteme op(a) * x = b oder x * op(a) = b für die Variable x gelöst, wobei a und b angegeben sind und op(a) entweder op(a) = a, op(a) = Transpose(a) oder op(a) = Conj(Transpose(a)) ist.

TriangularSolve(a, b, left_side, lower, unit_diagonal, transpose_a)

Argumente Typ Semantik
a XlaOp ein mehr als zweidimensionales Array eines komplexen oder Gleitkommatyps mit der Form [..., M, M].
b XlaOp ein mehrdimensionales Array desselben Typs mit der Form [..., M, K], wenn left_side „true“ ist, andernfalls [..., K, M].
left_side bool gibt an, ob ein System der Form op(a) * x = b (true) oder x * op(a) = b (false) gelöst werden soll.
lower bool ob das obere oder untere Dreieck von a verwendet werden soll.
unit_diagonal bool Wenn true, werden die Diagonalelemente von a als 1 angenommen und nicht auf sie zugegriffen.
transpose_a Transpose Gibt an, ob a unverändert verwendet, transponiert oder konjugiert transponiert werden soll.

Eingabedaten werden nur aus dem unteren/oberen Dreieck von a gelesen, je nach Wert von lower. Werte aus dem anderen Dreieck werden ignoriert. Ausgabedaten werden im selben Dreieck zurückgegeben. Die Werte im anderen Dreieck sind implementierungsdefiniert und können beliebig sein.

Wenn die Anzahl der Dimensionen von a und b größer als 2 ist, werden sie als Batches von Matrizen behandelt, wobei alle Dimensionen außer den beiden untergeordneten Dimensionen Batchdimensionen sind. a und b müssen dieselben Batchdimensionen haben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – triangular_solve.

Tupel

Siehe auch XlaBuilder::Tuple.

Ein Tupel mit einer variablen Anzahl von Daten-Handles, die jeweils eine eigene Form haben.

Tuple(elements)

Argumente Typ Semantik
elements Vektor von XlaOp N-Array vom Typ T

Das entspricht std::tuple in C++. Konzeptionell:

let v: f32[10] = f32[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
let s: s32 = 5;
let t: (f32[10], s32) = tuple(v, s);

Tupel können mit dem Vorgang GetTupleElement dekonstruiert (auf sie kann zugegriffen) werden.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – Tuple.

Während

Siehe auch XlaBuilder::While.

While(condition, body, init)

Argumente Typ Semantik
condition XlaComputation XlaComputation vom Typ T -> PRED, der die Beendigungsbedingung der Schleife definiert.
body XlaComputation XlaComputation vom Typ T -> T, die den Text der Schleife definiert.
init T Anfangswert für den Parameter von condition und body.

Führt die body sequenziell aus, bis die condition fehlschlägt. Das ähnelt einer typischen while-Schleife in vielen anderen Sprachen, mit Ausnahme der unten aufgeführten Unterschiede und Einschränkungen.

  • Ein While-Knoten gibt einen Wert vom Typ T zurück, der das Ergebnis der letzten Ausführung von body ist.
  • Die Form des Typs T wird statisch bestimmt und muss in allen Iterationen gleich sein.

Die T-Parameter der Berechnungen werden in der ersten Iteration mit dem Wert init initialisiert und in jeder nachfolgenden Iteration automatisch auf das neue Ergebnis von body aktualisiert.

Ein wichtiger Anwendungsfall für den While-Knoten ist die wiederholte Ausführung des Trainings in neuronalen Netzwerken. Unten sehen Sie vereinfachten Pseudocode mit einem Diagramm, das die Berechnung darstellt. Der Code befindet sich in while_test.cc. Der Typ T in diesem Beispiel ist ein Tuple, der aus einem int32 für die Anzahl der Iterationen und einem vector[10] für den Akkumulator besteht. In 1.000 Schleifendurchläufen wird dem Akkumulator immer wieder ein konstanter Vektor hinzugefügt.

// Pseudocode for the computation.
init = {0, zero_vector[10]} // Tuple of int32 and float[10].
result = init;
while (result(0) < 1000) {
  iteration = result(0) + 1;
  new_vector = result(1) + constant_vector[10];
  result = {iteration, new_vector};
}

Weitere Informationen zu StableHLO finden Sie unter StableHLO – while.

Xor

Siehe auch XlaBuilder::Xor.

Führt ein elementweises XOR von lhs und rhs aus.

Xor(lhs, rhs)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T

Die Formen der Argumente müssen entweder ähnlich oder kompatibel sein. In der Dokumentation zum Broadcasting finden Sie Informationen dazu, was es bedeutet, wenn Formen kompatibel sind. Das Ergebnis einer Operation hat eine Form, die sich aus dem Broadcasting der beiden Eingabearrays ergibt. In dieser Variante werden Operationen zwischen Arrays mit unterschiedlichen Rängen nicht unterstützt, es sei denn, einer der Operanden ist ein Skalar.

Für Xor gibt es eine alternative Variante mit Unterstützung für Broadcasting mit unterschiedlichen Dimensionen:

Xor(lhs,rhs, broadcast_dimensions)

Argumente Typ Semantik
lhs XlaOp Linker Operand: Array vom Typ T
rhs XlaOp Linker Operand: Array vom Typ T
broadcast_dimension ArraySlice Welcher Dimension im Ziel-Shape jede Dimension des Operanden-Shape entspricht

Diese Variante des Vorgangs sollte für arithmetische Operationen zwischen Arrays unterschiedlichen Rangs verwendet werden, z. B. zum Addieren einer Matrix zu einem Vektor.

Der zusätzliche Operand „broadcast_dimensions“ ist ein Slice von Ganzzahlen, der die Dimensionen angibt, die zum Broadcasten der Operanden verwendet werden sollen. Die Semantik wird auf der Seite zum Broadcasting ausführlich beschrieben.

Weitere Informationen zu StableHLO finden Sie unter StableHLO – xor.