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