Guide du développeur de programmes fédérés

Cette documentation s'adresse à toute personne intéressée par la création d'une logique de programme fédéré ou d'un programme fédéré . Cela suppose une connaissance de TensorFlow Federated, notamment de son système de types, et des programmes fédérés .

Logique du programme

Cette section définit les lignes directrices sur la façon dont la logique du programme doit être créée.

Voir l'exemple program_logic.py pour plus d'informations.

Signatures de types de documents

Documentez la signature de type TFF pour chaque paramètre fourni à la logique du programme qui a une signature de type.

async def program_logic(
    train: tff.Computation,
    data_source: tff.program.FederatedDataSource,
    ...
) -> None:
  """Trains a federated model for some number of rounds.

  The following types signatures are required:

  1.  `train`:       `(<S@SERVER, D@CLIENTS> -> <S@SERVER, M@SERVER>)`
  2.  `data_source`: `D@CLIENTS`

  Where:

  *   `S`: The server state.
  *   `M`: The train metrics.
  *   `D`: The train client data.
  """

Vérifier les signatures de type

Vérifiez la signature de type TFF (au moment de l'exécution) pour chaque paramètre fourni à la logique du programme qui a une signature de type.

def _check_program_logic_type_signatures(
    train: tff.Computation,
    data_source: tff.program.FederatedDataSource,
    ...
) -> None:
  ...

async def program_logic(
    train: tff.Computation,
    data_source: tff.program.FederatedDataSource,
    ...
) -> None:
  _check_program_logic_type_signatures(
      train=train,
      data_source=data_source,
  )
  ...

Annotations de types

Fournissez un type Python bien défini pour chaque paramètre tff.program.ReleaseManager fourni à la logique du programme.

async def program_logic(
    metrics_manager: Optional[
        tff.program.ReleaseManager[tff.program.ReleasableStructure, int]
    ] = None,
    ...
) -> None:
  ...

Pas

async def program_logic(
    metrics_manager,
    ...
) -> None:
  ...
async def program_logic(
    metrics_manager: Optional[tff.program.ReleaseManager] = None,
    ...
) -> None:
  ...

État du programme

Fournissez une structure bien définie décrivant l’état du programme de la logique du programme.

class _ProgramState(NamedTuple):
  state: object
  round_num: int

async def program_loic(...) -> None:
  initial_state = ...

  # Load the program state
  if program_state_manager is not None:
    structure = _ProgramState(initial_state, round_num=0)
    program_state, version = await program_state_manager.load_latest(structure)
  else:
    program_state = None
    version = 0

  # Assign state and round_num
  if program_state is not None:
    state = program_state.state
    start_round = program_state.round_num + 1
  else:
    state = initial_state
    start_round = 1

  for round_num in range(start_round, ...):
    state, _ = train(state, ...)

    # Save the program state
    program_state = _ProgramState(state, round_num)
    version = version + 1
    program_state_manager.save(program_state, version)

Valeurs validées du document

Documentez les valeurs libérées par la logique du programme.

async def program_logic(
    metrics_manager: Optional[tff.program.ReleaseManager] = None,
    ...
) -> None:
  """Trains a federated model for some number of rounds.

  Each round, `loss` is released to the `metrics_manager`.
  """

Valeurs spécifiques à la version

Ne libérez pas plus de valeurs de la logique du programme que nécessaire.

async def program_logic(...) -> None:

  for round_number in range(...):
    state, metrics = train(state, ...)

    _, metrics_type = train.type_signature.result
    loss = metrics['loss']
    loss_type = metrics_type['loss']
    metrics_manager.release(loss, loss_type, round_number)

Pas

async def program_loic(...) -> None:

  for round_number in range(...):
    state, metrics = train(state, ...)

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

Fonctions asynchrones

Définissez la logique du programme comme une fonction asynchrone . Les composants de la bibliothèque de programmes fédérés de TFF utilisent asyncio pour exécuter Python simultanément et définir la logique du programme comme une fonction asynchrone facilite l'interaction avec ces composants.

async def program_logic(...) -> None:
  ...

Pas

def program_logic(...) -> None:
  ...

Essais

Fournissez des tests unitaires pour la logique du programme (par exemple program_logic_test.py ).

Programme

Cette section définit les lignes directrices sur la façon dont un programme doit être créé.

Voir l'exemple program.py pour plus d'informations.

Documenter le programme

Documentez les détails du programme au client dans la docstring du module (par exemple program.py ):

  • Comment exécuter manuellement le programme.
  • Quelle plate-forme, quels calculs et quelles sources de données sont utilisés dans le programme.
  • Comment un client doit accéder aux informations publiées par le programme vers le stockage client.

Trop de paramètres

Ne paramétrez pas le programme de telle sorte qu'il existe des collections de paramètres mutuellement exclusives. Par exemple, si foo est défini sur X , vous devez également définir les paramètres bar , baz , sinon ces paramètres doivent être None . Cela indique que vous auriez pu créer deux programmes différents pour différentes valeurs de foo .

Paramètres du groupe

Utilisez proto pour définir des paramètres liés mais complexes ou détaillés au lieu de définir de nombreux FLAGS (go/absl.flags).

with tf.io.gfile.GFile(config_path) as f:
  proto = text_format.Parse(f.read(), vizier_pb2.StudyConfig())
return pyvizier.StudyConfig.from_proto(proto)

Logique Python

N'écrivez pas de logique (par exemple, flux de contrôle, appels de calculs, tout ce qui doit être testé) dans le programme. Au lieu de cela, déplacez la logique dans une bibliothèque privée qui peut être testée ou dans la logique du programme invoquée par le programme.

Fonctions asynchrones

N'écrivez pas de fonctions asynchrones dans le programme. Au lieu de cela, déplacez la fonction dans une bibliothèque privée qui peut être testée ou dans la logique du programme invoquée par le programme.

Essais

N'écrivez pas de tests unitaires pour le programme, si tester le programme est utile, écrivez ces tests en termes de tests d'intégration.