Вполне возможно моделировать что-то похожее на "асинхронный FL" в TFF. Один из способов подумать об этом может состоять в том, чтобы концептуально отделить время моделирования от время настенных часов .
Выборка разного количества клиентов в каждом раунде (а не униформа K
клиентов, что обычно делается), возможно, с некоторым распределением, которое взвешивает клиентов в зависимости от того, как долго они должны обучаться, может моделировать асинхронный FL. Впервые возможно обработать только часть выбранных клиентов, исследователь может свободно разделять данные / вычисления по своему усмотрению.
Python - псевдокод в стиле «эскес» демонстрирует два метода, различные выборки клиентов и приложение с отложенным градиентом:
state = fed_avg_iter_proc.initialize()
for round_num in range(NUM_ROUNDS):
# Here we conceptualize a "round" as a block of time, rather than a synchronous
# round. We have a function that determines which clients will "finish" within
# our configured block of time. This might even return only a single client.
participants = get_next_clients(time_window=timedelta(minutes=30))
num_participants = len(participants)
# Here we only process the first half, and then updated the global model.
state2, metrics = fed_avg_iter_proc.next(state, participants[:num_participants/2])
# Now process the second half of the selected clients.
# Note: this is now apply the 'pseudo-gradient' that was computed on clients
# (the difference between the original `state` and their local training result),
# to the model that has already taken one step (`state2`). This possibly has
# undesirable effects on the optimisation process, or may be improved with
# techniques that handle "stale" gradients.
state3, metrics = fed_avg_iter_proc.next(state2, participants[num_participants/2:])
# Finally update the state for the next for-loop of the simulation.
state = state3