-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 ou ManualComputationOp 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 type ShardingConstraintOp ou ManualComputationOp.
  • 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 type ShardingConstraintOp ou ManualComputationOp (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.