-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.
-sdy-apply-sharding-constraints
Applique des contraintes qui dictent le fractionnement de l'entrée.
Copier le fractionnement d'un ShardingConstraintOp
dans son entrée s'il répond à toutes les conditions suivantes:
- Le fractionnement de l'entrée n'existe pas.
- 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.
Ces conditions indiquent que ShardingConstraintOp
dicte le fractionnement de son entrée.
Si l'entrée est produite par un DataFlowEdgeOp
, au lieu de définir le fractionnement de l'opération, nous remplaçons toutes les utilisations de input
par ShardingConstraintOp
, afin d'éviter de limiter le fractionnement de toutes les cibles du bord.
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 tenseur n'est pas produit par un
ShardingConstraintOp
et n'a pas d'autres utilisateurs 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 afin que chacun ait un seul usage.
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 soit:
- 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 tous les MeshAttr
intégrés dans un TensorShardingAttr
par un nom de symbole de maillage, en référençant un MeshOp
existant ou nouveau dans le module, de sorte qu'aucun MeshOp
ne possède un MeshAttr
identique (les MeshOp
existants sont également dédupliqués).
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) ou- Premier nom disponible dans [
mesh
,mesh_0
,mesh_1
, ...].
-sdy-manual-axes-cleanup
Nettoie l'utilisation des axes manuels dans les ManualComputationOp
.
- Pour tout fractionnement "in/out" qui n'a pas spécifié d'axe manuel, ajoutez cet axe manuel à ses axes répliqués. Cela permet de s'assurer que les axes manuels sont toujours entièrement spécifiés.
- Trie les axes manuels dans l'ordre de déclaration des axes de maillage.
-sdy-sharding-group-import
La canonisation et la validation sont effectuées pour les groupes de partitionnement.
Applique la canonisation et la validation aux groupes de fractionnement lors de l'importation. Il s'agit des éléments suivants:
Unification de groupe de segmentation
Combine les groupes de partitionnement à l'aide de la propriété transitive de l'appartenance au groupe. Chaque fois qu'un tenseur T se trouve dans un groupe de fractionnement G1 et dans un groupe de fractionnement G2, nous pouvons en déduire que tous les membres de G1 et G2 doivent être fractionnés de la même manière. Nous pouvons donc 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.
Validation du groupe de fragmentation
Vérifie que les groupes de partitionnement sont bien formés et conformes aux hypothèses dans l'implémentation. Cela affirme actuellement que si un groupe de partitionnement contient un
Value
défini dans le bloc d'unManualComputationOp
, toutes les autres valeurs de ce groupe doivent se trouver dans le même bloc.