-sdy-add-data-flow-edges
Вставляет DataFlowEdgeOp для каждого ребра потока данных.
Вставляет DataFlowEdgeOp для каждого значения, являющегося владельцем ребра потока данных, то есть для всех значений, возвращаемых методами getBlockArgumentEdgeOwners и getOpResultEdgeOwners для каждого ShardableDataFlowOpInterface в модуле.
Вставленный DataFlowEdgeOp будет использовать существующее сегментирование целевого объекта-владельца, если оно существует.
-sdy-add-func-data-flow-edges
Вставляет FuncDataFlowEdgeOp для каждого ребра потока данных функции/вызова.
Вставляет FuncDataFlowEdgeOp для каждого аргумента функции и результата вызова.
-sdy-apply-sharding-constraints
Применяет ограничения, определяющие распределение входных данных по сегментам.
Копирует сегментацию объекта ShardingConstraintOp на его вход, если выполняются все следующие условия:
- Входные данные не имеют существующего сегментирования.
- Шардинг операции
ShardingConstraintOpполностью завершен. - Входные данные не содержат других пользователей типа
ShardingConstraintOpилиManualComputationOpс другим типом сегментирования.
Эти условия указывают на то, что ShardingConstraintOp определяет распределение входных данных по сегментам.
Если входные данные являются целевым элементом ребра потока данных, то вместо установки сегментирования операции мы заменяем все использования input на ShardingConstraintOp , чтобы избежать ограничения сегментирования всех целевых элементов ребра.
Обратите внимание, что сегментирование ShardingConstraintOp будет распространяться на его входные данные или пользователей во время распространения независимо от этого прохода, но поскольку свойство closed измерения не распространяется, важно скопировать сегментирование, чтобы полностью соблюдать ограничение в описанных выше случаях.
Кроме того, если тензор используется цепочкой операций ShardingConstraintOp , удовлетворяющих всем следующим условиям:
- Тензор не создан с помощью
ShardingConstraintOpи не имеет других пользователей типовShardingConstraintOpилиManualComputationOp; - Ни один из операторов
ShardingConstraintOpв цепочке не имеет более одного применения, за исключением последнего; - Последний
ShardingConstraintOpв цепочке не имеет пользователей типаShardingConstraintOpилиManualComputationOp(иначе он не был бы последним в цепочке);
Таким образом, этот проход заменяет все остальные случаи использования входных данных цепочки, а именно:
- Не являются операцией
func.return; - Определяются после последней
ShardingConstraintOpв цепочке (и в пределах одного блока).
В результате работы цепочки, как и должно быть, определяется распределение этих вариантов использования.
Параметры
-debug-sharding-origins : Whether to compute the debug origin shardings for constraints. See `debug-sharding-origins` option in propagation for more info.
-debug-propagation-edge-sharding : Whether to sink the debug propagation edge sharding info. See `debug-propagation-edge-sharding` option in propagation for more info.
-sdy-constant-or-scalar-splitter
Разделяет разложения на константы и скаляры, так что каждое из них может использоваться только для одной цели.
Разделяет вычисления констант и разложения по скалярам таким образом, чтобы ими мог управлять один пользователь.
Это гарантирует, что сегментирование не будет распространяться между различными использованиями подвычисления константы, поскольку это считается ложной зависимостью (использования константы не должны сегментироваться одинаково только потому, что они используют одну и ту же константу). По сути, каждое использование может иметь различное сегментирование, которое может распространяться изолированно на свою собственную копию подвычисления константы.
Постоянная субвычисление может быть либо:
- константа или йота-оператор (без операндов)
- Операция трансляции, изменения формы, нарезки или чисто поэлементная операция, операнды которой определяются постоянными подвычислениями (рекурсивно), а также всеми подвычислениями, определяющими ее операнды.
Скалярное разложение — это трансляция скалярной величины.
Обратите внимание, что в рамках одной константной подпрограммы одно и то же значение может иметь несколько применений в этой подпрограмме.
Также следует отметить, что этот проход не разделяет скалярные тензоры, поскольку они не подвергаются сегментации (они имеют ранг 0).
-sdy-explicit-gather-scatter-batching
Преобразует неявные размерности пакетов в операциях сбора/рассеивания в явные размерности пакетов.
Определяет неявные размерности пакетов в операциях stablehlo.gather и stablehlo.scatter и преобразует их в явные размерности пакетов операндов/начальных индексов.
-sdy-flatten-call-graph
Сглаживает график звонков.
Сглаживает график звонков.
-sdy-import-func-calls
Встраивание вызовов в NamedComputationOp .
Создает проход для преобразования CallOp в NamedComputationOp с встроенным телом функции и именем вызываемой функции. Обратите внимание, что тела функций клонируются, если функция используется несколькими вызовами.
В случае, если для одной и той же вызываемой функции выполняется несколько операций вызова, мы клонируем тело функции для каждой операции вызова и выдадим предупреждение.
Параметры
-add-data-flow-edges-on-named-computations : Whether to add data flow edges on named computations.
-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-pre-order-funcs
Переупорядочивает функции в модуле в порядке предварительного вызова графа вызовов.
Переупорядочивает функции в модуле в порядке предварительного вызова графа. Это полезно при встраивании функций/вызовов, поскольку распространение происходит сверху вниз по блокам, и итерация в порядке предварительного вызова функций будет это имитировать.
-sdy-propagate-sharding-from-func-to-call
Если поле пустое, установите размер сегментов результата вызова равным размеру сегментов результата функции.
Создает проход для распространения сегментации результатов функции на сегментацию результатов вызова, если функция вызова не имеет сегментации результатов, а функция — имеет. Примечательно, что он сохраняет сегментацию результатов вызова, если у вызова уже есть сегментация результатов, даже если все отдельные сегменты результатов пусты.
-sdy-remove-size-one-axes
Удаляет оси первого размера из фрагментов.
Удаляет оси размером в единицу из всех сегментов и операций ручных вычислений, чтобы избежать конфликтов при распространении, вызванных такими осями. Обратите внимание, что оси в сетках не удаляются.
-sdy-sharding-group-import
Канонизация и проверка для групп сегментирования.
Применяет канонизацию и проверку к группам сегментирования при импорте. В частности, это:
Объединение групп шардинга
Объединяет группы сегментации, используя транзитивное свойство принадлежности к группе. Всякий раз, когда тензор T находится в группе сегментации G1 и группе сегментации G2, можно сделать вывод, что все члены G1 и G2 должны быть сегментированы одинаковым образом. Таким образом, мы можем объединить G1 и G2 в одну группу. Множество канонических идентификаторов групп после слияния будет равно 0, 1, ... N-1 для минимального набора групп.
Проверка группы сегментирования
Проверяет корректность формирования групп сегментирования и их соответствие предположениям, заложенным в реализации. В настоящее время это означает, что если группа сегментирования содержит
Valueопределенное внутри блокаManualComputationOp, то все остальные значения в этой группе должны находиться в том же блоке.