-sdy-add-data-flow-edges
Inserisce DataFlowEdgeOp
per ogni bordo del flusso di dati.
Inserisce DataFlowEdgeOp
per ogni valore che è proprietario di un angolo del flusso di dati, ovvero tutti i valori restituiti da getDataFlowEdgeOwners
in ogni op nel modulo.
Il valore DataFlowEdgeOp
inserito assumerà lo sharding esistente del proprietario
target, se esistente.
-sdy-apply-sharding-constraints
Applica vincoli che determinano lo sharding dei dati in input.
Copia lo sharding di un ShardingConstraintOp
al suo input se soddisfa tutte le seguenti condizioni:
- L'input non ha uno sharding esistente.
- La suddivisione in parti di
ShardingConstraintOp
è completamente chiusa. - L'input non ha altri utenti di tipo
ShardingConstraintOp
oManualComputationOp
con un'organizzazione in partizioni diversa.
Queste condizioni indicano che ShardingConstraintOp
determina lo sharding del suo input.
Se l'input è prodotto da un DataFlowEdgeOp
, anziché impostare lo sharding dell'operazione, sostituiamo tutti gli utilizzi di input
con ShardingConstraintOp
per evitare di limitare lo sharding di tutti i target dell'edge.
Tieni presente che lo sharding di un ShardingConstraintOp
verrà propagato ai relativi input o utenti durante la propagazione, indipendentemente da questo passaggio, ma poiché la proprietà chiusa di una dimensione non si propaga, è importante copiare lo sharding per rispettare completamente il vincolo nei casi precedenti.
Inoltre, se un tensore viene utilizzato da una catena di ShardingConstraintOp
chesoddisfano tutte le seguenti condizioni:
- Il tensore non è prodotto da un
ShardingConstraintOp
e non ha altri utenti di tipoShardingConstraintOp
oManualComputationOp
. - Nessuno dei
ShardingConstraintOp
della catena ha più di un utilizzo tranne l'ultimo. - L'ultimo
ShardingConstraintOp
della catena non ha utenti di tipoShardingConstraintOp
oManualComputationOp
(altrimenti non è l'ultimo della catena);
in questo caso, questo passaggio sostituisce tutti gli altri utilizzi dell'input della catena, definiti dopo l'ultimo ShardingConstraintOp
della catena (e all'interno dello stesso blocco), con il risultato della catena, in quanto dovrebbe dettare lo sharding di questi utilizzi.
-sdy-constant-splitter
Suddivide i sottocalcoli costanti in modo che ciascuno abbia un solo utilizzo.
Suddivide i sottocalcoli costanti in modo che abbiano un unico utente.
In questo modo, lo sharding non viene propagato tra usi diversi di un calcolo parziale costante, in quanto si tratta di una falsa dipendenza (gli utilizzi di una costante non devono essere suddivisi nello stesso modo solo perché utilizzano la stessa costante). In effetti, ogni utilizzo può avere un'organizzazione in parti diverse che può propagarsi in modo isolato alla propria copia del sottocalcolo costante.
Un sottocalcolo costante è:
- un operatore costante o iota (senza operandi)
- un'operazione di trasmissione, di taglio o puramente elemento per elemento, i cui operandi sono tutti definiti da sottocalcoli costanti (in modo ricorsivo), insieme a tutti i sottocalcoli che definiscono i suoi operandi.
Tieni presente che all'interno di un sottocalcolo costante, un valore può avere più utilizzi all'interno di quel sottocalcolo.
-sdy-lift-inlined-meshes
Eleva i MeshAttr
in linea nei sharding come simboli MeshOp
.
Sostituisce qualsiasi MeshAttr
in linea in un TensorShardingAttr
con un nome del simbolo della maglia, facendo riferimento a un MeshOp
esistente o nuovo nel modulo, in modo che nessun MeshOp
abbia un MeshAttr
identico (anche i MeshOp
esistenti vengono deduplicati).
Il nome di ogni nuovo MeshOp
sarà:
maximal_mesh_{device-id}
per una mesh massima (ad es. un elenco di assi vuoto e un singolo ID dispositivo) oppure- Il primo nome disponibile in [
mesh
,mesh_0
,mesh_1
, ...].
-sdy-manual-axes-cleanup
Elimina l'utilizzo degli assi manuali nei ManualComputationOp
- Per qualsiasi suddivisione in/out per cui non è stato specificato un asse manuale, aggiungi questo asse manuale a replicated_axes. In questo modo, gli assi manuali sono sempre completamente specificati.
- Ordina gli assi manuali nell'ordine di dichiarazione dell'asse del mesh.
-sdy-sharding-group-import
Passaggio di convalida e canonizzazione per i gruppi di sharding.
Applica la canonizzazione e la convalida ai gruppi di sharding al momento dell'importazione. ovvero:
Unificazione dei gruppi di shard
Combina i gruppi di sharding utilizzando la proprietà transitiva dell'appartenenza al gruppo. Ogni volta che un tensore T si trova in un gruppo di suddivisione G1 e in un gruppo di suddivisione G2, possiamo dedurre che tutti i membri di G1 e G2 devono essere suddivisi nello stesso modo. Pertanto, possiamo combinare G1 e G2 in un unico gruppo. L'insieme di ID gruppo canonici dopo l'unione sarà 0,1,...N-1 per l'insieme minimo di gruppi.
Convalida del gruppo di suddivisione
Verifica che i gruppi di sharding siano ben formattati e conformi alle ipotesi all'interno dell'implementazione. Al momento, viene affermato che se un gruppo di suddivisione contiene un
Value
definito all'interno del blocco di unManualComputationOp
, tutti gli altri valori del gruppo devono trovarsi nello stesso blocco.