التعلم الاتحادي

ملخص

يقدم هذا المستند واجهات تسهل مهام التعلم الموحد، مثل التدريب الموحد أو التقييم باستخدام نماذج التعلم الآلي الحالية المطبقة في TensorFlow. في تصميم هذه الواجهات، كان هدفنا الأساسي هو تمكين تجربة التعلم الموحد دون الحاجة إلى معرفة كيفية عمله تحت الغطاء، وتقييم خوارزميات التعلم الموحد المطبقة على مجموعة متنوعة من النماذج والبيانات الحالية. نحن نشجعك على المساهمة مرة أخرى في المنصة. لقد تم تصميم TFF مع أخذ القابلية للتوسعة والتركيب في الاعتبار، ونحن نرحب بالمساهمات؛ نحن متحمسون لرؤية ما توصلت إليه!

تتكون الواجهات التي تقدمها هذه الطبقة من الأجزاء الرئيسية الثلاثة التالية:

  • عارضات ازياء . الفئات والوظائف المساعدة التي تتيح لك تغليف نماذجك الحالية لاستخدامها مع TFF. يمكن أن يكون تغليف النموذج بسيطًا مثل استدعاء دالة تغليف واحدة (على سبيل المثال، tff.learning.models.from_keras_model )، أو تحديد فئة فرعية من واجهة tff.learning.models.VariableModel للتخصيص الكامل.

  • بناة الحساب المتحدون . الوظائف المساعدة التي تقوم بإنشاء حسابات موحدة للتدريب أو التقييم، باستخدام النماذج الموجودة لديك.

  • مجموعات البيانات . مجموعات البيانات المعلبة التي يمكنك تنزيلها والوصول إليها في Python لاستخدامها في محاكاة سيناريوهات التعلم الموحد. على الرغم من أن التعلم الموحد مصمم للاستخدام مع البيانات اللامركزية التي لا يمكن تنزيلها ببساطة من موقع مركزي، إلا أنه في مراحل البحث والتطوير غالبًا ما يكون من المناسب إجراء تجارب أولية باستخدام البيانات التي يمكن تنزيلها ومعالجتها محليًا، خاصة للمطورين الذين قد يكونون جديدة لهذا النهج.

يتم تعريف هذه الواجهات بشكل أساسي في مساحة الاسم tff.learning ، باستثناء مجموعات بيانات البحث والإمكانيات الأخرى المتعلقة بالمحاكاة التي تم تجميعها في tff.simulation . يتم تنفيذ هذه الطبقة باستخدام واجهات ذات مستوى أدنى تقدمها النواة الموحدة (FC) ، والتي توفر أيضًا بيئة تشغيل.

قبل المتابعة، نوصيك أولاً بمراجعة البرامج التعليمية حول تصنيف الصور وإنشاء النص ، لأنها تقدم معظم المفاهيم الموضحة هنا باستخدام أمثلة ملموسة. إذا كنت مهتمًا بمعرفة المزيد حول كيفية عمل TFF، فقد ترغب في الاطلاع على البرنامج التعليمي للخوارزميات المخصصة كمقدمة للواجهات ذات المستوى الأدنى التي نستخدمها للتعبير عن منطق الحسابات الموحدة، ولدراسة التنفيذ الحالي لـ واجهات tff.learning .

عارضات ازياء

الافتراضات المعمارية

التسلسل

يهدف TFF إلى دعم مجموعة متنوعة من سيناريوهات التعلم الموزع التي قد يتم فيها تنفيذ رمز نموذج التعلم الآلي الذي تكتبه على عدد كبير من العملاء غير المتجانسين ذوي القدرات المتنوعة. على الرغم من أنه في أحد طرفي الطيف، قد يكون هؤلاء العملاء في بعض التطبيقات خوادم قواعد بيانات قوية، إلا أن العديد من الاستخدامات المهمة التي تعتزم منصتنا دعمها تشمل الأجهزة المحمولة والمضمنة ذات الموارد المحدودة. لا يمكننا أن نفترض أن هذه الأجهزة قادرة على استضافة أوقات تشغيل بايثون؛ الشيء الوحيد الذي يمكننا افتراضه في هذه المرحلة هو أنهم قادرون على استضافة وقت تشغيل TensorFlow محلي. وبالتالي، فإن الافتراض المعماري الأساسي الذي نقوم به في TFF هو أن رمز النموذج الخاص بك يجب أن يكون قابلاً للتسلسل كرسم بياني TensorFlow.

لا يزال بإمكانك (ويجب عليك) تطوير كود TF الخاص بك باتباع أحدث أفضل الممارسات مثل استخدام الوضع الحريص. ومع ذلك، يجب أن يكون الكود النهائي قابلاً للتسلسل (على سبيل المثال، يمكن تغليفه كدالة tf.function لرمز الوضع المتحمس). يضمن هذا إمكانية إجراء تسلسل لأي حالة أو تدفق تحكم ضروري في Python في وقت التنفيذ (ربما بمساعدة Autograph ).

حاليًا، لا يدعم TensorFlow بشكل كامل إجراء تسلسل وإلغاء تسلسل TensorFlow في الوضع الحريص. وبالتالي، فإن التسلسل في TFF يتبع حاليًا نمط TF 1.0، حيث يجب إنشاء كل التعليمات البرمجية داخل tf.Graph الذي يتحكم فيه TFF. وهذا يعني أن TFF حاليًا لا يمكنه استهلاك نموذج تم إنشاؤه بالفعل؛ بدلاً من ذلك، يتم تجميع منطق تعريف النموذج في دالة no-arg التي تُرجع tff.learning.models.VariableModel . يتم بعد ذلك استدعاء هذه الوظيفة بواسطة TFF لضمان تسلسل جميع مكونات النموذج. بالإضافة إلى ذلك، نظرًا لكونها بيئة مكتوبة بقوة، فإن TFF ستتطلب القليل من البيانات الوصفية الإضافية، مثل مواصفات نوع إدخال النموذج الخاص بك.

تجميع

نوصي بشدة معظم المستخدمين بإنشاء نماذج باستخدام Keras، راجع قسم محولات Keras أدناه. تتعامل هذه الأغلفة مع تجميع تحديثات النموذج بالإضافة إلى أي مقاييس محددة للنموذج تلقائيًا. ومع ذلك، قد يكون من المفيد فهم كيفية التعامل مع التجميع لنموذج tff.learning.models.VariableModel العام.

هناك دائمًا طبقتان على الأقل من التجميع في التعلم الموحد: التجميع المحلي على الجهاز، والتجميع عبر الأجهزة (أو الموحد):

  • التجميع المحلي . يشير هذا المستوى من التجميع إلى التجميع عبر دفعات متعددة من الأمثلة المملوكة لعميل فردي. وينطبق ذلك على كل من معلمات النموذج (المتغيرات)، التي تستمر في التطور بشكل تسلسلي مع تدريب النموذج محليًا، بالإضافة إلى الإحصائيات التي تحسبها (مثل متوسط ​​الخسارة والدقة والمقاييس الأخرى)، والتي سيقوم نموذجك بتحديثها محليًا مرة أخرى حيث يتكرر عبر تدفق البيانات المحلي لكل عميل على حدة.

    يقع تنفيذ التجميع على هذا المستوى على عاتق كود النموذج الخاص بك، ويتم إنجازه باستخدام بنيات TensorFlow القياسية.

    الهيكل العام للمعالجة هو كما يلي:

    • يقوم النموذج أولاً بإنشاء tf.Variable s للاحتفاظ بالمجاميع، مثل عدد الدُفعات أو عدد الأمثلة التي تمت معالجتها، ومجموع الخسائر لكل دفعة أو لكل مثال، وما إلى ذلك.

    • يستدعي TFF طريقة forward_pass على Model الخاص بك عدة مرات، بشكل تسلسلي على دفعات لاحقة من بيانات العميل، مما يسمح لك بتحديث المتغيرات التي تحتوي على مجاميع مختلفة كأثر جانبي.

    • أخيرًا، يستدعي TFF طريقة report_local_unfinalized_metrics في النموذج الخاص بك للسماح لنموذجك بتجميع جميع إحصائيات الملخص التي جمعها في مجموعة مدمجة من المقاييس ليتم تصديرها بواسطة العميل. هذا هو المكان الذي قد يقوم فيه رمز النموذج الخاص بك، على سبيل المثال، بتقسيم مجموع الخسائر على عدد الأمثلة التي تمت معالجتها لتصدير متوسط ​​الخسارة، وما إلى ذلك.

  • التجميع المتحد . يشير هذا المستوى من التجميع إلى التجميع عبر عملاء (أجهزة) متعددة في النظام. مرة أخرى، ينطبق ذلك على كل من معلمات النموذج (المتغيرات)، التي يتم حساب متوسطها عبر العملاء، بالإضافة إلى المقاييس التي قام نموذجك بتصديرها نتيجة للتجميع المحلي.

    تقع مسؤولية إجراء التجميع على هذا المستوى على عاتق TFF. ومع ذلك، باعتبارك منشئ النماذج، يمكنك التحكم في هذه العملية (المزيد حول هذا أدناه).

    الهيكل العام للمعالجة هو كما يلي:

    • يتم توزيع النموذج الأولي وأي معلمات مطلوبة للتدريب بواسطة الخادم على مجموعة فرعية من العملاء الذين سيشاركون في جولة التدريب أو التقييم.

    • في كل عميل، بشكل مستقل وبالتوازي، يتم استدعاء رمز النموذج الخاص بك بشكل متكرر على دفق من دفعات البيانات المحلية لإنتاج مجموعة جديدة من معلمات النموذج (عند التدريب)، ومجموعة جديدة من المقاييس المحلية، كما هو موضح أعلاه (هذا محلي تجميع).

    • يقوم TFF بتشغيل بروتوكول تجميع موزع لتجميع وتجميع معلمات النموذج والمقاييس المصدرة محليًا عبر النظام. يتم التعبير عن هذا المنطق بطريقة تعريفية باستخدام لغة الحساب الموحدة الخاصة بـ TFF (وليس في TensorFlow). راجع البرنامج التعليمي للخوارزميات المخصصة لمعرفة المزيد حول واجهة برمجة تطبيقات التجميع.

واجهات مجردة

يتم تمثيل واجهة المنشئ الأساسية + واجهة البيانات الوصفية بواسطة الواجهة tff.learning.models.VariableModel ، على النحو التالي:

  • يجب أن تقوم الطرق المُنشئة، forward_pass ، و report_local_unfinalized_metrics بإنشاء متغيرات النموذج، والتمرير الأمامي، والإحصائيات التي ترغب في الإبلاغ عنها، وفقًا لذلك. يجب أن يكون TensorFlow الذي تم إنشاؤه بهذه الطرق قابلاً للتسلسل، كما تمت مناقشته أعلاه.

  • تمثل الخاصية input_spec ، بالإضافة إلى الخصائص الثلاثة التي ترجع مجموعات فرعية من المتغيرات المحلية القابلة للتدريب وغير القابلة للتدريب، البيانات التعريفية. يستخدم TFF هذه المعلومات لتحديد كيفية توصيل أجزاء من النموذج الخاص بك بخوارزميات التحسين الموحدة، ولتحديد توقيعات النوع الداخلي للمساعدة في التحقق من صحة النظام المُنشأ (بحيث لا يمكن إنشاء مثيل للنموذج الخاص بك عبر البيانات التي لا تتطابق مع ما النموذج مصمم للاستهلاك).

بالإضافة إلى ذلك، تعرض الواجهة المجردة tff.learning.models.VariableModel خاصية metric_finalizers التي تأخذ القيم غير النهائية للمقياس (التي يتم إرجاعها بواسطة report_local_unfinalized_metrics() ) وتقوم بإرجاع قيم القياس النهائية. سيتم استخدام الأسلوب metric_finalizers report_local_unfinalized_metrics() معًا لإنشاء مجمع مقاييس عبر العملاء عند تحديد عمليات التدريب الموحدة أو حسابات التقييم. على سبيل المثال، سيقوم مجمع tff.learning.metrics.sum_then_finalize البسيط أولاً بجمع قيم المقاييس غير النهائية من العملاء، ثم استدعاء وظائف أداة الإنهاء على الخادم.

يمكنك العثور على أمثلة لكيفية تحديد tff.learning.models.VariableModel المخصص الخاص بك في الجزء الثاني من البرنامج التعليمي لتصنيف الصور ، وكذلك في نماذج النماذج التي نستخدمها للاختبار في model_examples.py .

محولات لكيراس

يمكن استخلاص جميع المعلومات التي يتطلبها TFF تقريبًا عن طريق استدعاء واجهات tf.keras ، لذلك إذا كان لديك نموذج Keras، فيمكنك الاعتماد على tff.learning.models.from_keras_model لإنشاء tff.learning.models.VariableModel .

لاحظ أن TFF لا يزال يريد منك توفير مُنشئ - وظيفة نموذج بدون وسيطات مثل ما يلي:

def model_fn():
  keras_model = ...
  return tff.learning.models.from_keras_model(keras_model, sample_batch, loss=...)

بالإضافة إلى النموذج نفسه، يمكنك توفير عينة من البيانات التي يستخدمها TFF لتحديد نوع وشكل مدخلات النموذج الخاص بك. يضمن ذلك قدرة TFF على إنشاء نموذج للبيانات التي ستكون موجودة بالفعل على الأجهزة العميلة بشكل صحيح (نظرًا لأننا نفترض أن هذه البيانات ليست متاحة بشكل عام في الوقت الذي تقوم فيه بإنشاء TensorFlow ليتم تسلسله).

تم توضيح استخدام أغلفة Keras في البرامج التعليمية الخاصة بتصنيف الصور وإنشاء النصوص .

بناة الحساب المتحدون

توفر حزمة tff.learning عدة أدوات إنشاء لـ tff.Computation التي تؤدي المهام المتعلقة بالتعلم؛ ونتوقع أن تتوسع مجموعة هذه الحسابات في المستقبل.

الافتراضات المعمارية

تنفيذ

هناك مرحلتان متميزتان في تشغيل الحساب الموحد.

  • التجميع : يقوم TFF أولاً بتجميع خوارزميات التعلم الموحدة في تمثيل متسلسل مجردة للحساب الموزع بالكامل. يحدث هذا عندما يحدث تسلسل TensorFlow، ولكن يمكن أن تحدث تحويلات أخرى لدعم التنفيذ الأكثر كفاءة. نشير إلى التمثيل المتسلسل المنبعث من المترجم باعتباره حسابًا متحدًا .

  • يوفر تنفيذ TFF طرقًا لتنفيذ هذه الحسابات. في الوقت الحالي، يتم دعم التنفيذ فقط من خلال المحاكاة المحلية (على سبيل المثال، في دفتر ملاحظات باستخدام البيانات اللامركزية المحاكية).

يتضمن الحساب الموحد الذي تم إنشاؤه بواسطة واجهة برمجة تطبيقات التعلم الموحد الخاصة بـ TFF، مثل خوارزمية التدريب التي تستخدم متوسط ​​النموذج الموحد ، أو التقييم الموحد، عددًا من العناصر، أبرزها:

  • نموذج متسلسل من كود النموذج الخاص بك بالإضافة إلى كود TensorFlow الإضافي الذي تم إنشاؤه بواسطة إطار التعلم الموحد لدفع حلقة التدريب/التقييم الخاصة بنموذجك (مثل إنشاء أدوات التحسين، وتطبيق تحديثات النموذج، والتكرار عبر tf.data.Dataset s، ومقاييس الحوسبة، وتطبيق التحديث المجمع على الخادم، على سبيل المثال لا الحصر).

  • مواصفات تعريفية للاتصال بين العملاء والخادم (عادةً أشكال مختلفة من التجميع عبر أجهزة العميل، والبث من الخادم إلى جميع العملاء)، وكيفية تشذير هذا الاتصال الموزع مع التنفيذ المحلي للعميل أو الخادم المحلي من كود TensorFlow.

يتم التعبير عن الحسابات الموحدة الممثلة في هذا النموذج المتسلسل بلغة داخلية مستقلة عن النظام الأساسي تختلف عن لغة Python، ولكن لاستخدام واجهة برمجة التطبيقات للتعليم الموحد، لن تحتاج إلى الاهتمام بتفاصيل هذا التمثيل. يتم تمثيل الحسابات في كود Python الخاص بك ككائنات من النوع tff.Computation ، والتي يمكنك التعامل معها في معظمها على أنها كائنات Python غير شفافة callable .

في البرامج التعليمية، سوف تقوم باستدعاء تلك الحسابات الموحدة كما لو كانت وظائف بايثون عادية، ليتم تنفيذها محليًا. ومع ذلك، تم تصميم TFF للتعبير عن الحسابات الموحدة بطريقة لا تتوافق مع معظم جوانب بيئة التنفيذ، بحيث يمكن أن تكون قابلة للنشر، على سبيل المثال، مجموعات من الأجهزة التي تعمل Android ، أو إلى مجموعات في مركز بيانات. مرة أخرى، النتيجة الرئيسية لذلك هي الافتراضات القوية حول التسلسل . على وجه الخصوص، عند استدعاء إحدى طرق build_... الموضحة أدناه، يتم إجراء تسلسل كامل للحساب.

حالة النمذجة

TFF هي بيئة برمجة وظيفية، ومع ذلك فإن العديد من العمليات ذات الاهتمام بالتعلم الموحد تكون ذات حالة. على سبيل المثال، تعد حلقة التدريب التي تتضمن جولات متعددة من متوسط ​​النموذج الموحد مثالًا لما يمكن أن نصنفه على أنه عملية ذات حالة . في هذه العملية، تتضمن الحالة التي تتطور من جولة إلى جولة مجموعة من معلمات النموذج التي يتم تدريبها، وربما حالة إضافية مرتبطة بالمُحسِّن (على سبيل المثال، ناقل الزخم).

نظرًا لأن TFF فعال، يتم تصميم العمليات ذات الحالة في TFF كحسابات تقبل الحالة الحالية كمدخل ثم توفر الحالة المحدثة كمخرجات. من أجل تحديد عملية ذات حالة بشكل كامل، يحتاج المرء أيضًا إلى تحديد مصدر الحالة الأولية (وإلا فلن نتمكن من تمهيد العملية). تم توضيح ذلك في تعريف الفئة المساعدة tff.templates.IterativeProcess ، مع الخاصيتين initialize next المتوافقتين مع التهيئة والتكرار، على التوالي.

بناة المتاحة

في الوقت الحالي، يوفر TFF العديد من وظائف البناء التي تولد حسابات موحدة للتدريب والتقييم الموحد. ومن الأمثلة البارزة على ذلك ما يلي:

مجموعات البيانات

الافتراضات المعمارية

اختيار العميل

في سيناريو التعلم الموحد النموذجي، لدينا عدد كبير من الأجهزة العميلة التي يحتمل أن تصل إلى مئات الملايين، والتي قد يكون جزء صغير منها فقط نشطًا ومتاحًا للتدريب في أي لحظة معينة (على سبيل المثال، قد يقتصر هذا على العملاء الذين هم موصول بمصدر طاقة، وليس بشبكة مقننة، وبخلاف ذلك خامل). بشكل عام، مجموعة العملاء المتاحة للمشاركة في التدريب أو التقييم تكون خارجة عن سيطرة المطور. علاوة على ذلك، نظرًا لأنه من غير العملي التنسيق بين ملايين العملاء، فإن الجولة النموذجية من التدريب أو التقييم ستشمل فقط جزءًا صغيرًا من العملاء المتاحين، والذين قد يتم أخذ عينات منهم بشكل عشوائي .

والنتيجة الرئيسية لذلك هي أن الحسابات الموحدة، حسب التصميم، يتم التعبير عنها بطريقة غافلة عن المجموعة المحددة من المشاركين؛ يتم التعبير عن كل المعالجة كعمليات مجمعة على مجموعة مجردة من العملاء المجهولين، وقد تختلف هذه المجموعة من جولة تدريب إلى أخرى. وبالتالي، فإن الارتباط الفعلي للحساب بالمشاركين الملموسين، وبالتالي بالبيانات الملموسة التي يغذونها في الحساب، يتم تصميمه خارج الحساب نفسه.

من أجل محاكاة النشر الواقعي لرمز التعلم الموحد الخاص بك، ستكتب بشكل عام حلقة تدريب تبدو كما يلي:

trainer = tff.learning.algorithms.build_weighted_fed_avg(...)
state = trainer.initialize()
federated_training_data = ...

def sample(federate_data):
  return ...

while True:
  data_for_this_round = sample(federated_training_data)
  result = trainer.next(state, data_for_this_round)
  state = result.state

لتسهيل ذلك، عند استخدام TFF في عمليات المحاكاة، يتم قبول البيانات الموحدة list Python، مع عنصر واحد لكل جهاز عميل مشارك لتمثيل tf.data.Dataset المحلي لهذا الجهاز.

واجهات مجردة

من أجل توحيد التعامل مع مجموعات البيانات الموحدة المحاكاة، يوفر TFF واجهة مجردة tff.simulation.datasets.ClientData ، والتي تسمح للمرء بتعداد مجموعة العملاء، وإنشاء tf.data.Dataset الذي يحتوي على بيانات مجموعة معينة عميل. يمكن تغذية تلك tf.data.Dataset مباشرة كمدخل للحسابات الموحدة التي تم إنشاؤها في وضع حريص.

تجدر الإشارة إلى أن القدرة على الوصول إلى هويات العميل هي ميزة يتم توفيرها فقط من خلال مجموعات البيانات لاستخدامها في عمليات المحاكاة، حيث قد تكون هناك حاجة إلى القدرة على التدريب على البيانات من مجموعات فرعية محددة من العملاء (على سبيل المثال، لمحاكاة التوافر اليومي لمختلف أنواع العملاء). لا تتضمن الحسابات المجمعة ووقت التشغيل الأساسي أي فكرة عن هوية العميل. بمجرد تحديد البيانات من مجموعة فرعية محددة من العملاء كمدخل، على سبيل المثال، في استدعاء tff.templates.IterativeProcess.next ، لن تظهر هويات العميل فيها.

مجموعات البيانات المتاحة

لقد خصصنا مساحة الاسم tff.simulation.datasets لمجموعات البيانات التي تنفذ واجهة tff.simulation.datasets.ClientData للاستخدام في عمليات المحاكاة، وقمنا بزرعها مع مجموعات البيانات لدعم تصنيف الصور والبرامج التعليمية لإنشاء النص . نود أن نشجعك على المساهمة بمجموعات البيانات الخاصة بك في النظام الأساسي.