-sdy-add-data-flow-edges
Вставляет DataFlowEdgeOp
для каждого края потока данных.
Вставляет DataFlowEdgeOp
для каждого значения, являющегося владельцем ребра потока данных, т. е. все значения, возвращаемые getDataFlowEdgeOwners
для каждой операции в модуле.
Вставленный DataFlowEdgeOp
будет использовать существующее сегментирование целевого объекта-владельца, если оно существует.
-sdy-apply-sharding-constraints
Применяет ограничения, определяющие сегментацию входных данных.
Копирует сегментирование ShardingConstraintOp
на свой вход, если оно удовлетворяет всем следующим условиям:
- Входные данные не имеют существующего шардинга.
- Шардинг
ShardingConstraintOp
полностью закрыт. - На входе нет других пользователей типа
ShardingConstraintOp
илиManualComputationOp
с другим шардингом.
Эти условия указывают на то, что ShardingConstraintOp
диктует шардинг своих входных данных.
Если входные данные являются целью границы потока данных, то вместо установки сегментации операции мы заменяем все использования input
на ShardingConstraintOp
, чтобы избежать ограничения сегментации всех целей границы.
Обратите внимание, что сегментирование ShardingConstraintOp
будет распространяться на его входные данные или пользователей во время распространения независимо от этого прохода, но поскольку закрытое свойство измерения не распространяется, важно скопировать сегментирование, чтобы полностью соблюдать ограничение в вышеуказанных случаях.
Кроме того, если тензор используется цепочкой ShardingConstraintOp
, которая удовлетворяет всем следующим условиям:
- Тензор не создается
ShardingConstraintOp
и не имеет других пользователей типаShardingConstraintOp
илиManualComputationOp
; - Ни один из
ShardingConstraintOp
в цепочке не имеет более одного использования, за исключением последнего; - Последний
ShardingConstraintOp
в цепочке не имеет пользователей типаShardingConstraintOp
илиManualComputationOp
(иначе он не последний в цепочке);
то этот проход заменяет все другие использования входных данных цепочки, то есть:
- Не являются функцией
func.return
op; - Определяются после последнего
ShardingConstraintOp
в цепочке (и внутри того же блока)
с результатом цепочки, поскольку он должен определять разделение этих использований.
-sdy-constant-or-scalar-splitter
Разделяет константные и скалярные расширения таким образом, чтобы каждое из них имело единственное применение.
Разделяет константные подвычисления и скалярные расширения таким образом, чтобы у них был один пользователь.
Это гарантирует, что шардинг не будет распространяться между различными вариантами использования константного подвычисления, поскольку это считается ложной зависимостью (варианты использования константы не должны шардироваться одинаково только потому, что они используют одну и ту же константу). По сути, каждое использование может иметь свой шардинг, который может распространяться изолированно на свою собственную копию константного подвычисления.
Константное подвычисление — это либо:
- константа или йота-оператор (без операндов)
- широковещательная, переформировывающая, нарезающая или чистая поэлементная операция, операнды которой определяются константными подвычислениями (рекурсивно), вместе со всеми подвычислениями, которые определяют ее операнды.
Скалярное расширение — это трансляция скаляра.
Обратите внимание, что в рамках постоянного подвычисления одно и то же значение может иметь несколько применений в рамках этого подвычисления.
Также обратите внимание, что этот проход не разделяет скалярные тензоры, поскольку они не сегментируются (имеют ранг 0).
-sdy-inline-meshes
Встраивает MeshAttr
в TensorShardingAttr
.
Заменяет имена символов сетки в TensorShardingAttr
на встроенные MeshAttr
и удаляет все неиспользуемые MeshOp
.
-sdy-lift-inlined-meshes
Поднимает встроенные MeshAttr
в шардингах как символы MeshOp
.
Заменяет любой встроенный MeshAttr
в TensorShardingAttr
на имя символа сетки, ссылающееся либо на существующий, либо на новый MeshOp
в модуле, так что никакие два MeshOp
не имеют одинакового MeshAttr
(существующие MeshOp
также дедуплицируются).
Название каждого нового MeshOp
будет следующим:
-
maximal_mesh_{device-id}
, для максимальной сетки (т. е. пустой список осей и один идентификатор устройства), или - Первое доступное имя в [
mesh
,mesh_0
,mesh_1
, ...].
-sdy-manual-axes-cleanup
Упрощает использование ручных осей в ManualComputationOp
.
- Для любого шардинга «вход/выход», для которого не указана ручная ось, добавьте эту ручную ось в replicated_axes. Это необходимо для того, чтобы ручные оси всегда были полностью указаны.
- Сортирует ручные оси в порядке объявления осей сетки.
Кроме того, если ручное вычисление не имеет входных или выходных данных и непустое тело, этот проход завершится неудачей.
-sdy-remove-size-one-axes
Удаляет оси размера один из шардингов.
Удаляет оси размера один из всех операций шардинга и ручных вычислений, чтобы избежать конфликтов при распространении, возникающих из-за таких осей. Обратите внимание, что оси в сетках не удаляются.
-sdy-sharding-group-import
Канонизация и валидация проходят для групп шардинга.
Применяет канонизацию и валидацию к группам шардинга при импорте. А именно:
Объединение групп Sharding
Объединяет группы шардинга, используя транзитивное свойство членства в группе. Если тензор T находится в группах шардинга G1 и G2, то можно сделать вывод, что все элементы в G1 и G2 должны быть шардированы одинаково. Таким образом, мы можем объединить G1 и G2 в одну группу. Набор канонических идентификаторов групп после слияния будет иметь вид 0, 1, ...N-1 для минимального набора групп.
Проверка группы Sharding
Проверяет правильность формирования групп шардинга и их соответствие предположениям реализации. В настоящее время это означает, что если группа шардинга содержит
Value
определённое внутри блокаManualComputationOp
, то все остальные значения в этой группе должны находиться в том же блоке.