انضم إلى TensorFlow في مؤتمر Google I / O ، 11-12 مايو سجل الآن

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

ملخص

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

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

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

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

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

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

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

عارضات ازياء

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

التسلسل

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

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

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

تجميع

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

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

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

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

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

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

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

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

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

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

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

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

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

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

واجهات مجردة

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

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

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

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

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

محولات Keras

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

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

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

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

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

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

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

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

تنفيذ

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

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

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

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

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

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

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

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

حالة النمذجة

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

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

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

في الوقت الحالي ، يوفر TFF وظيفتين منشئ تقومان بإنشاء الحسابات الموحدة للتدريب والتقييم الفيدرالي:

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

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

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

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

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

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

trainer = tff.learning.build_federated_averaging_process(...)
state = trainer.initialize()
federated_training_data = ...

def sample(federate_data):
  return ...

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

من أجل تسهيل ذلك ، عند استخدام 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 لاستخدامها في عمليات المحاكاة ، وزرناها بمجموعات بيانات لدعم تصنيف الصور والبرامج التعليمية لإنشاء النص . نود أن نشجعك على المساهمة بمجموعات البيانات الخاصة بك في النظام الأساسي.