이 문서는 연합 프로그램 개념에 대한 높은 수준의 개요에 관심이 있는 모든 사람을 위한 것입니다. 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
고객 이 설정한 매개변수이고, 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"-->
연합 프로그램을 논의할 때 정의하는 데 유용한 몇 가지 개념이 있습니다.
고객 스토리지
고객 스토리지는 고객이 읽기 및 쓰기 액세스 권한을 갖고 플랫폼이 쓰기 액세스 권한을 갖는 스토리지입니다.
플랫폼 스토리지
플랫폼 스토리지 는 플랫폼 에서만 읽기 및 쓰기 액세스 권한을 갖는 스토리지입니다.
풀어 주다
값을 공개하면 고객 스토리지 에서 값을 사용할 수 있게 됩니다(예: 대시보드에 값 게시, 값 기록 또는 값을 디스크에 쓰기).
구체화하다
값 참조를 구체화하면 참조된 값을 프로그램 에서 사용할 수 있습니다. 값을 해제 하거나 프로그램 논리에 내결함성을 부여하려면 값 참조를 구체화해야 하는 경우가 많습니다.
내결함성
내결함성은 계산을 실행할 때 오류를 복구하는 프로그램 논리 의 기능입니다. 예를 들어, 100라운드 중 처음 90라운드를 성공적으로 훈련한 후 실패하는 경우 프로그램 로직이 91라운드에서 훈련을 재개할 수 있습니까, 아니면 1라운드에서 훈련을 다시 시작해야 합니까?