-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.
-sdy-apply-sharding-constraints
Aplica restrições que determinam o sharding da entrada.
Copia o sharding de um ShardingConstraintOp
para a entrada se ele atender
a todos os seguintes requisitos:
- A entrada não tem um sharding.
- O fragmentação do
ShardingConstraintOp
está totalmente concluída. - A entrada não tem outros usuários do tipo
ShardingConstraintOp
ouManualComputationOp
com um sharding diferente.
Essas condições indicam que o ShardingConstraintOp
determina o
fragmentação da entrada.
Se a entrada for produzida por um DataFlowEdgeOp
, em vez de definir o
fragmentação da operação, vamos substituir todos os usos de input
pelo
ShardingConstraintOp
para evitar a restrição do fragmentação de todos os destinos
da borda.
O sharding 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 o sharding para respeitar totalmente a restrição nos casos acima.
Além disso, se um tensor for usado por uma cadeia de ShardingConstraintOp
s que
satisfizer todas as condições a seguir:
- O tensor não é produzido por um
ShardingConstraintOp
e não tem outros usuários do tipoShardingConstraintOp
ouManualComputationOp
. - Nenhuma das
ShardingConstraintOp
s na cadeia tem mais de um uso, exceto a última; - O último
ShardingConstraintOp
na cadeia não tem usuários do tipoShardingConstraintOp
ouManualComputationOp
. Caso contrário, ele não será o último na cadeia;
Então, 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 precisa determinar 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.
Em uma subcomputação constante, um valor pode ter vários usos nesta subcomputação.
-sdy-lift-inlined-meshes
Elevação de MeshAttr
s inline em divisões 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 de dispositivo) ou- O primeiro nome disponível em [
mesh
,mesh_0
,mesh_1
, ...].
-sdy-manual-axes-cleanup
Limpa o uso de eixos manuais em ManualComputationOp
s
- 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.
- Classifica os eixos manuais na ordem de declaração do eixo de malha.
-sdy-sharding-group-import
Passagem 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:
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 estiver 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 precisam 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.
Validação de 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. Isso atualmente afirma que, se um grupo de fragmentação contiver um
Value
definido dentro do bloco de umManualComputationOp
, todos os outros valores nesse grupo precisarão residir no mesmo bloco.