-sdy-add-data-flow-edges
Insère DataFlowEdgeOp
pour chaque arête de flux de données.
Insère DataFlowEdgeOp
pour chaque valeur propriétaire d'un bord de flux de données, c'est-à-dire toutes les valeurs renvoyées par getDataFlowEdgeOwners
pour chaque opération du module.
Le DataFlowEdgeOp
inséré utilisera le fractionnement existant de la cible propriétaire, le cas échéant.
TODO(b/330339693): mettre à jour ce document lorsque getDataFlowEdgeOwners
sera supprimé.
-sdy-apply-sharding-constraints
Applique des contraintes qui dictent la segmentation de l'entrée.
Copier le fractionnement d'un ShardingConstraintOp
dans son entrée s'il répond à toutes les conditions suivantes:
- L'entrée ne comporte pas de segmentation.
- L'entrée n'est pas générée par un
DataFlowEdgeOp
, qui contient le fractionnement de toutes les cibles du bord. - Le fractionnement de l'
ShardingConstraintOp
est complètement fermé. - L'entrée ne comporte aucun autre utilisateur de type
ShardingConstraintOp
ouManualComputationOp
avec un fractionnement différent.
Ce qui indique que ShardingConstraintOp
dicte le fractionnement de son entrée.
Notez que le fractionnement d'un ShardingConstraintOp
se propage vers son entrée ou ses utilisateurs lors de la propagation, quelle que soit cette étape. Toutefois, comme la propriété fermée d'une dimension ne se propage pas, il est important de copier le fractionnement pour respecter pleinement la contrainte dans les cas ci-dessus.
De plus, si un tenseur est utilisé par une chaîne de ShardingConstraintOp
qui remplit toutes les conditions suivantes:
- Le Tensor n'est pas produit par un élément
ShardingConstraintOp
et ne compte aucun autre utilisateur de typeShardingConstraintOp
ouManualComputationOp
. - Aucun des
ShardingConstraintOp
de la chaîne n'est utilisé plus d'une fois, à l'exception du dernier. - Le dernier
ShardingConstraintOp
de la chaîne ne comporte aucun utilisateur de typeShardingConstraintOp
ouManualComputationOp
(sinon, il ne s'agit pas du dernier de la chaîne).
Cette carte remplace alors toutes les autres utilisations de l'entrée de la chaîne, définies après le dernier ShardingConstraintOp
de la chaîne (et dans le même bloc), par le résultat de la chaîne, car elle doit dicter le fractionnement de ces utilisations.
-sdy-constant-splitter
Divise les sous-calculs constants de sorte que chacun d'eux ne soit utilisé qu'une seule fois.
Divisez les sous-calculs constants de sorte qu'ils aient un seul utilisateur.
Cela garantit qu'un fractionnement n'est pas propagé entre les différentes utilisations d'un sous-calcul constant, car cela est considéré comme une fausse dépendance (les utilisations d'une constante ne doivent pas être fractionnées de la même manière simplement parce qu'elles utilisent la même constante). En effet, chaque utilisation peut avoir un fractionnement différent qui peut se propager de manière isolée à sa propre copie du sous-calcul constant.
Un sous-calcul constant est:
- une opération constante ou iota (sans opérandes)
- une opération de diffusion, de tranche ou par élément pur, dont les opérandes sont tous définis par des sous-calculs constants (récursivement), ainsi que l'ensemble des sous-calculs qui définissent ses opérandes.
Notez qu'une valeur peut avoir plusieurs utilisations dans un sous-calcul constant.
-sdy-lift-inlined-meshes
Transfère les MeshAttr
intégrés dans les fractionnements en tant que symboles MeshOp
.
Remplace toute MeshAttr
intégrée dans un TensorShardingAttr
par un nom de symbole de maillage, en référençant un MeshOp
existant ou un nouveau MeshOp
dans le module, de sorte qu'il n'y ait pas deux MeshOp
avec un MeshAttr
identique (les MeshOp
existantes sont également doublées).
Le nom de chaque nouvelle MeshOp
sera:
maximal_mesh_{device-id}
, pour un maillage maximal (c'est-à-dire une liste d'axes vide et un seul ID d'appareil).- Le premier nom disponible dans [
mesh
,mesh_0
,mesh_1
, ...], sinon. ###-sdy-manual-axes-cleanup
Nettoie l'utilisation des axes manuels dans les ManualComputationOp
.
1) Pour tout fractionnement "in/out" qui n'a pas spécifié d'axe manuel, ajoutez cet axe manuel à ses axes répliqués. Vous vous assurez ainsi que les axes manuels sont toujours entièrement spécifiés.
2) Trie les axes manuels dans l'ordre de déclaration des axes manuels.
-sdy-sharding-group-import
La canonisation et la validation sont effectuées pour les groupes de partitionnement.
Applique la mise en forme canonique et la validation aux groupes de segmentation lors de l'importation. Il s'agit des éléments suivants:
1) Unification des groupes de fragmentation : combine les groupes de fragmentation à l'aide de la propriété transitive de l'appartenance au groupe. Chaque fois qu'un Tensor T se trouve dans un groupe de segmentation G1 et dans le groupe de segmentation G2, nous pouvons en déduire que tous les membres de G1 et G2 doivent être segmentés de la même manière. Il est ainsi possible de combiner G1 et G2 en un seul groupe. L'ensemble des ID de groupe canoniques après la fusion sera 0,1,...N-1 pour l'ensemble minimal de groupes.
2) Validation du groupe de fragmentation Vérifie que les groupes de fragmentation sont bien formés et conformes aux hypothèses dans l'implémentation. Cette assertion indique actuellement que si un groupe de partitionnement contient un Value
défini dans le bloc d'un ManualComputationOp
, toutes les autres valeurs de ce groupe doivent se trouver dans le même bloc.