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
, map
optimization_barrier
outfeed
pad
recv
reduce
reduce_scatter
reduce_window
reverse
scatter
select_and_scatter
send
slice
sort
transpose
tuple
uniform_dequantized
while