Федеративная программа

Эта документация предназначена для всех, кто заинтересован в общем обзоре концепций интегрированных программ. Предполагается знание TensorFlow Federated, особенно его системы типов.

Для получения дополнительной информации о федеративной программе см.:

Что такое федеративная программа?

Федеративная программа — это программа, которая выполняет вычисления и другую логику обработки в федеративной среде.

Более конкретно, федеративная программа :

Определение этих концепций и абстракций позволяет описывать отношения между компонентами объединенной программы и позволяет различным ролям владеть этими компонентами и создавать их. Такое разделение позволяет разработчикам составлять объединенную программу, используя компоненты, которые используются совместно с другими объединенными программами. Обычно это означает выполнение одной и той же логики программы на многих разных платформах.

Библиотека интегрированных программ TFF ​​( tff.program ) определяет абстракции, необходимые для создания интегрированной программы, и предоставляет компоненты, независимые от платформы .

Компоненты

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

Компоненты библиотеки интегрированных программ TFF ​​спроектированы таким образом, что ими могут владеть и создаваться разные роли .

Программа

Программа представляет собой двоичный файл Python, который:

  1. определяет параметры (например, флаги)
  2. создает компоненты, специфичные для платформы , и компоненты, независимые от платформы.
  3. выполняет вычисления с использованием программной логики в объединенном контексте

Например:

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

Параметры

Параметры являются входными данными для программы . Эти входные данные могут быть установлены клиентом , если они представлены как флаги, или они могут быть установлены программой. В приведенном выше примере output_dir — это параметр, который задается клиентом , а total_rounds и num_clients — это параметры, установленные программой.

Компоненты, специфичные для платформы

Компоненты, специфичные для платформы, — это компоненты, предоставляемые платформой , реализующие абстрактные интерфейсы, определенные библиотекой интегрированных программ TFF.

Платформо-независимые компоненты

Независимые от платформы компоненты — это компоненты, предоставляемые библиотекой (например, TFF), реализующие абстрактные интерфейсы, определенные библиотекой интегрированных программ TFF.

Вычисления

Вычисления являются реализациями абстрактного интерфейса tff.Computation .

Например, на платформе TFF вы можете использовать декораторы tff.tensorflow.computation или tff.federated_computation для создания tff.framework.ConcreteComputation :

См. «Жизнь вычислений» для получения дополнительной информации.

Программная логика

Логика программы представляет собой функцию Python, которая принимает на вход:

и выполняет некоторые операции, которые обычно включают в себя:

и может дать некоторый результат, который обычно включает в себя:

Например:

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)

Роли

При обсуждении интегрированных программ полезно определить три роли : клиент , платформа и библиотека . Каждая из этих ролей владеет и является автором некоторых компонентов , используемых для создания интегрированной программы. Однако одна организация или группа могут выполнять несколько ролей.

Клиент

Клиент обычно:

но может:

Платформа

Платформа обычно:

но может:

Библиотека

Библиотека обычно:

Концепции

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

Есть несколько понятий , которые полезно определить при обсуждении федеративных программ.

Хранилище клиентов

Хранилище клиента — это хранилище, к которому клиент имеет доступ на чтение и запись, а платформа имеет доступ на запись.

Платформа хранения

Хранилище платформы — это хранилище, к которому только платформа имеет доступ для чтения и записи.

Выпускать

Освобождение значения делает значение доступным в хранилище клиента (например, публикация значения на информационной панели, регистрация значения или запись значения на диск).

Материализовать

Материализация ссылки на значение делает указанное значение доступным для программы . Часто материализация ссылки на значение требуется для освобождения значения или для обеспечения отказоустойчивости логики программы .

Отказоустойчивость

Отказоустойчивость — это способность логики программы восстанавливаться после сбоя при выполнении вычислений. Например, если вы успешно тренируетесь в первых 90 раундах из 100, а затем испытываете неудачу, способна ли логика программы возобновить тренировку с 91 раунда или тренировку необходимо начинать заново с 1 раунда?