このドキュメントは、フェデレーテッド プログラムの概念の概要に興味がある人を対象としています。 TensorFlow Federated、特にその型システムに関する知識を前提としています。
フェデレーテッド プログラムの詳細については、以下を参照してください。
フェデレーション プログラムとは何ですか?
フェデレーテッド プログラムは、フェデレーテッド環境で計算およびその他の処理ロジックを実行するプログラムです。
具体的には、フェデレーテッド プログラム:
- 計算を実行します
- プログラムロジックを使って
- プラットフォーム固有のコンポーネントを使用する
- プラットフォームに依存しないコンポーネント
- プログラムによって設定された特定のパラメータ
- および顧客が設定したパラメータ
- 顧客がプログラムを実行するとき
- また、プラットフォーム ストレージ内のデータを次の目的で実体化する場合があります。
- Python ロジックで使用する
- フォールトトレランスを実装する
- データを顧客のストレージに公開する場合があります
これらの概念と抽象化を定義すると、フェデレーテッド プログラムのコンポーネント間の関係を記述することが可能になり、これらのコンポーネントをさまざまな役割で所有および作成できるようになります。この分離により、開発者は他のフェデレーテッド プログラムと共有されるコンポーネントを使用してフェデレーテッド プログラムを作成できます。これは通常、多くの異なるプラットフォームで同じプログラム ロジックを実行することを意味します。
TFF のフェデレーテッド プログラム ライブラリ ( tff.program ) は、フェデレーテッド プログラムの作成に必要な抽象化を定義し、プラットフォームに依存しないコンポーネントを提供します。
コンポーネント
<!--#include file="components.dot"-->
TFF のフェデレーテッド プログラム ライブラリのコンポーネントは、さまざまな役割が所有および作成できるように設計されています。
プログラム
このプログラムは、次のような Python バイナリです。
- パラメータ(フラグなど)を定義します
- プラットフォーム固有のコンポーネントとプラットフォームに依存しないコンポーネントを構築します
- フェデレーテッド・コンテキストでプログラム・ロジックを使用して計算を実行します。
例えば:
# 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_rounds
とnum_clients
プログラムによって設定されるパラメータです。
プラットフォーム固有のコンポーネント
プラットフォーム固有のコンポーネントは、 TFF のフェデレーテッド プログラム ライブラリによって定義された抽象インターフェイスを実装するプラットフォームによって提供されるコンポーネントです。
プラットフォームに依存しないコンポーネント
プラットフォームに依存しないコンポーネントは、 TFF のフェデレーテッド プログラム ライブラリによって定義された抽象インターフェイスを実装するライブラリ(TFF など) によって提供されるコンポーネントです。
計算
計算は、抽象インターフェイスtff.Computation
の実装です。
たとえば、TFF プラットフォームでは、 tff.tensorflow.computation
またはtff.federated_computation
デコレータを使用してtff.framework.ConcreteComputation
を作成できます。
詳細については、 「計算の寿命」を参照してください。
プログラムロジック
プログラム ロジックは、入力として受け取る Python 関数です。
そして、通常は次のようないくつかの操作を実行します。
- 計算の実行
- Python ロジックの実行
- プラットフォーム ストレージ内のデータを実体化して、次のことを行います。
- 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 から再開する必要がありますか?