이 문서는 연합 프로그램 논리 또는 연합 프로그램 작성에 관심이 있는 모든 사람을 위한 것입니다. 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 )에 대한 단위 테스트를 제공 하세요 .
프로그램
이 섹션에서는 프로그램 작성 방법에 대한 지침을 정의합니다.
자세한 내용은 example.py를 참조하세요.
프로그램 문서화
모듈의 독스트링(예: program.py )에서 고객에게 프로그램의 세부 사항을 문서화 하십시오 .
- 프로그램을 수동으로 실행하는 방법.
- 프로그램에서 사용되는 플랫폼, 계산 및 데이터 소스는 무엇입니까?
- 고객이 프로그램에서 고객 스토리지로 공개된 정보에 액세스하는 방법.
매개변수가 너무 많습니다.
상호 배타적인 매개변수 컬렉션이 있도록 프로그램을 매개변수화 하지 마세요 . 예를 들어, foo
X
로 설정된 경우 bar
, baz
매개변수도 설정해야 하며, 그렇지 않은 경우 이러한 매개변수는 None
이어야 합니다. 이는 foo
의 서로 다른 값에 대해 두 개의 서로 다른 프로그램을 만들 수 있음을 나타냅니다.
그룹 매개변수
관련이 있지만 복잡하거나 자세한 매개변수를 정의하려면 많은 FLAGS(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)
파이썬 로직
프로그램에 논리(예: 제어 흐름, 계산 호출, 테스트해야 하는 모든 항목)를 작성 하지 마세요 . 대신 논리를 테스트할 수 있는 개인 라이브러리나 프로그램이 호출하는 프로그램 논리로 이동하십시오.
비동기 함수
프로그램에 비동기 함수를 작성 하지 마세요 . 대신 함수를 테스트할 수 있는 개인 라이브러리나 프로그램이 호출하는 프로그램 논리로 이동하세요.
테스트
프로그램 테스트가 유용하다면 프로그램에 대한 단위 테스트를 작성 하지 마십시오 . 통합 테스트 측면에서 해당 테스트를 작성하십시오.