תיעוד זה מיועד לכל מי שמעוניין בסקירה כללית ברמה גבוהה של מושגי תוכנית מאוחדת. הוא מניח ידע על TensorFlow Federated, במיוחד מערכת הסוג שלה.
למידע נוסף על תוכנית מאוחדת, ראה:
מהי תוכנית פדרציה?
תוכנית מאוחדת היא תוכנית שמבצעת חישובים והיגיון עיבוד אחר בסביבה מאוחדת.
יותר, ספציפית תוכנית פדרציה :
- מבצע חישובים
- באמצעות לוגיקה של תוכנית
- עם רכיבים ספציפיים לפלטפורמה
- ורכיבים אגנוסטיים לפלטפורמה
- פרמטרים שניתנו על ידי התוכנית
- ופרמטרים שנקבעו על ידי הלקוח
- כאשר הלקוח מפעיל את התוכנית
- ועשויים להתממש נתונים באחסון הפלטפורמה ל:
- להשתמש בלוגיקה של Python
- ליישם סובלנות תקלות
- ועשויים לשחרר נתונים לאחסון לקוחות
הגדרת המושגים וההפשטות הללו מאפשרת לתאר את היחסים בין הרכיבים של תוכנית מאוחדת ומאפשרת לרכיבים אלו להיות בבעלותם ובעליהם של תפקידים שונים. ניתוק זה מאפשר למפתחים להרכיב תוכנית מאוחדת באמצעות רכיבים המשותפים עם תוכניות מאוחדות אחרות, בדרך כלל המשמעות היא ביצוע אותה לוגיקה של תוכנית בפלטפורמות רבות ושונות.
ספריית התוכניות המאוחדת של TFF ( tff.program ) מגדירה את ההפשטות הנדרשות ליצירת תוכנית מאוחדת ומספקת רכיבים אגנוסטיים לפלטפורמה .
רכיבים
<!--#include file="components.dot"-->
הרכיבים של ספריית התוכניות הפדרציה של TFF מתוכננים כך שיוכלו להיות בבעלותם ומחברתם של תפקידים שונים.
תָכְנִית
התוכנית היא פייתון בינארי ש:
- מגדיר פרמטרים (למשל דגלים)
- בונה רכיבים ספציפיים לפלטפורמה ורכיבים אגנוסטיים לפלטפורמה
- מבצע חישובים באמצעות לוגיקה של תוכנית בהקשר מאוחד
לְדוּגמָה:
# Parameters set by the customer.
flags.DEFINE_string('output_dir', None, 'The output path.')
def main() -> None:
# Parameters set by the program.
total_rounds = 10
num_clients = 3
# Construct the platform-specific components.
context = tff.program.NativeFederatedContext(...)
data_source = tff.program.DatasetDataSource(...)
# Construct the platform-agnostic components.
summary_dir = os.path.join(FLAGS.output_dir, 'summary')
metrics_manager = tff.program.GroupingReleaseManager([
tff.program.LoggingReleaseManager(),
tff.program.TensorBoardReleaseManager(summary_dir),
])
program_state_dir = os.path.join(..., 'program_state')
program_state_manager = tff.program.FileProgramStateManager(program_state_dir)
# Define the computations.
initialize = ...
train = ...
# Execute the computations using program logic.
tff.framework.set_default_context(context)
asyncio.run(
train_federated_model(
initialize=initialize,
train=train,
data_source=data_source,
total_rounds=total_rounds,
num_clients=num_clients,
metrics_manager=metrics_manager,
program_state_manager=program_state_manager,
)
)
פרמטרים
הפרמטרים הם התשומות לתוכנית , כניסות אלה עשויות להיות מוגדרות על ידי הלקוח , אם הן נחשפות כדגלים, או שהן עשויות להיות מוגדרות על ידי התוכנית. בדוגמה למעלה, output_dir
הוא פרמטר שנקבע על ידי הלקוח , ו- total_rounds
ו- num_clients
הם פרמטרים שנקבעו על ידי התוכנית.
רכיבים ספציפיים לפלטפורמה
הרכיבים הספציפיים לפלטפורמה הם הרכיבים המסופקים על ידי פלטפורמה המיישמת את הממשקים המופשטים שהוגדרו על ידי ספריית התוכניות המאוחדת של TFF.
רכיבי פלטפורמה-אגנוסטיים
הרכיבים האגנוסטיים של הפלטפורמה הם הרכיבים המסופקים על ידי ספרייה (למשל TFF) המיישמת את הממשקים המופשטים שהוגדרו על ידי ספריית התוכניות המאוחדת של TFF.
חישובים
החישובים הם מימושים של הממשק המופשט tff.Computation
.
לדוגמה, בפלטפורמת TFF אתה יכול להשתמש במעצבי tff.tensorflow.computation
או tff.federated_computation
כדי ליצור tff.framework.ConcreteComputation
:
עיין בחייו של חישוב למידע נוסף.
לוגיקה של תוכנית
הלוגיקה של התוכנית היא פונקציית Python שמקבלת כקלט:
ומבצע כמה פעולות, הכוללות בדרך כלל:
- ביצוע חישובים
- ביצוע לוגיקה של Python
- מימוש נתונים באחסון פלטפורמה ל:
- להשתמש בלוגיקה של Python
- ליישם סובלנות תקלות
והוא עשוי להניב פלט מסוים, הכולל בדרך כלל:
- שחרור נתונים לאחסון לקוחות כמדדים
לְדוּגמָה:
async def program_logic(
initialize: tff.Computation,
train: tff.Computation,
data_source: tff.program.FederatedDataSource,
total_rounds: int,
num_clients: int,
metrics_manager: tff.program.ReleaseManager[
tff.program.ReleasableStructure, int
],
) -> None:
state = initialize()
start_round = 1
data_iterator = data_source.iterator()
for round_number in range(1, total_rounds + 1):
train_data = data_iterator.select(num_clients)
state, metrics = train(state, train_data)
_, metrics_type = train.type_signature.result
metrics_manager.release(metrics, metrics_type, round_number)
תפקידים
ישנם שלושה תפקידים שכדאי להגדיר כאשר דנים בתוכניות מאוחדות: הלקוח , הפלטפורמה והספרייה . כל אחד מתפקידים אלה הוא הבעלים והמחבר של חלק מהרכיבים המשמשים ליצירת תוכנית מאוחדת. עם זאת, קיימת אפשרות לישות או קבוצה אחת למלא תפקידים מרובים.
לָקוּחַ
הלקוח בדרך כלל:
- הבעלים של אחסון לקוחות
- משיקה את התוכנית
אבל עשוי:
פּלַטפוֹרמָה
הפלטפורמה בדרך כלל:
- בעל אחסון פלטפורמה
- מחברים רכיבים ספציפיים לפלטפורמה
אבל עשוי:
סִפְרִיָה
ספרייה בדרך כלל:
- מחברים רכיבים אגנוסטיים לפלטפורמה
- חישובי מחברים
- היגיון תוכנית מחברים
מושגים
<!--#include file="concepts.dot"-->
ישנם כמה מושגים שמועילים להגדרה כאשר דנים בתוכניות מאוחדות.
אחסון לקוחות
אחסון לקוח הוא אחסון שהלקוח קיבל גישת קריאה וכתיבה ואליו יש לפלטפורמה גישת כתיבה.
אחסון פלטפורמה
אחסון פלטפורמה הוא אחסון שרק לפלטפורמה יש גישת קריאה וכתיבה.
לְשַׁחְרֵר
שחרור ערך הופך את הערך לזמין לאחסון לקוחות (למשל פרסום הערך ללוח מחוונים, רישום הערך או כתיבת הערך לדיסק).
לְהִתְגַשֵׁם
מימוש הפניה לערך הופך את הערך המופנה לזמין לתוכנית . לעתים קרובות נדרשת הפניה לערך כדי לשחרר את הערך או כדי להפוך את התוכנית לסובלנית לתקלות לוגית.
סובלנות תקלות
סובלנות תקלות היא היכולת של הלוגיקה של התוכנית להתאושש מכשל בעת ביצוע חישובים. לדוגמה, אם אתה מצליח לאמן את 90 הסיבובים הראשונים מתוך 100 ולאחר מכן חווה כישלון, האם הלוגיקה של התוכנית מסוגלת לחדש את האימונים מסיבוב 91 או שצריך להתחיל את האימונים מחדש בסיבוב 1?