Birleşik Program Geliştirici Kılavuzu

Bu belge, birleştirilmiş program mantığı veya birleştirilmiş bir program yazmakla ilgilenen herkes içindir. TensorFlow Federated, özellikle de tür sistemi ve birleştirilmiş programlar hakkında bilgi sahibi olduğunu varsayar.

Program Mantığı

Bu bölüm program mantığının nasıl yazılması gerektiğine ilişkin yönergeleri tanımlar.

Daha fazla bilgi için program_logic.py örneğine bakın.

Belge Türü İmzalar

Tip imzasına sahip program mantığına sağlanan her parametre için TFF tip imzasını belgeleyin .

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.
  """

Tip İmzalarını Kontrol Edin

Tip imzasına sahip program mantığına sağlanan her parametre için TFF tip imzasını (çalışma zamanında) kontrol edin .

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,
  )
  ...

Tür Açıklamaları

Program mantığına sağlanan her tff.program.ReleaseManager parametresi için iyi tanımlanmış bir Python türü sağlayın .

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

Olumsuz

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

Program Durumu

Program mantığının program durumunu açıklayan iyi tanımlanmış bir yapı sağlayın .

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)

Belge Yayınlanan Değerler

Program mantığından yayımlanan değerleri belgeleyin .

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`.
  """

Belirli Değerleri Serbest Bırak

Program mantığından gerekenden daha fazla değeri serbest bırakmayın .

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)

Olumsuz

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)

Asenkron Fonksiyonlar

Program mantığını asenkron bir fonksiyon olarak tanımlayın . TFF'nin federe program kütüphanesinin bileşenleri , Python'u eşzamanlı olarak yürütmek için asyncio'yu kullanır ve program mantığını asenkron bir işlev olarak tanımlamak, bu bileşenlerle etkileşimi kolaylaştırır.

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

Olumsuz

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

Testler

Program mantığı için birim testleri sağlayın (örn. program_logic_test.py ).

programı

Bu bölüm bir programın nasıl yazılması gerektiğine ilişkin yönergeleri tanımlar.

Daha fazla bilgi için program.py örneğine bakın.

Programı Belgeleyin

Programın ayrıntılarını müşteriye modülün doküman dizisinde belgeleyin (örneğin program.py ):

  • Programı manuel olarak nasıl çalıştırabilirim?
  • Programda hangi platform, hesaplamalar ve veri kaynakları kullanılıyor?
  • Bir müşterinin, programdan müşteri deposuna gönderilen bilgilere nasıl erişmesi gerektiği.

Çok Fazla Parametre

Programı, birbirini dışlayan parametre koleksiyonları olacak şekilde parametreleştirmeyin . Örneğin, eğer foo X olarak ayarlanmışsa bar ve baz parametrelerini de ayarlamanız gerekir, aksi halde bu parametreler None olmalıdır. Bu, farklı foo değerleri için iki farklı program yapabileceğinizi gösterir.

Grup Parametreleri

İlgili ancak karmaşık veya ayrıntılı parametreleri tanımlamak için birçok BAYRAK (go/absl.flags) tanımlamak yerine proto kullanın .

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 Mantığı

Programa mantık (örn. kontrol akışı, hesaplamaların başlatılması, test edilmesi gereken herhangi bir şey) yazmayın . Bunun yerine mantığı test edilebilecek özel bir kitaplığa veya programın çağırdığı program mantığına taşıyın.

Asenkron Fonksiyonlar

Programa asenkron fonksiyonlar yazmayın . Bunun yerine, işlevi test edilebilecek özel bir kitaplığa veya programın çağırdığı program mantığına taşıyın.

Testler

Program için birim testleri yazmayın , eğer programı test etmek faydalı ise bu testleri entegrasyon testleri açısından yazın.