Niniejsza dokumentacja jest przeznaczona dla każdego, kto jest zainteresowany ogólnym przeglądem koncepcji programów stowarzyszonych. Zakłada znajomość TensorFlow Federated, zwłaszcza jego systemu typów.
Aby uzyskać więcej informacji na temat programu stowarzyszonego, zobacz:
Co to jest program federacyjny?
Program stowarzyszony to program, który wykonuje obliczenia i inną logikę przetwarzania w środowisku stowarzyszonym.
Więcej, w szczególności program stowarzyszony :
- wykonuje obliczenia
- za pomocą logiki programu
- z komponentami specyficznymi dla platformy
- i komponenty niezależne od platformy
- zadanych parametrów ustawionych przez program
- i parametrach ustalonych przez klienta
- kiedy klient uruchamia program
- i może materializować dane w pamięci platformy w celu:
- używać w logice Pythona
- wdrożyć tolerancję na błędy
- i może udostępnić dane w pamięci klienta
Zdefiniowanie tych pojęć i abstrakcji umożliwia opisanie relacji między komponentami programu stowarzyszonego oraz pozwala, aby te komponenty były własnością różnych ról i były przez nie tworzone. To oddzielenie umożliwia programistom tworzenie programów stowarzyszonych przy użyciu komponentów współdzielonych z innymi programami stowarzyszonymi, co zazwyczaj oznacza wykonywanie tej samej logiki programu na wielu różnych platformach.
Biblioteka programów stowarzyszonych TFF ( tff.program ) definiuje abstrakcje wymagane do utworzenia programu stowarzyszonego i udostępnia komponenty niezależne od platformy .
Komponenty
<!--#include file="components.dot"-->
Komponenty stowarzyszonej biblioteki programów TFF zostały zaprojektowane w taki sposób, aby mogły być własnością różnych osób i być przez nie tworzone.
Program
Program jest plikiem binarnym Pythona, który:
- definiuje parametry (np. flagi)
- konstruuje komponenty specyficzne dla platformy i komponenty niezależne od platformy
- wykonuje obliczenia przy użyciu logiki programu w kontekście stowarzyszonym
Na przykład:
# 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,
)
)
Parametry
Parametry są danymi wejściowymi programu , wejścia te mogą być ustawione przez klienta , jeśli są widoczne jako flagi, lub mogą być ustawione przez program. W powyższym przykładzie output_dir
jest parametrem ustawianym przez klienta , a parametry total_rounds
i num_clients
są ustawiane przez program.
Komponenty specyficzne dla platformy
Komponenty specyficzne dla platformy to komponenty dostarczane przez platformę implementującą abstrakcyjne interfejsy zdefiniowane przez stowarzyszoną bibliotekę programów TFF.
Komponenty niezależne od platformy
Komponenty niezależne od platformy to komponenty dostarczane przez bibliotekę (np. TFF) implementującą abstrakcyjne interfejsy zdefiniowane przez bibliotekę programów stowarzyszonych TFF.
Obliczenia
Obliczenia są implementacjami abstrakcyjnego interfejsu tff.Computation
.
Na przykład na platformie TFF można użyć dekoratorów tff.tensorflow.computation
lub tff.federated_computation
do utworzenia tff.framework.ConcreteComputation
:
Aby uzyskać więcej informacji, zobacz żywotność obliczeń .
Logika programu
Logika programu jest funkcją Pythona, która jako dane wejściowe przyjmuje:
- parametry ustawione przez klienta i program
- komponenty specyficzne dla platformy
- komponenty niezależne od platformy
- obliczenia
i wykonuje pewne operacje, które zazwyczaj obejmują:
- wykonywanie obliczeń
- wykonywanie logiki Pythona
- materializowanie danych w pamięci platformy w celu:
- używać w logice Pythona
- wdrożyć tolerancję na błędy
i może dać pewien wynik, który zazwyczaj obejmuje:
- udostępnianie danych do pamięci klienta jako metryk
Na przykład:
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)
Role
Podczas omawiania programów stowarzyszonych warto zdefiniować trzy role : klient , platforma i biblioteka . Każda z tych ról jest właścicielem i autorem niektórych komponentów używanych do tworzenia programu stowarzyszonego. Możliwe jest jednak, że pojedynczy podmiot lub grupa będzie pełnić wiele ról.
Klient
Klient zazwyczaj:
- jest właścicielem magazynu klientów
- uruchamia program
ale może:
Platforma
Platforma zazwyczaj:
- jest właścicielem magazynu platformowego
- autorzy komponentów specyficznych dla platformy
ale może:
- autor programu
- spełniać jakiekolwiek możliwości biblioteki
Biblioteka
Biblioteka zazwyczaj:
- autorzy komponentów niezależnych od platformy
- obliczenia autorskie
- autorska logika programu
Koncepcje
<!--#include file="concepts.dot"-->
Istnieje kilka pojęć , które warto zdefiniować podczas omawiania programów stowarzyszonych.
Przechowywanie klientów
Pamięć klienta to pamięć, do której klient ma dostęp do odczytu i zapisu oraz do której platforma ma dostęp do zapisu.
Przechowywanie platformy
Pamięć platformy to pamięć, do której tylko platforma ma dostęp do odczytu i zapisu.
Uwolnienie
Zwolnienie wartości udostępnia ją w pamięci klienta (np. publikowanie wartości na pulpicie nawigacyjnym, rejestrowanie wartości lub zapisywanie wartości na dysku).
Zmaterializować
Materializacja odniesienia do wartości powoduje, że wartość, do której się odwołujemy, staje się dostępna dla programu . Często wymagana jest materializacja odniesienia do wartości, aby zwolnić wartość lub zapewnić odporność logiki programu na błędy.
Tolerancja błędów
Tolerancja błędów to zdolność logiki programu do regeneracji po awarii podczas wykonywania obliczeń. Na przykład, jeśli pomyślnie przetrenujesz pierwsze 90 rund na 100, a następnie doświadczysz niepowodzenia, czy logika programu jest w stanie wznowić trening od rundy 91, czy też trening należy rozpocząć od rundy 1?