フェデレーテッド プログラム

このドキュメントは、フェデレーテッド プログラムの概念の概要に興味がある人を対象としています。 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 customerによって設定されるパラメータであり、 total_roundsnum_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)

役割

フェデレーテッド プログラムについて議論するときに定義すると便利な役割が 3 つあります。それは、顧客プラットフォーム、およびライブラリです。これらの各役割は、フェデレーテッド プログラムの作成に使用されるコンポーネントの一部を所有し、作成します。ただし、単一のエンティティまたはグループが複数の役割を果たすことは可能です。

お客様

通常、お客様は次のことを行います。

しかし、次のような可能性があります。

プラットフォーム

プラットフォームは通常、次のことを行います。

しかし、次のような可能性があります。

図書館

ライブラリは通常、次のことを行います。

コンセプト

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

フェデレーテッド プログラムについて議論する際に定義すると役立つ概念がいくつかあります。

顧客ストレージ

顧客ストレージは顧客が読み取りおよび書き込みアクセスを持ち、プラットフォームが書き込みアクセスを持つストレージです。

プラットフォームストレージ

プラットフォーム ストレージはプラットフォームのみが読み取りおよび書き込みアクセスできるストレージです。

リリース

を解放すると、その値が顧客のストレージで使用できるようになります (例: ダッシュボードへの値の公開、値のログ記録、または値のディスクへの書き込み)。

実体化する

値参照を実体化すると、参照された値をプログラムで使用できるようになります。多くの場合、値を解放したりプログラム ロジックをフォールト トレラントにするために、値参照を具体化することが必要になります。

フォールトトレランス

フォールト トレランスとは、計算実行時の障害から回復するプログラム ロジックの機能です。たとえば、100 ラウンド中最初の 90 ラウンドのトレーニングに成功し、その後失敗した場合、プログラム ロジックはラウンド 91 からトレーニングを再開できますか、それともトレーニングをラウンド 1 から再開する必要がありますか?