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.