-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 ou ManualComputationOp 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 ShardingConstraintOps que atenda a todos os itens a seguir:

  • O tensor não é produzido por um ShardingConstraintOp e não tem outros usuários do tipo ShardingConstraintOp ou ManualComputationOp.
  • Nenhum dos ShardingConstraintOps na cadeia tem mais de um uso, exceto o último.
  • O último ShardingConstraintOp na cadeia não tem usuários do tipo ShardingConstraintOp ou ManualComputationOp. 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 MeshAttrs inline em fragmentos como MeshOps 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 MeshOps 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 ManualComputationOps

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.