Status do StableHLO

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