연합 프로그램 개발자 가이드

이 문서는 연합 프로그램 논리 또는 연합 프로그램 작성에 관심이 있는 모든 사람을 위한 것입니다. 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)

파이썬 로직

프로그램에 논리(예: 제어 흐름, 계산 호출, 테스트해야 하는 모든 항목)를 작성 하지 마세요 . 대신 논리를 테스트할 수 있는 개인 라이브러리나 프로그램이 호출하는 프로그램 논리로 이동하십시오.

비동기 함수

프로그램에 비동기 함수를 작성 하지 마세요 . 대신 함수를 테스트할 수 있는 개인 라이브러리나 프로그램이 호출하는 프로그램 논리로 이동하세요.

테스트

프로그램 테스트가 유용하다면 프로그램에 대한 단위 테스트를 작성 하지 마십시오 . 통합 테스트 측면에서 해당 테스트를 작성하십시오.