ফেডারেটেড প্রোগ্রাম ডেভেলপার গাইড

এই ডকুমেন্টেশনটি যে কেউ ফেডারেটেড প্রোগ্রাম লজিক বা ফেডারেটেড প্রোগ্রাম লিখতে আগ্রহী। এটি টেনসরফ্লো ফেডারেটেড, বিশেষ করে এর টাইপ সিস্টেম এবং ফেডারেটেড প্রোগ্রামগুলির জ্ঞান অনুমান করে।

প্রোগ্রাম লজিক

এই বিভাগটি কীভাবে প্রোগ্রাম লজিক রচনা করা উচিত তার জন্য নির্দেশিকা সংজ্ঞায়িত করে।

আরও তথ্যের জন্য 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 প্যারামিটারের জন্য একটি ভালভাবে সংজ্ঞায়িত পাইথন প্রকার প্রদান করুন

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-এর ফেডারেটেড প্রোগ্রাম লাইব্রেরির উপাদানগুলি পাইথনকে একযোগে চালানোর জন্য অ্যাসিনসিও ব্যবহার করে এবং প্রোগ্রাম লজিককে একটি অ্যাসিঙ্ক্রোনাস ফাংশন হিসাবে সংজ্ঞায়িত করা সেই উপাদানগুলির সাথে যোগাযোগ করা সহজ করে তোলে।

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

না

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

টেস্ট

প্রোগ্রাম লজিকের জন্য ইউনিট পরীক্ষা প্রদান করুন (যেমন program_logic_test.py )।

প্রোগ্রাম

এই বিভাগটি কীভাবে একটি প্রোগ্রাম রচনা করা উচিত তার নির্দেশিকা সংজ্ঞায়িত করে।

আরও তথ্যের জন্য উদাহরণ program.py দেখুন।

প্রোগ্রামটি নথিভুক্ত করুন

মডিউলের ডকস্ট্রিংয়ে গ্রাহকের কাছে প্রোগ্রামের বিশদ বিবরণ নথিভুক্ত করুন (যেমন 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)

পাইথন লজিক

প্রোগ্রামে যুক্তি লিখবেন না (যেমন নিয়ন্ত্রণ প্রবাহ, গণনা আহ্বান করা, যা কিছু পরীক্ষা করা দরকার)। পরিবর্তে, লজিকটিকে একটি প্রাইভেট লাইব্রেরিতে স্থানান্তর করুন যা পরীক্ষা করা যেতে পারে বা প্রোগ্রামটি যে প্রোগ্রামটি আহ্বান করে তার মধ্যে।

অ্যাসিঙ্ক্রোনাস ফাংশন

প্রোগ্রামে অ্যাসিঙ্ক্রোনাস ফাংশন লিখবেন না । পরিবর্তে, ফাংশনটিকে একটি প্রাইভেট লাইব্রেরিতে স্থানান্তর করুন যা পরীক্ষা করা যেতে পারে বা প্রোগ্রামটি যে প্রোগ্রামটি আহ্বান করে তার মধ্যে।

টেস্ট

প্রোগ্রামের জন্য ইউনিট পরীক্ষা লিখবেন না , যদি প্রোগ্রামটি পরীক্ষা করা কার্যকর হয় তবে ইন্টিগ্রেশন পরীক্ষার পরিপ্রেক্ষিতে সেই পরীক্ষাগুলি লিখুন।