Programme fédéré

Cette documentation s'adresse à toute personne intéressée par une présentation générale des concepts des programmes fédérés. Cela suppose une connaissance de TensorFlow Federated, notamment de son système de types.

Pour plus d’informations sur le programme fédéré, voir :

Qu'est-ce qu'un programme fédéré ?

Un programme fédéré est un programme qui exécute des calculs et d'autres logiques de traitement dans un environnement fédéré.

Plus spécifiquement un programme fédéré :

La définition de ces concepts et abstractions permet de décrire les relations entre les composants d'un programme fédéré et permet à ces composants d'être détenus et créés par différents rôles . Ce découplage permet aux développeurs de composer un programme fédéré à l'aide de composants partagés avec d'autres programmes fédérés, ce qui signifie généralement exécuter la même logique de programme sur de nombreuses plates-formes différentes.

La bibliothèque de programmes fédérés de TFF ( tff.program ) définit les abstractions requises pour créer un programme fédéré et fournit des composants indépendants de la plate-forme .

Composants

<!--#include file="components.dot"-->

Les composants de la bibliothèque de programmes fédérés de TFF sont conçus de manière à pouvoir appartenir et être créés par différents rôles .

Programme

Le programme est un binaire Python qui :

  1. définit les paramètres (par exemple les drapeaux)
  2. construit des composants spécifiques à la plate-forme et des composants indépendants de la plate-forme
  3. exécute des calculs en utilisant la logique du programme dans un contexte fédéré

Par exemple:

# Parameters set by the customer.
flags.DEFINE_string('output_dir', None, 'The output path.')

def main() -> None:

  # Parameters set by the program.
  total_rounds = 10
  num_clients = 3

  # Construct the platform-specific components.
  context = tff.program.NativeFederatedContext(...)
  data_source = tff.program.DatasetDataSource(...)

  # Construct the platform-agnostic components.
  summary_dir = os.path.join(FLAGS.output_dir, 'summary')
  metrics_manager = tff.program.GroupingReleaseManager([
      tff.program.LoggingReleaseManager(),
      tff.program.TensorBoardReleaseManager(summary_dir),
  ])
  program_state_dir = os.path.join(..., 'program_state')
  program_state_manager = tff.program.FileProgramStateManager(program_state_dir)

  # Define the computations.
  initialize = ...
  train = ...

  # Execute the computations using program logic.
  tff.framework.set_default_context(context)
  asyncio.run(
      train_federated_model(
          initialize=initialize,
          train=train,
          data_source=data_source,
          total_rounds=total_rounds,
          num_clients=num_clients,
          metrics_manager=metrics_manager,
          program_state_manager=program_state_manager,
      )
  )

Paramètres

Les paramètres sont les entrées du programme , ces entrées peuvent être définies par le client , si elles sont exposées sous forme d'indicateurs, ou elles peuvent être définies par le programme. Dans l'exemple ci-dessus, output_dir est un paramètre défini par le client , et total_rounds et num_clients sont des paramètres définis par le programme.

Composants spécifiques à la plate-forme

Les composants spécifiques à la plateforme sont les composants fournis par une plateforme implémentant les interfaces abstraites définies par la bibliothèque de programmes fédérés de TFF.

Composants indépendants de la plate-forme

Les composants indépendants de la plate-forme sont les composants fournis par une bibliothèque (par exemple TFF) implémentant les interfaces abstraites définies par la bibliothèque de programmes fédérés de TFF.

Calculs

Les calculs sont des implémentations de l'interface abstraite tff.Computation .

Par exemple, dans la plateforme TFF, vous pouvez utiliser les décorateurs tff.tensorflow.computation ou tff.federated_computation pour créer un tff.framework.ConcreteComputation :

Voir durée de vie d'un calcul pour plus d'informations.

Logique du programme

La logique du programme est une fonction Python qui prend en entrée :

et effectue certaines opérations, qui comprennent généralement :

et peut produire certains résultats, qui comprennent généralement :

Par exemple:

async def program_logic(
    initialize: tff.Computation,
    train: tff.Computation,
    data_source: tff.program.FederatedDataSource,
    total_rounds: int,
    num_clients: int,
    metrics_manager: tff.program.ReleaseManager[
        tff.program.ReleasableStructure, int
    ],
) -> None:
  state = initialize()
  start_round = 1

  data_iterator = data_source.iterator()
  for round_number in range(1, total_rounds + 1):
    train_data = data_iterator.select(num_clients)
    state, metrics = train(state, train_data)

    _, metrics_type = train.type_signature.result
    metrics_manager.release(metrics, metrics_type, round_number)

Rôles

Il existe trois rôles qu'il est utile de définir lors de l'examen des programmes fédérés : le client , la plateforme et la bibliothèque . Chacun de ces rôles possède et crée certains des composants utilisés pour créer un programme fédéré. Cependant, il est possible qu’une seule entité ou un seul groupe remplisse plusieurs rôles.

Client

Le client :

mais peut :

Plate-forme

La plateforme généralement :

mais peut :

Bibliothèque

Une bibliothèque généralement :

Concepts

<!--#include file="concepts.dot"-->

Il est utile de définir quelques concepts lors de l'examen des programmes fédérés.

Stockage client

Le stockage client est un stockage auquel le client a accès en lecture et en écriture et auquel la plateforme a accès en écriture.

Stockage de plate-forme

Le stockage de plate-forme est un stockage auquel seule la plate-forme a accès en lecture et en écriture.

Libérer

La publication d'une valeur rend la valeur disponible pour le stockage du client (par exemple, publier la valeur sur un tableau de bord, enregistrer la valeur ou écrire la valeur sur le disque).

Se concrétiser

La matérialisation d' une référence de valeur rend la valeur référencée disponible au programme . Il est souvent nécessaire de matérialiser une référence de valeur pour libérer la valeur ou pour rendre la logique du programme tolérante aux pannes .

Tolérance aux pannes

La tolérance aux pannes est la capacité de la logique du programme à se remettre d'un échec lors de l'exécution d'un calcul. Par exemple, si vous entraînez avec succès les 90 premiers tours sur 100 et que vous rencontrez ensuite un échec, la logique du programme est-elle capable de reprendre l'entraînement à partir du tour 91 ou l'entraînement doit-il être redémarré au tour 1 ?