Programa Federado

Esta documentación está dirigida a cualquiera que esté interesado en una descripción general de alto nivel de los conceptos de los programas federados. Se asume conocimiento de TensorFlow Federated, especialmente su sistema de tipos.

Para obtener más información sobre el programa federado, consulte:

¿Qué es un programa federado?

Un programa federado es un programa que ejecuta cálculos y otra lógica de procesamiento en un entorno federado.

Más, concretamente un programa federado :

La definición de estos conceptos y abstracciones permite describir las relaciones entre los componentes de un programa federado y permite que estos componentes sean propiedad de diferentes roles y sean autores de ellos. Este desacoplamiento permite a los desarrolladores componer programas federados utilizando componentes que se comparten con otros programas federados; normalmente esto significa ejecutar la misma lógica de programa en muchas plataformas diferentes.

La biblioteca de programas federados de TFF ( tff.program ) define las abstracciones necesarias para crear un programa federado y proporciona componentes independientes de la plataforma .

Componentes

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

Los componentes de la biblioteca de programas federados de TFF están diseñados para que puedan ser propiedad de diferentes roles y ser creados por ellos.

Programa

El programa es un binario de Python que:

  1. define parámetros (por ejemplo, banderas)
  2. construye componentes específicos de la plataforma y componentes independientes de la plataforma
  3. ejecuta cálculos utilizando la lógica del programa en un contexto federado

Por ejemplo:

# 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,
      )
  )

Parámetros

Los parámetros son las entradas al programa , estas entradas pueden ser configuradas por el cliente , si están expuestas como banderas, o pueden ser configuradas por el programa. En el ejemplo anterior, output_dir es un parámetro establecido por el cliente , y total_rounds y num_clients son parámetros establecidos por el programa.

Componentes específicos de la plataforma

Los componentes específicos de la plataforma son los componentes proporcionados por una plataforma que implementa las interfaces abstractas definidas por la biblioteca de programas federados de TFF.

Componentes independientes de la plataforma

Los componentes independientes de la plataforma son los componentes proporcionados por una biblioteca (por ejemplo, TFF) que implementa las interfaces abstractas definidas por la biblioteca de programas federados de TFF.

Cálculos

Los cálculos son implementaciones de la interfaz abstracta tff.Computation .

Por ejemplo, en la plataforma TFF puedes usar los decoradores tff.tensorflow.computation o tff.federated_computation para crear un tff.framework.ConcreteComputation :

Consulte la vida de un cálculo para obtener más información.

Lógica del programa

La lógica del programa es una función de Python que toma como entrada:

y realiza algunas operaciones, que normalmente incluyen:

y puede producir algún resultado, que normalmente incluye:

Por ejemplo:

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)

Roles

Hay tres roles que es útil definir cuando se habla de programas federados: el cliente , la plataforma y la biblioteca . Cada uno de estos roles posee y es autor de algunos de los componentes utilizados para crear un programa federado. Sin embargo, es posible que una sola entidad o grupo cumpla múltiples funciones.

Cliente

El cliente normalmente:

pero puede:

Plataforma

La plataforma normalmente:

pero puede:

Biblioteca

Una biblioteca normalmente:

Conceptos

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

Hay algunos conceptos que es útil definir cuando se habla de programas federados.

Almacenamiento del cliente

El almacenamiento del cliente es un almacenamiento al que el cliente tiene acceso de lectura y escritura y al que la plataforma tiene acceso de escritura.

Almacenamiento de plataforma

El almacenamiento de plataforma es un almacenamiento al que solo la plataforma tiene acceso de lectura y escritura.

Liberar

La liberación de un valor hace que el valor esté disponible para el almacenamiento del cliente (por ejemplo, publicar el valor en un panel, registrar el valor o escribir el valor en el disco).

Materializar

La materialización de una referencia de valor hace que el valor referenciado esté disponible para el programa . A menudo es necesario materializar una referencia de valor para liberar el valor o hacer que la lógica del programa sea tolerante a fallos .

Tolerancia a fallos

La tolerancia a fallas es la capacidad de la lógica del programa para recuperarse de una falla al ejecutar un cálculo. Por ejemplo, si entrena con éxito las primeras 90 rondas de 100 y luego experimenta una falla, ¿la lógica del programa es capaz de reanudar el entrenamiento desde la ronda 91 o es necesario reiniciar el entrenamiento en la ronda 1?