-sdy-add-data-flow-edges
Insere DataFlowEdgeOp
para cada borda do fluxo de dados.
Insere DataFlowEdgeOp
para cada valor que é proprietário de uma borda de fluxo de dados, ou seja, todos os valores retornados por getDataFlowEdgeOwners
em cada operação no módulo.
O DataFlowEdgeOp
inserido vai usar o fragmentação existente do destino
do proprietário, se ele existir.
TODO(b/330339693): atualizar este documento quando getDataFlowEdgeOwners
for removido.
-sdy-apply-sharding-constraints
Aplica restrições que determinam a fragmentação da entrada.
Copia a fragmentação de um ShardingConstraintOp
para a entrada se satisfizer
todos os itens a seguir:
- A entrada não tem um sharding.
- A entrada não é produzida por um
DataFlowEdgeOp
, que mantém o fragmentação de todos os destinos da borda. - O sharding do
ShardingConstraintOp
está totalmente fechado. - A entrada não tem outros usuários do tipo
ShardingConstraintOp
ouManualComputationOp
com uma fragmentação diferente.
O que indica que o ShardingConstraintOp
determina a fragmentação da
entrada.
O fragmentação de um ShardingConstraintOp
vai se propagar para a entrada ou os usuários durante a propagação, independentemente desse passe. No entanto, como a propriedade fechada de uma dimensão não se propaga, é importante copiar a fragmentação para respeitar totalmente a restrição nos casos acima.
Além disso, se um tensor for usado por uma cadeia de ShardingConstraintOp
s que
atenda a todos os itens a seguir:
- O tensor não é produzido por um
ShardingConstraintOp
e não tem outros usuários do tipoShardingConstraintOp
ouManualComputationOp
. - Nenhum dos
ShardingConstraintOp
s na cadeia tem mais de um uso, exceto o último. - O último
ShardingConstraintOp
na cadeia não tem usuários do tipoShardingConstraintOp
ouManualComputationOp
. Caso contrário, ele não é o último na cadeia.
Esse cartão substitui todos os outros usos da entrada da cadeia, que são
definidos após o último ShardingConstraintOp
na cadeia (e no
mesmo bloco) com o resultado da cadeia, já que ele determina o fragmentação
desses usos.
-sdy-constant-splitter
Divide as subcomputações constantes para que cada uma tenha um único uso.
Divide as subcomputações constantes para que elas tenham um único usuário.
Isso garante que um fragmentação não seja propagado entre diferentes usos de uma subcomputação constante, já que isso é considerado uma dependência falsa (os usos de uma constante não podem ser fragmentados da mesma maneira apenas porque usam a mesma constante). Na prática, cada uso pode ter um sharding diferente que pode ser propagado de forma isolada para a própria cópia da subcomputação constante.
Uma subcomputação constante é:
- uma operação constante ou iota (sem operandos)
- uma transmissão, fatia ou operação pura por elemento, em que todos os operandos são definidos por subcomputações constantes (recursivamente), junto com todas as subcomputações que definem os operandos.
Observe que, em uma subcomputação constante, um valor pode ter vários usos nessa subcomputação.
-sdy-lift-inlined-meshes
Aumento de MeshAttr
s inline em fragmentos como MeshOp
s de símbolo.
Substitui qualquer MeshAttr
inline em um TensorShardingAttr
por um nome de símbolo de malha, fazendo referência a um MeshOp
existente ou novo no módulo, de modo que
nenhum MeshOp
tenha um MeshAttr
idêntico (os MeshOp
s existentes também são
eliminados).
O nome de cada novo MeshOp
será:
maximal_mesh_{device-id}
, para uma malha máxima (ou seja, lista de eixos vazia e um único ID do dispositivo).- O primeiro nome disponível em [
mesh
,mesh_0
,mesh_1
, ...], caso contrário. ###-sdy-manual-axes-cleanup
Liberação do uso de eixos manuais em ManualComputationOp
s
1) Para qualquer divisão de entrada/saída que não tenha especificado um eixo manual, adicione esse eixo manual a replicated_axes. Isso garante que os eixos manuais sejam sempre totalmente especificados.
2) Classifica os eixos manuais na ordem de declaração dos eixos da malha.
-sdy-sharding-group-import
Passe de canonização e validação para grupos de fragmentação.
Aplica canonização e validação a grupos de fragmentação na importação. São eles:
1) Unificação de grupos de fragmentação: combina grupos de fragmentação usando a propriedade transitiva de associação a grupos. Sempre que um tensor T está em um grupo de fragmentação G1 e em um grupo de fragmentação G2, podemos inferir que todos os membros em G1 e G2 devem ser fragmentados da mesma maneira. Assim, podemos combinar G1 e G2 em um único grupo. O conjunto de IDs de grupo canônico após a mesclagem será 0,1,...N-1 para o conjunto mínimo de grupos.
2) Validação do grupo de fragmentação
Valida se os grupos de fragmentação estão bem formados e em conformidade com as suposições
na implementação. Atualmente, isso afirma que, se um grupo de fragmentação
contém um Value
definido dentro do bloco de um
ManualComputationOp
, todos os outros valores nesse grupo precisam residir no
mesmo bloco.