-sdy-add-data-flow-edges
Inserta DataFlowEdgeOp
para cada borde de flujo de datos.
Inserta DataFlowEdgeOp
para cada valor que sea propietario de un borde de flujo de datos, es decir, todos los valores que muestra getDataFlowEdgeOwners
en cada operación del módulo.
El DataFlowEdgeOp
insertado tomará la fragmentación existente del destino del propietario, si existe.
TODO(b/330339693): Actualiza este documento cuando se quite getDataFlowEdgeOwners
.
-sdy-apply-sharding-constraints
Aplica restricciones que dictan la fragmentación de su entrada.
Copia la fragmentación de una ShardingConstraintOp
en su entrada si cumple con los siguientes requisitos:
- La entrada no tiene una fragmentación existente.
- Un
DataFlowEdgeOp
no produce la entrada, que contiene el fragmentación de todos los destinos del borde. - La fragmentación de
ShardingConstraintOp
está completamente cerrada. - La entrada no tiene otros usuarios de tipo
ShardingConstraintOp
oManualComputationOp
con un fragmento diferente.
Lo que indica que el ShardingConstraintOp
dicta el fragmentación de su entrada.
Ten en cuenta que la fragmentación de un ShardingConstraintOp
se propagará a su entrada o a los usuarios durante la propagación, independientemente de este pase, pero como la propiedad cerrada de una dimensión no se propaga, es importante copiar la fragmentación para respetar por completo la restricción en los casos anteriores.
Además, si una cadena de ShardingConstraintOp
que cumple con todos los siguientes requisitos usa un tensor:
- Un
ShardingConstraintOp
no produce el tensor y no tiene ningún otro usuario de tipoShardingConstraintOp
oManualComputationOp
. - Ninguno de los
ShardingConstraintOp
de la cadena tiene más de un uso, excepto el último. - El último
ShardingConstraintOp
de la cadena no tiene ningún usuario de tipoShardingConstraintOp
oManualComputationOp
(de lo contrario, no es el último de la cadena).
Luego, este pase reemplaza todos los demás usos de la entrada de la cadena, que se definen después del último ShardingConstraintOp
de la cadena (y dentro del mismo bloque), con el resultado de la cadena, ya que debería dictar la fragmentación de esos usos.
-sdy-constant-splitter
Divide los cálculos secundarios constantes para que cada uno tenga un solo uso.
Divide los subcálculos constantes de modo que tengan un solo usuario.
Esto garantiza que no se propague un fragmento entre diferentes usos de un subcálculo constante, ya que se considera una dependencia falsa (los usos de una constante no deben fragmentarse de la misma manera solo porque usan la misma constante). De hecho, cada uso puede tener una fragmentación diferente que se puede propagar de forma aislada a su propia copia del subprocesamiento constante.
Una subcomputación constante puede ser una de las siguientes:
- una operación iota o constante (sin operandos)
- una operación de transmisión, división o elemento puro, cuyos operandos se definen por subcálculos constantes (de forma recursiva), junto con todas las subcálculos que definen sus operandos.
Ten en cuenta que, dentro de una subcomputación constante, un valor puede tener varios usos dentro de esa subcomputación.
-sdy-lift-inlined-meshes
Eleva los MeshAttr
intercalados en los fragmentos como MeshOp
de símbolos.
Reemplaza cualquier MeshAttr
intercalado en un TensorShardingAttr
con un nombre de símbolo de malla, que hace referencia a un MeshOp
existente o nuevo del módulo, de modo que no haya dos MeshOp
con un MeshAttr
idéntico (también se eliminan los duplicados de los MeshOp
existentes).
El nombre de cada MeshOp
nuevo será uno de los siguientes:
maximal_mesh_{device-id}
, para una malla máxima (es decir, una lista de ejes vacía y un solo ID de dispositivo)- El primer nombre disponible en [
mesh
,mesh_0
,mesh_1
, …], de lo contrario. ###-sdy-manual-axes-cleanup
Limpia el uso de ejes manuales en ManualComputationOp
1) Para cualquier fragmentación de entrada o salida que no haya especificado un eje manual, agrega ese eje manual a sus ejes replicados. Esto se hace para garantizar que los ejes manuales siempre se especifiquen por completo.
2) Ordena los ejes manuales en el orden de declaración del eje de malla.
-sdy-sharding-group-import
Pasa la canonización y la validación para los grupos de fragmentación.
Aplica la canonización y la validación a los grupos de fragmentación durante la importación. Estos son los siguientes:
1) Unificación de grupos de fragmentación: Combina los grupos de fragmentación con la propiedad transitiva de la membresía del grupo. Cada vez que un tensor T está en un grupo de fragmentación G1 y en el grupo de fragmentación G2, podemos inferir que todos los miembros en G1 y G2 deben fragmentarse de la misma manera. Por lo tanto, podemos combinar G1 y G2 en un solo grupo. El conjunto de IDs de grupo canónicos después de la combinación será 0,1,…,N-1 para el conjunto mínimo de grupos.
2) Validación de grupos de fragmentación: Verifica que los grupos de fragmentación estén bien formados y cumplan con las suposiciones de la implementación. Actualmente, se afirma que, si un grupo de fragmentación contiene un Value
definido dentro del bloque de un ManualComputationOp
, todos los demás valores de ese grupo deben residir en el mismo bloque.