Ao inicializar o StableHLO do MHLO, herdamos a implementação do MHLO de muitas coisas, incluindo shapedprinting, verificação e inferência de formas. Graças a isso, já temos uma cobertura significativa da opset, mas ainda há muito o que fazer para revisar a integridade das implementações atuais e fornecer novas implementações quando não houver nenhuma.
Esse documento dinâmico serve para que os desenvolvedores e usuários acompanhem o progresso em vários aspectos da opset: especificação, verificação, inferência de tipo, impressão avançada, intérprete etc.
Como usar
O progresso de uma op StableHLO, como mencionado na linha correspondente, em um aspecto específico, como mencionado na coluna correspondente, é rastreado usando um dos rótulos de rastreamento a seguir.
- Rótulos genéricos
- yes: há uma implementação abrangente.
- no: não há implementação, mas trabalhar nisso faz parte do roteiro. O verificador nunca pode ser rotulado como "não" porque o ODS já implementa alguma verificação.
- Rótulos personalizados para verificador e inferência de tipo
- yes: há uma implementação e ela está sincronizada com a semântica do StableHLO.
- yes*: há uma implementação e está sincronizada com a semântica do XLA. Como a semântica XLA muitas vezes é subdocumentada, estamos usando hlo_verifier.cc e shape_inference.cc como referência.
- revisit: há uma implementação, mas não se enquadra em "sim" ou "sim*", seja porque ainda não fizemos a auditoria ou porque encontramos problemas e encontramos problemas.
- inviável: não há implementação porque é inviável. Por exemplo, porque o tipo de resultado de uma op não pode ser inferido com base nos operandos e atributos dela.
Status
| Operação StableHLO | Especificação | Verificação | Inferência de tipo | Impressão impecável | Intérprete |
|---|---|---|---|---|---|
| abs | sim | sim | sim | sim | sim |
| adicionar | sim | sim | sim | sim | sim |
| after_all | sim | sim | sim | sim | sim |
| all_gather | sim | revisitar | não | não | sim |
| all_reduce | sim | revisitar | sim | não | sim |
| all_to_all | sim | revisitar | sim | não | sim |
| e | sim | sim | sim | sim | sim |
| atan2 | sim | sim | sim | sim | sim |
| batch_norm_grad | sim | revisitar | sim | não | revisitar |
| batch_norm_inference | sim | revisitar | sim | não | revisitar |
| batch_norm_training | sim | revisitar | sim | não | revisitar |
| bitcast_convert | sim | sim | inviável | sim | sim |
| transmissão | não | sim* | sim* | sim | revisitar |
| broadcast_in_dim | sim | sim | inviável | sim | sim |
| caso | sim | revisitar | sim | não | sim |
| CBRT | sim | sim | sim | sim | sim |
| ceil | sim | sim | sim | sim | sim |
| Cholesky | sim | sim | sim | sim | revisitar |
| limitar | sim | revisitar | sim | sim | sim |
| collective_broadcast | sim | revisitar | sim | não | sim |
| collective_permute | sim | revisitar | sim | não | sim |
| compare | sim | sim | sim | sim | sim |
| complexo | sim | sim | sim | sim | sim |
| composto | sim | sim | inviável | sim | sim |
| concatenate | sim | sim | sim | sim | sim |
| constante | sim | sim | sim | sim | sim |
| fazer uma conversão | sim | sim | inviável | sim | sim |
| convolução | sim | sim | inviável | revisitar | sim |
| cosseno | sim | sim | sim | sim | sim |
| count_leading_zeros | sim | sim | sim | sim | sim |
| create_token | não | sim* | sim* | sim | revisitar |
| soma cruzada | não | revisitar | sim* | não | revisitar |
| custom_call | sim | sim | inviável | sim | sim |
| dividir | sim | sim | sim | sim | sim |
| ponto | não | revisitar | inviável | sim | revisitar |
| dot_general | sim | revisitar | inviável | não | sim |
| dynamic_broadcast_in_dim | sim | sim | inviável | sim | revisitar |
| dynamic_conv | sim | sim | inviável | revisitar | revisitar |
| dynamic_gather | sim | sim | inviável | não | revisitar |
| dynamic_iota | sim | sim | inviável | sim | revisitar |
| dynamic_pad | sim | sim | inviável | sim | revisitar |
| dynamic_reshape | sim | sim | inviável | sim | revisitar |
| dynamic_slice | sim | sim | sim | sim | sim |
| dynamic_update_slice | sim | sim | sim | sim | sim |
| einsum | não | revisitar | não | sim | revisitar |
| exponencial | sim | sim | sim | sim | sim |
| exponential_minus_one | sim | sim | sim | sim | sim |
| fft. | sim | revisitar | sim | sim | não |
| Andar | sim | sim | sim | sim | sim |
| reunir | sim | sim | sim | não | sim |
| get_dimension_size | sim | sim | sim | sim | sim |
| get_tuple_element | sim | sim | sim | sim | sim |
| if | sim | revisitar | sim | não | sim |
| imagem | sim | sim | sim | sim | sim |
| entrada | sim | sim | inviável | não | sim |
| Iota | sim | sim | inviável | sim | sim |
| is_finite | sim | sim | sim | sim | sim |
| log | sim | sim | sim | sim | sim |
| log_plus_one | sim | sim | sim | sim | sim |
| logística | sim | sim | sim | sim | sim |
| mapa | sim | revisitar | sim | não | sim |
| máximo | sim | sim | sim | sim | sim |
| mínimo | sim | sim | sim | sim | sim |
| multiplicar | sim | sim | sim | sim | sim |
| negate | sim | sim | sim | sim | sim |
| não | sim | sim | sim | sim | sim |
| optimization_barrier | sim | sim | sim | sim | sim |
| ou | sim | sim | sim | sim | sim |
| saída | sim | sim | sim | não | sim |
| almofada | sim | sim | sim | sim | sim |
| partition_id | sim | sim | sim | sim | sim |
| Popcnt | sim | sim | sim | sim | sim |
| potência | sim | sim | sim | sim | sim |
| real | sim | sim | sim | sim | sim |
| real_dynamic_slice | não | revisitar | não | sim | não |
| recv | sim | sim | inviável | não | sim |
| reduce | sim | revisitar | sim | revisitar | sim |
| reduce_precision | sim | sim | sim | sim | sim |
| reduce_scatter | sim | revisitar | não | não | sim |
| reduce_window | sim | revisitar | sim | não | sim |
| restante | sim | sim | sim | sim | sim |
| replica_id | sim | sim | sim | sim | sim |
| remodelar | sim | sim | inviável | sim | sim |
| return | não | revisitar | inviável | sim | sim |
| anular | sim | sim | sim | sim | sim |
| RG | sim | sim | sim | sim | revisitar |
| rng_bit_generator | sim | revisitar | inviável | sim | revisitar |
| round_nearest_afz | sim | sim | sim | sim | sim |
| round_nearest_even | sim | sim | sim | sim | sim |
| rsqrt | sim | sim | sim | sim | sim |
| scatter | sim | revisitar | sim | não | sim |
| select | sim | sim | sim | sim | sim |
| select_and_scatter | sim | revisitar | sim | não | sim |
| send | sim | sim | sim | não | sim |
| set_dimension_size | não | sim* | sim* | sim | não |
| shift_left | sim | sim | sim | sim | sim |
| shift_right_arithmetic | sim | sim | sim | sim | sim |
| shift_right_logical | sim | sim | sim | sim | sim |
| de igual. | sim | sim | sim | sim | sim |
| seno | sim | sim | sim | sim | sim |
| slice | sim | sim | sim | não | sim |
| sort | sim | sim | sim | não | sim |
| sqrt | sim | sim | sim | sim | sim |
| subtract | sim | sim | sim | sim | sim |
| Tanh | sim | sim | sim | sim | sim |
| torch_index_select | não | revisitar | não | não | revisitar |
| transpor | sim | sim | sim | sim | sim |
| triangular_solve | sim | revisitar | sim | não | revisitar |
| tuple | sim | sim | sim | sim | sim |
| unary_einsum | não | revisitar | não | sim | revisitar |
| uniform_dequantize | sim | sim | sim | sim | não |
| uniform_quantize | sim | revisitar | inviável | sim | não |
| enquanto | sim | revisitar | sim | revisitar | sim |
| Xor | sim | sim | sim | sim | sim |
Inferência de tipos para operações quantizadas
A coluna Type Inference da tabela acima se destina a operações não quantizadas. Para a maioria das operações quantizadas, não
é viável inferir o tipo de resultado porque os parâmetros de quantização dos
tipos de resultado podem ser diferentes dos parâmetros dos operandos. Com exceção de
alguns casos em que os tipos de operando e resultado precisam corresponder de forma idêntica ou a op
tem restrições úteis para inferir o tipo de resultado, estas operações são listadas abaixo:
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, , , , , mapoptimization_barrieroutfeedpadrecvreducereduce_scatterreduce_windowreversescatterselect_and_scattersendslicesorttransposetupleuniform_dequantizedwhile