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

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