フェデレーション プログラム開発者ガイド

このドキュメントは、フェデレーテッド プログラム ロジックまたはフェデレーテッド プログラムの作成に興味がある人を対象としています。 TensorFlow Federated、特にその型システム、およびフェデレーテッド プログラムに関する知識を前提としています。

プログラムロジック

このセクションでは、プログラム ロジックを作成する方法に関するガイドラインを定義します。

詳細については、サンプルのprogram_logic.pyを参照してください。

文書タイプの署名

型署名を持つプログラム ロジックに提供される各パラメーターの TFF 型署名を文書化してください

async def program_logic(
    train: tff.Computation,
    data_source: tff.program.FederatedDataSource,
    ...
) -> None:
  """Trains a federated model for some number of rounds.

  The following types signatures are required:

  1.  `train`:       `(<S@SERVER, D@CLIENTS> -> <S@SERVER, M@SERVER>)`
  2.  `data_source`: `D@CLIENTS`

  Where:

  *   `S`: The server state.
  *   `M`: The train metrics.
  *   `D`: The train client data.
  """

チェックタイプの署名

型署名を持つプログラム ロジックに指定された各パラメーターの TFF 型署名を (実行時に) チェックしてください

def _check_program_logic_type_signatures(
    train: tff.Computation,
    data_source: tff.program.FederatedDataSource,
    ...
) -> None:
  ...

async def program_logic(
    train: tff.Computation,
    data_source: tff.program.FederatedDataSource,
    ...
) -> None:
  _check_program_logic_type_signatures(
      train=train,
      data_source=data_source,
  )
  ...

型の注釈

プログラム ロジックに提供される各tff.program.ReleaseManagerパラメーターに対して、明確に定義された Python タイプを提供してください

async def program_logic(
    metrics_manager: Optional[
        tff.program.ReleaseManager[tff.program.ReleasableStructure, int]
    ] = None,
    ...
) -> None:
  ...

ない

async def program_logic(
    metrics_manager,
    ...
) -> None:
  ...
async def program_logic(
    metrics_manager: Optional[tff.program.ReleaseManager] = None,
    ...
) -> None:
  ...

プログラムの状態

プログラム ロジックのプログラム状態を記述する明確に定義された構造を提供してください

class _ProgramState(NamedTuple):
  state: object
  round_num: int

async def program_loic(...) -> None:
  initial_state = ...

  # Load the program state
  if program_state_manager is not None:
    structure = _ProgramState(initial_state, round_num=0)
    program_state, version = await program_state_manager.load_latest(structure)
  else:
    program_state = None
    version = 0

  # Assign state and round_num
  if program_state is not None:
    state = program_state.state
    start_round = program_state.round_num + 1
  else:
    state = initial_state
    start_round = 1

  for round_num in range(start_round, ...):
    state, _ = train(state, ...)

    # Save the program state
    program_state = _ProgramState(state, round_num)
    version = version + 1
    program_state_manager.save(program_state, version)

文書発表値

プログラム ロジックから解放された値を文書化してください

async def program_logic(
    metrics_manager: Optional[tff.program.ReleaseManager] = None,
    ...
) -> None:
  """Trains a federated model for some number of rounds.

  Each round, `loss` is released to the `metrics_manager`.
  """

リリース固有の値

プログラム ロジックから必要以上の値を解放ないでください。

async def program_logic(...) -> None:

  for round_number in range(...):
    state, metrics = train(state, ...)

    _, metrics_type = train.type_signature.result
    loss = metrics['loss']
    loss_type = metrics_type['loss']
    metrics_manager.release(loss, loss_type, round_number)

ない

async def program_loic(...) -> None:

  for round_number in range(...):
    state, metrics = train(state, ...)

    _, metrics_type = train.type_signature.result
    metrics_manager.release(metrics, metrics_type, round_number)

非同期関数

プログラム ロジックを非同期関数として定義してください。 TFF のフェデレーテッド プログラム ライブラリのコンポーネントはasyncioを使用して Python を同時に実行し、プログラム ロジックを非同期関数として定義することで、これらのコンポーネントとの対話が容易になります。

async def program_logic(...) -> None:
  ...

ない

def program_logic(...) -> None:
  ...

テスト

プログラム ロジックの単体テストを提供してください(例: program_logic_test.py )。

プログラム

このセクションでは、プログラムの作成方法に関するガイドラインを定義します。

詳細については、サンプルのprogram.pyを参照してください。

プログラムを文書化する

プログラムの詳細をモジュールの docstring (例: program.py ) で顧客に文書化してください

  • プログラムを手動で実行する方法。
  • プログラムで使用されるプラットフォーム、計算、データ ソース。
  • プログラムから顧客のストレージに公開された情報に顧客がアクセスする方法。

パラメータが多すぎます

相互に排他的なパラメーターのコレクションが存在するようにプログラムをパラメーター化しないでください。たとえば、 foo Xに設定されている場合は、パラメータbarbazも設定する必要があります。それ以外の場合、これらのパラメータはNoneにする必要があります。これは、 fooの異なる値に対して 2 つの異なるプログラムを作成できることを示しています。

グループパラメータ

多くの FLAG (go/absl.flags) を定義する代わりに、関連する複雑または冗長なパラメーターを定義するには、proto を使用してください

with tf.io.gfile.GFile(config_path) as f:
  proto = text_format.Parse(f.read(), vizier_pb2.StudyConfig())
return pyvizier.StudyConfig.from_proto(proto)

Python ロジック

プログラム内にロジック (制御フロー、計算の呼び出し、テストが必要なものなど) を書かないでください。代わりに、ロジックをテスト可能なプライベート ライブラリ、またはプログラムが呼び出すプログラム ロジックに移動します。

非同期関数

プログラム内に非同期関数を記述しないでください。代わりに、関数をテスト可能なプライベート ライブラリ、またはプログラムが呼び出すプログラム ロジックに移動します。

テスト

プログラムの単体テストを作成しないでください。プログラムのテストが役立つ場合は、統合テストの観点からそれらのテストを作成してください。