يقدم هذا المستند الطبقة الأساسية لـ TFF التي تعمل كأساس للتعلم الموحد وخوارزميات موحدة غير تعليمية محتملة في المستقبل.
للحصول على مقدمة لطيفة لـ Federated Core ، يرجى قراءة البرامج التعليمية التالية ، حيث أنها تقدم بعض المفاهيم الأساسية عن طريق المثال وتوضح خطوة بخطوة إنشاء خوارزمية متوسط موحدة بسيطة.
الخوارزميات الموحدة المخصصة ، الجزء 1: مقدمة في النواة الموحدة .
الخوارزميات الموحدة المخصصة ، الجزء 2: تنفيذ المتوسطات الموحدة .
نشجعك أيضًا على التعرف على التعلم المتحد والبرامج التعليمية المرتبطة به حول تصنيف الصور وإنشاء النص ، حيث توفر استخدامات واجهة برمجة التطبيقات الموحدة (API) للتعلم الموحد سياقًا مهمًا لبعض الاختيارات التي قمنا بها في تصميم هذه الطبقة.
ملخص
الأهداف والاستخدامات المقصودة والنطاق
من الأفضل فهم Federated Core (FC) على أنها بيئة برمجة لتنفيذ العمليات الحسابية الموزعة ، أي الحسابات التي تتضمن أجهزة كمبيوتر متعددة (الهواتف المحمولة والأجهزة اللوحية والأجهزة المضمنة وأجهزة كمبيوتر سطح المكتب وأجهزة الاستشعار وخوادم قاعدة البيانات وما إلى ذلك) والتي قد تؤدي كل منها أداء غير- معالجة تافهة محليًا ، والتواصل عبر الشبكة لتنسيق عملهم.
المصطلح الموزع عام للغاية ، ولا يستهدف TFF جميع الأنواع الممكنة من الخوارزميات الموزعة هناك ، لذلك نفضل استخدام مصطلح الحساب الموحد الأقل عمومية لوصف أنواع الخوارزميات التي يمكن التعبير عنها في هذا الإطار.
أثناء تحديد مصطلح الحساب الموحد بطريقة رسمية بالكامل خارج نطاق هذا المستند ، فكر في أنواع الخوارزميات التي قد تراها معبرة في الكود الكاذب في منشور بحثي يصف خوارزمية التعلم الموزع الجديدة.
الهدف من FC ، باختصار ، هو تمكين تمثيل مضغوط مماثل ، بمستوى تجريد مماثل شبيه بالشفرة الكاذبة ، لمنطق البرنامج الذي ليس رمزًا زائفًا ، ولكنه قابل للتنفيذ في مجموعة متنوعة من البيئات المستهدفة.
السمة الرئيسية المحددة لأنواع الخوارزميات التي تم تصميم FC للتعبير عنها هي أن تصرفات المشاركين في النظام موصوفة بطريقة جماعية. وبالتالي ، فإننا نميل إلى الحديث عن كل جهاز يقوم بتحويل البيانات محليًا ، وأن الأجهزة تنسق العمل بواسطة منسق مركزي يبث أو يجمع أو يجمع نتائجها.
بينما تم تصميم TFF ليكون قادرًا على تجاوز بنيات العميل والخادم البسيطة ، فإن فكرة المعالجة الجماعية أمر أساسي. ويرجع ذلك إلى أصول TFF في التعلم الموحد ، وهي تقنية مصممة في الأصل لدعم العمليات الحسابية على البيانات التي يحتمل أن تكون حساسة والتي تظل تحت سيطرة أجهزة العميل ، والتي قد لا يتم تنزيلها ببساطة إلى موقع مركزي لأسباب تتعلق بالخصوصية. بينما يساهم كل عميل في هذه الأنظمة بالبيانات وقوة المعالجة نحو حساب نتيجة بواسطة النظام (نتيجة نتوقع عمومًا أن تكون ذات قيمة لجميع المشاركين) ، فإننا نسعى أيضًا للحفاظ على خصوصية كل عميل وإخفاء هويته.
وبالتالي ، في حين أن معظم أطر الحوسبة الموزعة مصممة للتعبير عن المعالجة من منظور المشاركين الفرديين - أي على مستوى تبادل الرسائل الفردية من نقطة إلى نقطة ، والترابط بين انتقالات الحالة المحلية للمشارك مع الرسائل الواردة والصادرة ، تم تصميم Federated Core الخاص بـ TFF لوصف سلوك النظام من منظور شامل للنظام العالمي (على غرار ، على سبيل المثال ، MapReduce ).
وبالتالي ، في حين أن الأطر الموزعة للأغراض العامة قد تقدم عمليات مثل الإرسال tff.federated_sum
أو tff.federated_reduce
أو tff.federated_broadcast
التي تغلف بروتوكولات موزعة بسيطة.
لغة
واجهة بايثون
يستخدم TFF لغة داخلية لتمثيل الحسابات الموحدة ، والتي يتم تحديد بناء الجملة من خلال التمثيل القابل للتسلسل في حساب . على الرغم من ذلك ، لن يحتاج مستخدمو FC API بشكل عام إلى التفاعل مع هذه اللغة مباشرة. بدلاً من ذلك ، نحن نقدم Python API (مساحة الاسم tff
) التي تلتف حولها كطريقة لتعريف العمليات الحسابية.
على وجه التحديد ، يوفر TFF أدوات تزيين دالة Python مثل tff.federated_computation
الذي يتتبع أجسام الوظائف المزخرفة ، وينتج تمثيلات متسلسلة لمنطق الحساب الموحد بلغة TFF. تعمل الوظيفة المزينة بـ tff.federated_computation
لمثل هذا التمثيل المتسلسل ، ويمكن تضمينها ككتلة بناء في جسم حساب آخر ، أو تنفيذها عند الطلب عند الاستدعاء.
هذا مثال واحد فقط. يمكن العثور على المزيد من الأمثلة في دروس الخوارزميات المخصصة .
@tff.federated_computation(tff.type_at_clients(tf.float32))
def get_average_temperature(sensor_readings):
return tff.federated_mean(sensor_readings)
سيجد القراء المطلعون على TensorFlow غير المتحمسين هذا النهج مشابهًا لكتابة كود Python الذي يستخدم وظائف مثل tf.add
أو tf.reduce_sum
في قسم من كود Python الذي يحدد مخطط TensorFlow. على الرغم من أن الكود يتم التعبير عنه تقنيًا في Python ، فإن الغرض منه هو إنشاء تمثيل قابل للتسلسل لـ tf.Graph
تحته ، وهو الرسم البياني ، وليس كود Python ، الذي يتم تنفيذه داخليًا بواسطة TensorFlow وقت التشغيل. وبالمثل ، يمكن للمرء أن يفكر في tff.federated_mean
على أنه إدراج مرجع موحد في حساب موحد يمثله get_average_temperature
.
يتعلق جزء من سبب تعريف FC للغة بحقيقة أن الحسابات الفيدرالية ، كما هو مذكور أعلاه ، تحدد السلوكيات الجماعية الموزعة ، وعلى هذا النحو ، فإن منطقها غير محلي. على سبيل المثال ، يوفر TFF المشغلين والمدخلات والمخرجات التي قد توجد في أماكن مختلفة في الشبكة.
هذا يستدعي لغة ونظام كتابة يلتقطان مفهوم التوزيع.
اكتب النظام
تقدم Federated Core الفئات التالية من الأنواع. في وصف هذه الأنواع ، نشير إلى منشئي النوع بالإضافة إلى تقديم تدوين مضغوط ، لأنه طريقة سهلة أو لوصف أنواع الحسابات والمشغلين.
أولاً ، فيما يلي فئات الأنواع المشابهة من الناحية المفاهيمية لتلك الموجودة في اللغات السائدة الحالية:
أنواع الموتر (
tff.TensorType
). تمامًا كما هو الحال فيdtype
، فهذه لها نوعshape
. الاختلاف الوحيد هو أن الكائنات من هذا النوع لا تقتصر علىtf.Tensor
مثيلات التنسور في Python التي تمثل مخرجات عمليات TensorFlow في رسم بياني TensorFlow ، ولكنها قد تتضمن أيضًا وحدات من البيانات التي يمكن إنتاجها ، على سبيل المثال ، كمخرجات موزعة بروتوكول التجميع. وبالتالي ، فإن نوع موتر TFF هو ببساطة نسخة مجردة من التمثيل المادي الملموس لهذا النوع في Python أو TensorFlow.يمكن أن تكون
TensorTypes
الخاصة بـ TFF أكثر صرامة في معالجتها (الثابتة) للأشكال من TensorFlow. على سبيل المثال ، يتعامل نظام الأنواع الخاص بـ TFF مع موتر ذي رتبة غير معروفة على أنه قابل للتخصيص من أي موتر آخر من نفسdtype
، ولكنه غير قابل للتخصيص لأي موتر ذي رتبة ثابتة. يمنع هذا العلاج بعض حالات فشل وقت التشغيل (على سبيل المثال ، محاولة إعادة تشكيل موتر ذي رتبة غير معروفة إلى شكل مع عدد غير صحيح من العناصر) ، على حساب مزيد من الصرامة في الحسابات التي يقبلها TFF على أنها صالحة.التدوين المضغوط لأنواع الموتر هو
dtype
أوdtype[shape]
. على سبيل المثال ،int32
وint32[10]
هما نوعان من الأعداد الصحيحة ومتجهات int ، على التوالي.أنواع التسلسل (
tff.SequenceType
). هذه هي المكافئ المجرد لـ TFF لمفهوم TensorFlow الملموس لـtf.data.Dataset
s. يمكن استهلاك عناصر التسلسل بطريقة متسلسلة ، ويمكن أن تتضمن أنواعًا معقدة.التمثيل المضغوط لأنواع التسلسل هو
T*
، حيثT
هو نوع العناصر. على سبيل المثال يمثلint32*
تسلسل عدد صحيح.أنواع الصفوف المسماة (
tff.StructType
). هذه هي طريقة TFF لتكوين المجموعات والبنى الشبيهة بالقاموس التي تحتوي على عدد محدد مسبقًا من العناصر بأنواع معينة ، مسماة أو غير مسماة. الأهم من ذلك ، أن مفهوم tuple المسمى TFF يشمل المكافئ المجرد لمجموعات Python للحج ، أي مجموعات من العناصر التي تم تسمية بعضها ، ولكن ليس كلها ، وبعضها موضعي.التدوين المضغوط
<n_1=T_1, ..., n_k=T_k>
، حيثn_k
هي أسماء عناصر اختيارية ، وT_k
من أنواع العناصر. على سبيل المثال ،<int32,int32>
int32 ، int32> هو تدوين مضغوط لزوج من الأعداد الصحيحة غير المسماة ، و<X=float32,Y=float32>
هو تدوين مضغوط لزوج من العناصر العائمة المسماةX
وY
والذي قد يمثل نقطة على مستوى . يمكن أن تتداخل المجموعات بالإضافة إلى خلطها مع أنواع أخرى ، على سبيل المثال ،<X=float32,Y=float32>*
تدوينًا مضغوطًا لسلسلة من النقاط.أنواع الوظائف (نوع
tff.FunctionType
). TFF هو إطار عمل برمجة وظيفي ، مع وظائف تعامل كقيم من الدرجة الأولى . تحتوي الدوال على وسيطة واحدة على الأكثر ونتيجة واحدة بالضبط.الترميز المضغوط للوظائف هو
(T -> U)
، حيثT
هو نوع الوسيطة ، وU
هو نوع النتيجة ، أو( -> U)
إذا لم يكن هناك وسيطة (على الرغم من أن الدوال بدون وسيطة هي منحلة مفهوم موجود في الغالب على مستوى Python فقط). على سبيل المثال(int32* -> int32)
هو تدوين لنوع من الوظائف التي تقلل تسلسل عدد صحيح إلى قيمة عدد صحيح واحد.
تتناول الأنواع التالية جانب الأنظمة الموزعة في حسابات TFF. نظرًا لأن هذه المفاهيم فريدة إلى حد ما بالنسبة إلى TFF ، فإننا نشجعك على الرجوع إلى البرنامج التعليمي للخوارزميات المخصصة للحصول على تعليقات وأمثلة إضافية.
نوع التنسيب . لم يتم الكشف عن هذا النوع حتى الآن في واجهة برمجة التطبيقات العامة بخلاف في شكل 2 حرفية
tff.SERVER
وtff.CLIENTS
التي يمكنك اعتبارها ثوابت من هذا النوع. يتم استخدامه داخليًا ، ومع ذلك ، سيتم تقديمه في واجهة برمجة التطبيقات العامة في الإصدارات المستقبلية. التمثيل المضغوط من هذا النوع هوplacement
.يمثل التنسيب مجموعة من المشاركين في النظام الذين يلعبون دورًا معينًا. يستهدف الإصدار الأولي حسابات خادم العميل ، حيث توجد مجموعتان من المشاركين: العملاء والخادم (يمكنك التفكير في الأخير على أنه مجموعة فردية). ومع ذلك ، في البنى الأكثر تفصيلاً ، يمكن أن تكون هناك أدوار أخرى ، مثل المجمعات الوسيطة في نظام متعدد المستويات ، الذين قد يقومون بأداء أنواع مختلفة من التجميع ، أو يستخدمون أنواعًا مختلفة من ضغط / إلغاء ضغط البيانات عن تلك المستخدمة بواسطة الخادم أو الزبائن.
الغرض الأساسي من تحديد مفهوم المواضع هو أساس تعريف الأنواع الموحدة .
الأنواع الموحدة (
tff.FederatedType
). قيمة النوع المتحد هي القيمة التي يتم استضافتها بواسطة مجموعة من المشاركين في النظام المحددة بواسطة موضع معين (مثلtff.SERVER
أوtff.CLIENTS
). يتم تحديد النوع المتحد من خلال قيمة الموضع (وبالتالي ، فهو نوع تابع ) ، ونوع المكونات المكونة للعضو (ما نوع المحتوى الذي يستضيفه كل مشارك محليًا) ، والبت الإضافيall_equal
الذي يحدد ما إذا كان جميع المشاركين محليين استضافة نفس العنصر.التدوين المضغوط لنوع القيم المتحد الذي يتضمن العناصر (مكونات الأعضاء) من النوع
T
، كل منها مستضاف بواسطة المجموعة (الموضع)G
هوT@G
أو{T}@G
مع مجموعة بتall_equal
أو لم يتم تعيينها ، على التوالي.فمثلا:
{int32}@CLIENTS
يمثل قيمة موحدة تتكون من مجموعة من الأعداد الصحيحة المميزة المحتملة ، واحد لكل جهاز عميل. لاحظ أننا نتحدث عن قيمة موحدة واحدة تشمل عناصر متعددة من البيانات التي تظهر في مواقع متعددة عبر الشبكة. تتمثل إحدى طرق التفكير في الأمر في أنه نوع من الموتر مع بُعد "شبكة" ، على الرغم من أن هذا القياس ليس مثاليًا لأن TFF لا يسمح بالوصول العشوائي إلى مكونات الأعضاء ذات القيمة الموحدة.{<X=float32,Y=float32>*}@CLIENTS
مجموعة بيانات موحدة ، وهي قيمة تتكون من تسلسلات متعددة لإحداثياتXY
، تسلسل واحد لكل جهاز عميل.<weights=float32[10,5],bias=float32[5]>@SERVER
مجموعة مسماة من الوزن وموترات التحيز في الخادم. نظرًا لأننا أسقطنا الأقواس المتعرجة ، فهذا يشير إلى تعيين بتall_equal
، على سبيل المثال ، هناك مجموعة واحدة فقط (بغض النظر عن عدد النسخ المتماثلة للخادم التي قد تكون موجودة في مجموعة تستضيف هذه القيمة).
اللبنات
لغة Federated Core هي شكل من أشكال حساب لامدا ، مع بعض العناصر الإضافية.
يوفر تجريدات البرمجة التالية المعروضة حاليًا في واجهة برمجة التطبيقات العامة:
حسابات TensorFlow (
tff.tf_computation
). هذه أقسام من كود TensorFlow ملفوفة كمكونات قابلة لإعادة الاستخدام في TFF باستخدامtff.tf_computation
decorator. لديهم دائمًا أنواع وظيفية ، وعلى عكس الوظائف في TensorFlow ، يمكنهم أخذ معلمات منظمة أو إرجاع نتائج منظمة لنوع التسلسل.إليك مثال واحد ، حساب TF من النوع
(int32* -> int)
يستخدم عامل التشغيلtf.data.Dataset.reduce
لحساب مجموع الأعداد الصحيحة:@tff.tf_computation(tff.SequenceType(tf.int32)) def add_up_integers(x): return x.reduce(np.int32(0), lambda x, y: x + y)
الجوهر أو المشغلين الفيدراليين ( tff.federated
tff.federated_...
). هذه مكتبة من الوظائف مثلtff.federated_sum
أوtff.federated_broadcast
التي تشكل الجزء الأكبر من واجهة برمجة تطبيقات FC ، والتي يمثل معظمها مشغلي الاتصالات الموزعين للاستخدام مع TFF.نشير إلى هذه على أنها جوهرية لأنها ، إلى حد ما مثل الوظائف الجوهرية ، هي مجموعة مفتوحة النهاية وقابلة للتوسيع من المشغلين التي يفهمها TFF ، ويتم تجميعها في رمز المستوى الأدنى.
تحتوي معظم هذه المشغلات على معلمات ونتائج من الأنواع الموحدة ، ومعظمها عبارة عن قوالب يمكن تطبيقها على أنواع مختلفة من البيانات.
على سبيل المثال ، يمكن اعتبار
tff.federated_broadcast
من النوع الوظيفيT@SERVER -> T@CLIENTS
.تعبيرات لامدا (
tff.federated_computation
). تعبير lambda في TFF يعادلlambda
أوdef
في Python ؛ يتكون من اسم المعلمة ، والجسم (التعبير) الذي يحتوي على مراجع لهذه المعلمة.في كود Python ، يمكن إنشاء هذه عن طريق تزيين وظائف Python بـ
tff.federated_computation
وتحديد وسيطة.فيما يلي مثال على تعبير لامدا ذكرناه سابقًا:
@tff.federated_computation(tff.type_at_clients(tf.float32)) def get_average_temperature(sensor_readings): return tff.federated_mean(sensor_readings)
التنسيب الحرفية . في الوقت الحالي ، فقط
tff.SERVER
وtff.CLIENTS
للسماح بتعريف حسابات خادم العميل البسيطة.استدعاءات الوظيفة (
__call__
). يمكن استدعاء أي شيء له نوع وظيفي باستخدام صيغة Python القياسية__call__
. الاستدعاء هو تعبير ، ونوعه هو نفس نوع نتيجة الوظيفة التي يتم استدعاؤها.فمثلا:
add_up_integers(x)
استدعاءً لحساب TensorFlow المحدد مسبقًا في الوسيطةx
. نوع هذا التعبير هوint32
.tff.federated_mean(sensor_readings)
استدعاءًا لمشغل المتوسط المتحد علىsensor_readings
. نوع هذا التعبير هوfloat32@SERVER
(بافتراض السياق من المثال أعلاه).
تشكيل المجموعات واختيار عناصرها. تعبيرات بايثون بالصيغة
[x, y]
،x[y]
، أوxy
التي تظهر في أجسام الوظائف المزينة بـtff.federated_computation
.