คู่มือนักพัฒนาโปรแกรมแบบรวมศูนย์

เอกสารนี้มีไว้สำหรับทุกคนที่สนใจในการเขียน ตรรกะโปรแกรมแบบรวมศูนย์ หรือ โปรแกรมแบบรวมศูนย์ โดยจะถือว่าความรู้เกี่ยวกับ 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)

หลามลอจิก

อย่า เขียนตรรกะ (เช่น โฟลว์การควบคุม การเรียกใช้การคำนวณ หรืออะไรก็ตามที่จำเป็นต้องทดสอบ) ในโปรแกรม ให้ย้ายตรรกะไปไว้ในไลบรารีส่วนตัวที่สามารถทดสอบได้หรือย้ายไปไว้ในตรรกะของโปรแกรมที่โปรแกรมเรียกใช้แทน

ฟังก์ชันแบบอะซิงโครนัส

อย่า เขียน ฟังก์ชันอะซิงโครนัส ในโปรแกรม ให้ย้ายฟังก์ชันไปไว้ในไลบรารีส่วนตัวที่สามารถทดสอบได้หรือเข้าไปในตรรกะของโปรแกรมที่โปรแกรมเรียกใช้แทน

การทดสอบ

อย่า เขียนการทดสอบหน่วยสำหรับโปรแกรม ถ้าการทดสอบโปรแกรมมีประโยชน์ ให้เขียนการทดสอบเหล่านั้นในแง่ของการทดสอบบูรณาการ