-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 ou ManualComputationOp 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 ShardingConstraintOps que satisfizer todas as condições a seguir:

  • O tensor não é produzido por um ShardingConstraintOp e não tem outros usuários do tipo ShardingConstraintOp ou ManualComputationOp.
  • Nenhuma das ShardingConstraintOps na cadeia tem mais de um uso, exceto a última;
  • O último ShardingConstraintOp na cadeia não tem usuários do tipo ShardingConstraintOp ou ManualComputationOp. 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 MeshAttrs inline em divisões 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 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 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 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:

  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 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.

  2. 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 um ManualComputationOp, todos os outros valores nesse grupo precisarão residir no mesmo bloco.