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