StabilerHLO-Status

Beim Bootstrapping von StableHLO von MHLO haben wir die MHLO-Implementierung für viele Aspekte übernommen, einschließlich der Pre-Launch-Methode, Verifizierung und Forminferenz. Aus diesem Grund haben wir bereits eine umfassende Abdeckung des Vorgangs. Es gibt jedoch noch viel zu tun, um die vorhandenen Implementierungen auf Vollständigkeit zu überprüfen und neue Implementierungen bereitzustellen, wenn es keine gibt.

Dieses Live-Dokument ist für die Entwickler und Nutzer gedacht, um den Fortschritt in verschiedenen Aspekten des Vorgangs zu verfolgen: Spezifikation, Verifizierung, Typinferenz, Pretty Printing, Interpreter usw.

Verwendung

Der Fortschritt eines StableHLO-Vorgangs, wie in der entsprechenden Zeile erwähnt, zu einem bestimmten Aspekt, wie in der entsprechenden Spalte angegeben, wird mit einem der folgenden Tracking-Labels verfolgt.

  • Allgemeine Labels
    • yes: Es gibt eine umfassende Implementierung.
    • Nein: Es gibt keine Implementierung, aber die Arbeit daran ist Teil der Roadmap. Der Prüfer kann nie mit „Nein“ gekennzeichnet werden, da die ODS bereits einen Teil der Überprüfung implementiert.
  • Benutzerdefinierte Labels für die Prüfung und Typinferenz
    • yes: Es gibt eine Implementierung, die mit der StableHLO-Semantik synchron ist.
    • yes*: Es gibt eine Implementierung, die mit der XLA-Semantik synchron ist. Da die XLA-Semantik oft zu wenig dokumentiert ist, verwenden wir hlo_verifier.cc und shape_inference.cc als Referenz.
    • revisit: Es gibt eine Implementierung, die jedoch weder unter „Ja“ noch „Ja*“ fällt – entweder weil wir sie noch nicht geprüft haben oder weil wir Probleme gefunden haben.
    • infeasible (unmöglich): Eine Implementierung ist nicht möglich. Beispielsweise kann der Ergebnistyp eines Vorgangs nicht aus seinen Operanden und Attributen abgeleitet werden.

Status

StabilerHLO-Vorgang Spezifikation Überprüfung Typinferenz Quelltextformatierung Interpreter
abs Ja Ja Ja Ja Ja
Hinzufügen Ja Ja Ja Ja Ja
after_all Ja Ja Ja Ja Ja
all_gather Ja erneut aufrufen nein Nein Ja
all_reduce Ja erneut aufrufen Ja nein Ja
all_to_all Ja erneut aufrufen Ja nein Ja
und Ja Ja Ja Ja Ja
atan2 Ja Ja Ja Ja Ja
batch_norm_grad Ja erneut aufrufen Ja nein erneut aufrufen
batch_norm_inference Ja erneut aufrufen Ja nein erneut aufrufen
batch_norm_training Ja erneut aufrufen Ja nein erneut aufrufen
bitcast_convert Ja Ja nicht durchführbar Ja Ja
Nachricht an alle nein ja* ja* Ja erneut aufrufen
broadcast_in_dim Ja Ja nicht durchführbar Ja Ja
Supportanfrage Ja erneut aufrufen Ja nein Ja
CBRT Ja Ja Ja Ja Ja
Ceil Ja Ja Ja Ja Ja
Cholesky Ja Ja Ja Ja erneut aufrufen
einschränken Ja erneut aufrufen Ja Ja Ja
collective_broadcast Ja erneut aufrufen Ja nein Ja
collective_permute Ja erneut aufrufen Ja nein Ja
Nutzer*innen Ja Ja Ja Ja Ja
Komplex Ja Ja Ja Ja Ja
Zusammengesetzt Ja Ja nicht durchführbar Ja Ja
concatenate Ja Ja Ja Ja Ja
Konstante Ja Ja Ja Ja Ja
eine Conversion ausführen Ja Ja nicht durchführbar Ja Ja
Faltung Ja Ja nicht durchführbar erneut aufrufen Ja
Kosinus Ja Ja Ja Ja Ja
count_leading_zeros Ja Ja Ja Ja Ja
create_token nein ja* ja* Ja erneut aufrufen
replikationsübergreifende Summe nein erneut aufrufen ja* nein erneut aufrufen
custom_call Ja Ja nicht durchführbar Ja Ja
Dividieren Ja Ja Ja Ja Ja
Punkt nein erneut aufrufen nicht durchführbar Ja erneut aufrufen
dot_general Ja erneut aufrufen nicht durchführbar nein Ja
dynamic_broadcast_in_dim Ja Ja nicht durchführbar Ja erneut aufrufen
dynamic_conv Ja Ja nicht durchführbar erneut aufrufen erneut aufrufen
dynamic_gather Ja Ja nicht durchführbar nein erneut aufrufen
dynamic_iota Ja Ja nicht durchführbar Ja erneut aufrufen
dynamic_pad Ja Ja nicht durchführbar Ja erneut aufrufen
dynamic_reshape Ja Ja nicht durchführbar Ja erneut aufrufen
dynamic_slice Ja Ja Ja Ja Ja
dynamic_update_slice Ja Ja Ja Ja Ja
einsum nein erneut aufrufen nein Ja erneut aufrufen
Exponentialfunktionen Ja Ja Ja Ja Ja
exponential_minus_one Ja Ja Ja Ja Ja
FFT Ja erneut aufrufen Ja Ja nein
Boden Ja Ja Ja Ja Ja
sammeln Ja Ja Ja nein Ja
get_dimension_size Ja Ja Ja Ja Ja
get_tuple_element Ja Ja Ja Ja Ja
if Ja erneut aufrufen Ja nein Ja
Bild Ja Ja Ja Ja Ja
InFeed Ja Ja nicht durchführbar nein Ja
Iota Ja Ja nicht durchführbar Ja Ja
is_finite Ja Ja Ja Ja Ja
log Ja Ja Ja Ja Ja
log_plus_one Ja Ja Ja Ja Ja
Logistik Ja Ja Ja Ja Ja
Karte Ja erneut aufrufen Ja nein Ja
Maximum Ja Ja Ja Ja Ja
Minimum Ja Ja Ja Ja Ja
multiplizieren Ja Ja Ja Ja Ja
negate Ja Ja Ja Ja Ja
nicht Ja Ja Ja Ja Ja
optimization_barrier Ja Ja Ja Ja Ja
oder Ja Ja Ja Ja Ja
Outfeed Ja Ja Ja nein Ja
Pad Ja Ja Ja Ja Ja
partition_id Ja Ja Ja Ja Ja
Popcnt Ja Ja Ja Ja Ja
Leistung Ja Ja Ja Ja Ja
real Ja Ja Ja Ja Ja
real_dynamic_slice nein erneut aufrufen nein Ja nein
Recv Ja Ja nicht durchführbar nein Ja
reduce Ja erneut aufrufen Ja erneut aufrufen Ja
reduce_precision Ja Ja Ja Ja Ja
reduce_scatter Ja erneut aufrufen nein Nein Ja
reduce_window Ja erneut aufrufen Ja nein Ja
Rest Ja Ja Ja Ja Ja
replica_id Ja Ja Ja Ja Ja
Form ändern Ja Ja nicht durchführbar Ja Ja
return nein erneut aufrufen nicht durchführbar Ja Ja
reverse Ja Ja Ja Ja Ja
RNG Ja Ja Ja Ja erneut aufrufen
rng_bit_generator Ja erneut aufrufen nicht durchführbar Ja erneut aufrufen
round_nearest_afz Ja Ja Ja Ja Ja
round_nearest_even Ja Ja Ja Ja Ja
RSQRT Ja Ja Ja Ja Ja
scatter Ja erneut aufrufen Ja nein Ja
auswählen Ja Ja Ja Ja Ja
select_and_scatter Ja erneut aufrufen Ja nein Ja
Senden Ja Ja Ja nein Ja
set_dimension_size nein ja* ja* Ja nein
shift_left Ja Ja Ja Ja Ja
shift_right_arithmetic Ja Ja Ja Ja Ja
shift_right_logical Ja Ja Ja Ja Ja
Signieren Ja Ja Ja Ja Ja
Sinus Ja Ja Ja Ja Ja
Slice Ja Ja Ja nein Ja
Sortieren Ja Ja Ja nein Ja
sqrt Ja Ja Ja Ja Ja
subtract Ja Ja Ja Ja Ja
Tanh Ja Ja Ja Ja Ja
torch_index_select nein erneut aufrufen nein nein erneut aufrufen
Transponieren Ja Ja Ja Ja Ja
triangular_solve Ja erneut aufrufen Ja nein erneut aufrufen
tuple Ja Ja Ja Ja Ja
unary_einsum nein erneut aufrufen nein Ja erneut aufrufen
uniform_dequantize Ja Ja Ja Ja nein
uniform_quantize Ja erneut aufrufen nicht durchführbar Ja nein
während Ja erneut aufrufen Ja erneut aufrufen Ja
Xor Ja Ja Ja Ja Ja

Inferenz für quantisierte Vorgänge eingeben

Die Spalte Type Inference aus der obigen Tabelle konzentriert sich auf nicht quantisierte Vorgänge. Bei den meisten quantisierten Vorgängen ist es nicht möglich, den Ergebnistyp abzuleiten, da die Quantisierungsparameter der Ergebnistypen von denen der Operanden abweichen können. Mit Ausnahme von wenigen Fällen, in denen der Operand- und der Ergebnistyp identisch sein müssen oder der Vorgang Einschränkungen aufweist, die für den Ergebnistyp hilfreich sind, sind die Vorgänge unten aufgeführt: all_gather, all_to_all, case, collective_permute, compare, concatenate, constant, dynamic_slice, dynamic_update_slice, gather, get_tuple_element, if, infeed, is_finite, infeed, is_finite, map, is_finite, map, is_finite, map, mapoptimization_barrieroutfeedpadrecvreducereduce_scatterreduce_windowreversescatterselect_and_scattersendslicesorttransposetupleuniform_dequantizedwhile