Как правило, TFF рассматривает подачу данных как часть «Python драйвера l oop», что полезно при написании кода TFF.
Фактически, при записи TFF, как правило, существует три уровня, на которых можно писать:
- TensorFlow, определяющий локальную обработку (IE, обработку, которая будет выполняться на клиентах, или на сервере, или в агрегаторах, или в любом другом месте размещения может потребоваться, но только одиночное размещение.
- Собственный TFF, определяющий способ передачи данных по местам размещения. Например, запись
tff.federated_sum
внутри tff.federated_computation
декоратора; при написании этой строки объявляется "эти данные перемещаются с клиентов на сервер и агрегируются с помощью оператора суммы". - Python "управляя" TFF l oop, например, запуск одного раунда. Задачей этого последнего уровня является выполнение «реальной» федеративной среды обучения; одним из примеров здесь будет выбор клиентов для данного раунда.
Если эта разбивка учитывается, использование генератора или какой-либо другой конструкции в стиле ленивых вычислений для подачи данных в федеративные вычисления становится относительно простым; это просто делается на уровне Python.
Один из способов сделать это - использовать метод create_tf_dataset_for_client
для объекта ClientData
; если вы наберете oop раундов, ваш код Python может выбрать из списка client_ids
, затем вы можете создать новый список tf.data.Datasets
и передать их в качестве нового набора данных клиента. Примером этого относительно простого использования может быть здесь и более сложное использование (включающее определение пользовательского client_datasets_fn
, который принимает client_id
в качестве параметра, и передачу его в отдельно определенное обучение l oop будет здесь , в коде, связанном с этой статьей .
Последнее замечание: создание экземпляра tf.data.Dataset
фактически не загружает набор данных в память; набор данных загружается только после итерации. Один полезный совет, который я получил от ведущего автора tf.data.Dataset
, состоит в том, чтобы думать о tf.data.Dataset
скорее как о «рецепте набора данных», чем о буквальном создании самого набора данных. Было высказано предположение, что, возможно, лучшим названием было бы DataSource
для этой конструкции, возможно, это поможет ментальной модели того, что происходит на самом деле. Точно так же использование объекта tff.simulation.ClientData
обычно не должно ничего загружать в память до тех пор, пока повторяется при обучении клиентов, что должно упростить некоторые нюансы в управлении памятью набора данных.