เอกสารนี้มีไว้สำหรับทุกคนที่สนใจในการเขียน ตรรกะโปรแกรมแบบรวมศูนย์ หรือ โปรแกรมแบบรวมศูนย์ โดยจะถือว่าความรู้เกี่ยวกับ 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,
)
...
พิมพ์คำอธิบายประกอบ
จัด เตรียมประเภท Python ที่กำหนดไว้อย่างชัดเจนสำหรับพารามิเตอร์ tff.program.ReleaseManager
แต่ละตัวที่จัดหาให้กับลอจิกของโปรแกรม
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 )
โปรแกรม
ส่วนนี้กำหนดแนวทางสำหรับวิธีการเขียน โปรแกรม
ดูตัวอย่าง program.py สำหรับข้อมูลเพิ่มเติม
เอกสารโปรแกรม
ทำ เอกสารรายละเอียดของโปรแกรมให้กับลูกค้าใน docstring ของโมดูล (เช่น program.py ):
- วิธีรันโปรแกรมด้วยตนเอง
- โปรแกรมใช้แพลตฟอร์ม การคำนวณ และแหล่งข้อมูลใด
- ลูกค้าควรเข้าถึงข้อมูลที่เผยแพร่จากโปรแกรมไปยังที่เก็บข้อมูลของลูกค้าอย่างไร
มีพารามิเตอร์มากเกินไป
อย่า กำหนดพารามิเตอร์ของโปรแกรมในลักษณะที่มีการรวบรวมพารามิเตอร์ที่แยกจากกัน ตัวอย่างเช่น หากตั้งค่า foo
เป็น X
คุณจะต้องตั้งค่าพารามิเตอร์ bar
, baz
ด้วย ไม่เช่นนั้นพารามิเตอร์เหล่านี้จะต้องเป็น None
นี่บ่งชี้ว่าคุณสามารถสร้างโปรแกรมที่แตกต่างกันสองโปรแกรมสำหรับค่า foo
ที่แตกต่างกัน
พารามิเตอร์กลุ่ม
ใช้ โปรโตเพื่อกำหนดพารามิเตอร์ที่เกี่ยวข้องแต่ซับซ้อนหรือมีรายละเอียด แทนที่จะกำหนด FLAGS จำนวนมาก (go/absl.flags)
with tf.io.gfile.GFile(config_path) as f: proto = text_format.Parse(f.read(), vizier_pb2.StudyConfig()) return pyvizier.StudyConfig.from_proto(proto)
หลามลอจิก
อย่า เขียนตรรกะ (เช่น โฟลว์การควบคุม การเรียกใช้การคำนวณ หรืออะไรก็ตามที่จำเป็นต้องทดสอบ) ในโปรแกรม ให้ย้ายตรรกะไปไว้ในไลบรารีส่วนตัวที่สามารถทดสอบได้หรือย้ายไปไว้ในตรรกะของโปรแกรมที่โปรแกรมเรียกใช้แทน
ฟังก์ชันแบบอะซิงโครนัส
อย่า เขียน ฟังก์ชันอะซิงโครนัส ในโปรแกรม ให้ย้ายฟังก์ชันไปไว้ในไลบรารีส่วนตัวที่สามารถทดสอบได้หรือเข้าไปในตรรกะของโปรแกรมที่โปรแกรมเรียกใช้แทน
การทดสอบ
อย่า เขียนการทดสอบหน่วยสำหรับโปรแกรม ถ้าการทดสอบโปรแกรมมีประโยชน์ ให้เขียนการทดสอบเหล่านั้นในแง่ของการทดสอบบูรณาการ