Esta documentación está dirigida a cualquier persona interesada en crear lógica de programa federado o un programa federado . Se asume conocimiento de TensorFlow Federated, especialmente su sistema de tipos y programas federados .
Lógica del programa
Esta sección define pautas sobre cómo se debe crear la lógica del programa .
Consulte el ejemplo program_logic.py para obtener más información.
Tipo de documento Firmas
Documente la firma de tipo TFF para cada parámetro proporcionado a la lógica del programa que tiene una firma de tipo.
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.
"""
Firmas de tipo de cheque
Verifique la firma de tipo TFF (en tiempo de ejecución) para cada parámetro proporcionado a la lógica del programa que tiene una firma de tipo.
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,
)
...
Escriba anotaciones
Proporcione un tipo de Python bien definido para cada parámetro tff.program.ReleaseManager
proporcionado a la lógica del programa.
async def program_logic(
metrics_manager: Optional[
tff.program.ReleaseManager[tff.program.ReleasableStructure, int]
] = None,
...
) -> None:
...
No
async def program_logic(
metrics_manager,
...
) -> None:
...
async def program_logic(
metrics_manager: Optional[tff.program.ReleaseManager] = None,
...
) -> None:
...
Estado del programa
Proporcione una estructura bien definida que describa el estado del programa de la lógica del programa.
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)
Valores publicados del documento
Documente los valores liberados de la lógica del programa.
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`.
"""
Liberar valores específicos
No libere más valores de la lógica del programa de los necesarios.
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)
No
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)
Funciones asincrónicas
Defina la lógica del programa como una función asincrónica . Los componentes de la biblioteca de programas federados de TFF utilizan asyncio para ejecutar Python simultáneamente y definir la lógica del programa como una función asincrónica facilita la interacción con esos componentes.
async def program_logic(...) -> None:
...
No
def program_logic(...) -> None:
...
Pruebas
Proporcione pruebas unitarias para la lógica del programa (por ejemplo, program_logic_test.py ).
Programa
Esta sección define las pautas sobre cómo se debe crear un programa .
Consulte el ejemplo program.py para obtener más información.
Documentar el programa
Documente los detalles del programa para el cliente en la cadena de documentación del módulo (por ejemplo, program.py ):
- Cómo ejecutar manualmente el programa.
- Qué plataforma, cálculos y fuentes de datos se utilizan en el programa.
- Cómo debe acceder un cliente a la información publicada por el programa en el almacenamiento del cliente.
Demasiados parámetros
No parametrice el programa de modo que existan colecciones de parámetros mutuamente excluyentes. Por ejemplo, si foo
está configurado en X
, también deberá configurar los parámetros bar
, baz
; de lo contrario, estos parámetros deben ser None
. Esto indica que podrías haber creado dos programas diferentes para diferentes valores de foo
.
Parámetros de grupo
Utilice proto para definir parámetros relacionados pero complejos o detallados en lugar de definir muchas BANDERAS (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)
Lógica de Python
No escriba lógica (por ejemplo, flujo de control, invocación de cálculos, cualquier cosa que deba probarse) en el programa. En su lugar, mueva la lógica a una biblioteca privada que pueda probarse o a la lógica del programa que invoca el programa.
Funciones asincrónicas
No escriba funciones asincrónicas en el programa. En su lugar, mueva la función a una biblioteca privada que pueda probarse o a la lógica del programa que invoca el programa.
Pruebas
No escriba pruebas unitarias para el programa; si probar el programa es útil, escriba esas pruebas en términos de pruebas de integración.