При инициализации StableHLO на основе MHLO мы унаследовали реализацию многих функций MHLO, включая форматирование текста, проверку и определение формы. Благодаря этому у нас уже есть значительный охват набора операций, но еще многое предстоит сделать для проверки существующих реализаций на полноту и предоставления новых реализаций там, где их нет.
Этот документ предназначен для разработчиков и пользователей, чтобы отслеживать прогресс в различных аспектах набора операций — спецификацию, верификацию, вывод типов, форматирование вывода, интерпретатор и т. д.
Как им пользоваться
Ход выполнения операции StableHLO, как указано в соответствующей строке, по конкретному аспекту, как указано в соответствующем столбце, отслеживается с помощью одной из следующих меток отслеживания.
- Общие этикетки
- Да : существует комплексная реализация.
- Нет : реализации нет, но работа над этим входит в план развития . Обратите внимание, что Verifier никогда не может быть помечен как «нет», поскольку ODS уже реализует некоторую проверку.
- Настраиваемые метки для верификатора и вывода типов.
- Да , такая реализация существует, и она соответствует семантике StableHLO .
- Да* : существует реализация, и она соответствует семантике XLA . Поскольку семантика XLA зачастую недостаточно документирована, мы используем hlo_verifier.cc и shape_inference.cc в качестве эталона.
- Повторюсь : реализация существует, но она не подпадает под категории «да» или «да*» — либо потому, что мы еще не провели ее аудит, либо потому, что провели и обнаружили проблемы.
- Неосуществимо : такой реализации нет, потому что это неосуществимо. Например, потому что тип результата операции нельзя определить по её операндам и атрибутам.
Статус
| Стабильная операция HLO | Спецификация | Проверка | Вывод типов | Красивая печать | Устный переводчик |
|---|---|---|---|---|---|
| пресс | да | да | да | да | да |
| добавлять | да | да | да | да | да |
| после всего | да | да | да | да | да |
| все_собирать | да | повторное посещение | нет | нет | да |
| все_редуцировать | да | повторное посещение | да | нет | да |
| все_всем | да | повторное посещение | да | нет | да |
| и | да | да | да | да | да |
| атан2 | да | да | да | да | да |
| batch_norm_grad | да | повторное посещение | да | нет | повторное посещение |
| batch_norm_inference | да | повторное посещение | да | нет | повторное посещение |
| batch_norm_training | да | повторное посещение | да | нет | повторное посещение |
| bitcast_convert | да | да | нецелесообразно | да | да |
| транслировать | нет | да* | да* | да | повторное посещение |
| broadcast_in_dim | да | да | нецелесообразно | да | да |
| случай | да | повторное посещение | да | нет | да |
| cbrt | да | да | да | да | да |
| потолок | да | да | да | да | да |
| холески | да | да | да | да | повторное посещение |
| зажим | да | повторное посещение | да | да | да |
| коллективная_трансляция | да | повторное посещение | да | нет | да |
| коллективная_потеря | да | повторное посещение | да | нет | да |
| сравнивать | да | да | да | да | да |
| сложный | да | да | да | да | да |
| композитный | да | да | нецелесообразно | да | да |
| конкатенировать | да | да | да | да | да |
| постоянный | да | да | да | да | да |
| конвертировать | да | да | нецелесообразно | да | да |
| свертка | да | да | нецелесообразно | повторное посещение | да |
| косинус | да | да | да | да | да |
| count_leading_zeros | да | да | да | да | да |
| создать_токен | нет | да* | да* | да | повторное посещение |
| сумма перекрестных реплик | нет | повторное посещение | да* | нет | повторное посещение |
| пользовательский_вызов | да | да | нецелесообразно | да | да |
| разделять | да | да | да | да | да |
| точка | нет | повторное посещение | нецелесообразно | да | повторное посещение |
| dot_general | да | повторное посещение | нецелесообразно | нет | да |
| dynamic_broadcast_in_dim | да | да | нецелесообразно | да | повторное посещение |
| динамический_конв | да | да | нецелесообразно | повторное посещение | повторное посещение |
| динамический_сбор | да | да | нецелесообразно | нет | повторное посещение |
| dynamic_iota | да | да | нецелесообразно | да | повторное посещение |
| динамический_пад | да | да | нецелесообразно | да | повторное посещение |
| динамическая_изменение | да | да | нецелесообразно | да | повторное посещение |
| динамический_срез | да | да | да | да | да |
| dynamic_update_slice | да | да | да | да | да |
| эйнсум | нет | повторное посещение | нет | да | повторное посещение |
| экспоненциальный | да | да | да | да | да |
| экспоненциальный_минус_один | да | да | да | да | да |
| fft | да | повторное посещение | да | да | да |
| пол | да | да | да | да | да |
| собирать | да | да | да | нет | да |
| get_dimension_size | да | да | да | да | да |
| get_tuple_element | да | да | да | да | да |
| если | да | повторное посещение | да | нет | да |
| изображение | да | да | да | да | да |
| подача | да | да | нецелесообразно | нет | да |
| йота | да | да | нецелесообразно | да | да |
| is_finite | да | да | да | да | да |
| бревно | да | да | да | да | да |
| log_plus_one | да | да | да | да | да |
| логистика | да | да | да | да | да |
| карта | да | повторное посещение | да | нет | да |
| максимум | да | да | да | да | да |
| минимум | да | да | да | да | да |
| умножить | да | да | да | да | да |
| отрицать | да | да | да | да | да |
| нет | да | да | да | да | да |
| оптимизация_барьер | да | да | да | да | да |
| или | да | да | да | да | да |
| выход | да | да | да | нет | да |
| подушка | да | да | да | да | да |
| partition_id | да | да | да | да | да |
| попкнт | да | да | да | да | да |
| власть | да | да | да | да | да |
| настоящий | да | да | да | да | да |
| реальный_динамический_срез | нет | повторное посещение | нет | да | нет |
| рекв | да | да | нецелесообразно | нет | да |
| уменьшать | да | повторное посещение | да | повторное посещение | да |
| reduce_precision | да | да | да | да | да |
| reduce_scatter | да | повторное посещение | нет | нет | да |
| reduce_window | да | повторное посещение | да | нет | да |
| остаток | да | да | да | да | да |
| replica_id | да | да | да | да | да |
| изменить форму | да | да | нецелесообразно | да | да |
| возвращаться | нет | повторное посещение | нецелесообразно | да | да |
| обеспечить регресс | да | да | да | да | да |
| рнг | да | да | да | да | повторное посещение |
| rng_bit_generator | да | повторное посещение | нецелесообразно | да | повторное посещение |
| round_nearest_afz | да | да | да | да | да |
| округление_ближайшего_четного | да | да | да | да | да |
| rsqrt | да | да | да | да | да |
| рассеяние | да | повторное посещение | да | нет | да |
| выбирать | да | да | да | да | да |
| select_and_scatter | да | повторное посещение | да | нет | да |
| отправлять | да | да | да | нет | да |
| set_dimension_size | нет | да* | да* | да | нет |
| сдвиг_влево | да | да | да | да | да |
| сдвиг_вправо_арифметика | да | да | да | да | да |
| сдвиг_правый_логический | да | да | да | да | да |
| знак | да | да | да | да | да |
| синус | да | да | да | да | да |
| ломтик | да | да | да | нет | да |
| сортировка | да | да | да | нет | да |
| кв. рт. | да | да | да | да | да |
| вычесть | да | да | да | да | да |
| загар | да | да | да | да | да |
| танх | да | да | да | да | да |
| torch_index_select | нет | повторное посещение | нет | нет | повторное посещение |
| транспонировать | да | да | да | да | да |
| triangular_solve | да | повторное посещение | да | нет | повторное посещение |
| кортеж | да | да | да | да | да |
| unary_einsum | нет | повторное посещение | нет | да | повторное посещение |
| uniform_dequantize | да | да | да | да | да |
| uniform_quantize | да | повторное посещение | нецелесообразно | да | да |
| пока | да | повторное посещение | да | повторное посещение | да |
| хор | да | да | да | да | да |
Вывод типов для квантованных операций
Столбец Type Inference в таблице выше предназначен для анализа неквантованных операций. Для большинства квантованных операций определить тип результата невозможно, поскольку параметры квантования типов результатов могут отличаться от параметров квантования операндов. За исключением нескольких случаев, когда типы операнда и результата должны совпадать идентично, или операция имеет ограничения, полезные для определения типа результата, такие операции перечислены ниже: 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 , outfeed , pad , recv , reduce , reduce_scatter , reduce_window , reverse , scatter , select_and_scatter , send , slice , sort , transpose , tuple , uniform_dequantized , while .