Estado de StableHLO

Cuando se inicia StableHLO desde MHLO, heredamos la implementación de MHLO de muchos elementos, como la función Prettyprint, la verificación y la inferencia de formas. Gracias a eso, ya tenemos una cobertura significativa del conjunto de operaciones, pero aún hay mucho por hacer para revisar la integridad de las implementaciones existentes y brindar implementaciones nuevas en las que no exista ninguna.

Este documento publicado está destinado a los desarrolladores y los usuarios para que realicen un seguimiento del progreso en varios aspectos del conjunto de operaciones: especificación, verificación, inferencia de tipo, impresión con imágenes, intérprete, etcétera.

Instrucciones de uso

El progreso de una op StableHLO, como se menciona en la fila correspondiente, en un aspecto en particular, como se menciona en la columna correspondiente, se realiza mediante una de las siguientes etiquetas de seguimiento.

  • Etiquetas genéricas
    • yes: Hay una implementación integral.
    • no: No hay implementación, pero trabajar en eso forma parte de la hoja de ruta. Ten en cuenta que el verificador nunca se puede etiquetar como “no” porque la ODS ya implementó cierta verificación.
  • Etiquetas personalizadas para inferencia de tipos y verificador
    • yes: Hay una implementación y está sincronizada con la semántica estable.
    • yes*: Hay una implementación y está sincronizada con la semántica de XLA. Dado que la semántica de XLA suele estar poco documentada, usamos hlo_verifier.cc y shape_inference.cc como referencia.
    • revisión: Hay una implementación, pero no entra en "sí" ni "sí*", ya sea porque aún no la auditamos o porque sí encontramos problemas.
    • inviable: No hay implementación, porque es inviable. (por ejemplo, porque no se puede inferir el tipo de resultado de una op de sus operandos y atributos).

Estado

Operaciones de StableHLO Especificación Verificación Inferencia de tipos Impresión con belleza Intérprete
abs
add
after_all
all_gather volver a visitar no no
all_reduce volver a visitar no
all_to_all volver a visitar no
y
atan2
batch_norm_grad volver a visitar no volver a visitar
batch_norm_inference volver a visitar no volver a visitar
batch_norm_training volver a visitar no volver a visitar
bitcast_convert inviable
transmisión no sí* sí* volver a visitar
broadcast_in_dim inviable
caso volver a visitar no
CTR
ceil
colectivo volver a visitar
restringir volver a visitar
collective_broadcast volver a visitar no
collective_permute volver a visitar no
compare
complejo
compuesto inviable
concatenate
constante
generar una conversión inviable
convolución inviable volver a visitar
coseno
count_leading_zeros
create_token no sí* sí* volver a visitar
suma-de-réplica-cruzada no volver a visitar sí* no volver a visitar
custom_call inviable
dividir
punto no volver a visitar inviable volver a visitar
dot_general volver a visitar inviable no
dynamic_broadcast_in_dim inviable volver a visitar
dynamic_conv inviable volver a visitar volver a visitar
dynamic_gather inviable no volver a visitar
dynamic_iota inviable volver a visitar
dynamic_pad inviable volver a visitar
dynamic_reshape inviable volver a visitar
dynamic_slice
dynamic_update_slice
einsum no volver a visitar no volver a visitar
exponencial
exponential_minus_one
FFt volver a visitar no
piso
recopilar no
get_dimension_size
get_tuple_element
if volver a visitar no
imagen
entrada inviable no
iota inviable
is_finite
log
log_plus_one
logística
map volver a visitar no
máxima
mínima
multiplicar
negate
no me encuentro en
optimization_barrier
o
salida no
almohadilla
partition_id
popcnt
potencia
real
real_dynamic_slice no volver a visitar no no
recv inviable no
Reducir volver a visitar volver a visitar
reduce_precision
reduce_scatter volver a visitar no no
reduce_window volver a visitar no
resto
replica_id
cambiar forma inviable
return no volver a visitar inviable
reverse
rng volver a visitar
rng_bit_generator volver a visitar inviable volver a visitar
round_nearest_afz
round_nearest_even
reclutar
scatter volver a visitar no
select
select_and_scatter volver a visitar no
enviar no
set_dimension_size no sí* sí* no
shift_left
shift_right_arithmetic
shift_right_logical
igual.
seno
slice no
ordenar no
sqrt
subtract
tanh
torch_index_select no volver a visitar no no volver a visitar
transponer
triangular_solve volver a visitar no volver a visitar
tuple
unary_einsum no volver a visitar no volver a visitar
uniform_dequantize no
uniform_quantize volver a visitar inviable no
mientras volver a visitar volver a visitar
xor

Inferencia de tipo para operaciones cuantizadas

La columna Type Inference de la tabla anterior está diseñada para enfocarse en operaciones no cuantizadas. Para la mayoría de las operaciones cuantizadas, no es factible inferir el tipo de resultado porque los parámetros de cuantización de los tipos de resultados pueden variar respecto de los de los operandos. A excepción de algunos casos en los que, el operando y los tipos de resultado deben coincidir de forma idéntica, o la operación tiene restricciones útiles para inferir el tipo de resultado, las operaciones se enumeran a continuación: all_gather, all_to_all, case, collective_permute, compare, concatenate, constant, dynamic_slice, dynamic_update_slice, gather, get_tuple_element, if, infeed, is_finite, map, //////optimization_barrier/optimization_barrier/optimization_barrier/optimization_barrier/optimization_barrier/optimization_barrier/optimization_barrier/optimization_barrier/optimization_barrier/optimization_barrier/, optimization_barrier/optimization_barrier/optimization_barrier/optimization_barrier/15/}/15/}/6/}/15/}/15/}.outfeedpadrecvreducereduce_scatterreduce_windowreversescatterselect_and_scattersendslicesorttransposetupleuniform_dequantizedwhile